Skip to content

Instantly share code, notes, and snippets.

@tpokorra
Last active October 3, 2018 03:17

Revisions

  1. Timotheus Pokorra revised this gist Oct 3, 2018. 1 changed file with 6 additions and 6 deletions.
    12 changes: 6 additions & 6 deletions profile_db_generator.rb
    Original file line number Diff line number Diff line change
    @@ -78,8 +78,8 @@ def create_admin(seq)
    unbundled_require 'gabbler'
    end

    puts "Creating 100 users"
    users = 100.times.map do |i|
    puts "Creating 10 users"
    users = 10.times.map do |i|
    putc "."
    create_admin(i)
    end
    @@ -92,18 +92,18 @@ def create_admin(seq)
    end

    puts
    puts "Creating 100 topics"
    puts "Creating 50 topics"

    topic_ids = 100.times.map do
    topic_ids = 50.times.map do
    post = PostCreator.create(users.sample, raw: sentence, title: sentence[0..50].strip, category: categories.sample.name, skip_validations: true)

    putc "."
    post.topic_id
    end

    puts
    puts "creating 2000 replies"
    2000.times do
    puts "creating 200 replies"
    200.times do
    putc "."
    PostCreator.create(users.sample, raw: sentence, topic_id: topic_ids.sample, skip_validations: true)
    end
  2. Timotheus Pokorra revised this gist Oct 3, 2018. 1 changed file with 3 additions and 2 deletions.
    5 changes: 3 additions & 2 deletions profile_db_generator.rb
    Original file line number Diff line number Diff line change
    @@ -57,13 +57,14 @@ def create_admin(seq)

    SiteSetting.queue_jobs = false

    unless Rails.env == "profile"
    unless Rails.env == "production"
    puts "This script should only be used in the profile environment"
    exit
    end

    # by default, Discourse has a "system" and `discobot` account
    if User.count > 2
    # and in my setup I have an admin account configured
    if User.count > 3
    puts "Only run this script against an empty DB"
    exit
    end
  3. Timotheus Pokorra created this gist Oct 3, 2018.
    112 changes: 112 additions & 0 deletions profile_db_generator.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,112 @@
    # can be used to generate a mock db for profiling purposes

    # we want our script to generate a consistent output, to do so
    # we monkey patch array sample so it always uses the same rng
    class Array
    RNG = Random.new(1098109928029800)

    def sample
    self[RNG.rand(size)]
    end
    end

    # based on https://gist.github.com/zaius/2643079
    def unbundled_require(gem)
    if defined?(::Bundler)
    spec_path = Dir.glob("#{Gem.dir}/specifications/#{gem}-*.gemspec").last
    if spec_path.nil?
    raise LoadError
    end

    spec = Gem::Specification.load spec_path
    spec.activate
    end

    begin
    require gem
    end
    end

    def sentence
    @gabbler ||= Gabbler.new.tap do |gabbler|
    story = File.read(File.dirname(__FILE__) + "/alice.txt")
    gabbler.learn(story)
    end

    sentence = ""
    until sentence.length > 800 do
    sentence << @gabbler.sentence
    sentence << "\n"
    end
    sentence
    end

    def create_admin(seq)
    User.new.tap { |admin|
    admin.email = "admin@localhost#{seq}.fake"
    admin.username = "admin#{seq}"
    admin.password = "password12345abc"
    admin.save!
    admin.grant_admin!
    admin.change_trust_level!(TrustLevel[4])
    admin.activate
    }
    end

    require File.expand_path(File.dirname(__FILE__) + "/../config/environment")

    SiteSetting.queue_jobs = false

    unless Rails.env == "profile"
    puts "This script should only be used in the profile environment"
    exit
    end

    # by default, Discourse has a "system" and `discobot` account
    if User.count > 2
    puts "Only run this script against an empty DB"
    exit
    end

    require 'optparse'
    begin
    unbundled_require 'gabbler'
    rescue LoadError
    puts "installing gabbler gem"
    puts `gem install gabbler`
    unbundled_require 'gabbler'
    end

    puts "Creating 100 users"
    users = 100.times.map do |i|
    putc "."
    create_admin(i)
    end

    puts
    puts "Creating 10 categories"
    categories = 10.times.map do |i|
    putc "."
    Category.create(name: "category#{i}", text_color: "ffffff", color: "000000", user: users.first)
    end

    puts
    puts "Creating 100 topics"

    topic_ids = 100.times.map do
    post = PostCreator.create(users.sample, raw: sentence, title: sentence[0..50].strip, category: categories.sample.name, skip_validations: true)

    putc "."
    post.topic_id
    end

    puts
    puts "creating 2000 replies"
    2000.times do
    putc "."
    PostCreator.create(users.sample, raw: sentence, topic_id: topic_ids.sample, skip_validations: true)
    end

    # no sidekiq so update some stuff
    Category.update_stats
    Jobs::PeriodicalUpdates.new.execute(nil)