mirror of
https://github.com/discourse/discourse.git
synced 2024-11-30 08:34:39 +08:00
262 lines
6.4 KiB
Ruby
262 lines
6.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Generates posts and topics
|
|
class Populate < Thor
|
|
desc "posts", "Generate posts"
|
|
long_desc <<-MD
|
|
Create topics with any number of posts, or add posts to an existing topic.
|
|
|
|
Examples:
|
|
|
|
Create a new topic with 100 posts from batman and spiderman:
|
|
|
|
> $ thor populate:posts -n 100 -u batman spiderman -t "So many posts"
|
|
|
|
Add 10 posts to topic with id 123:
|
|
|
|
> $ thor populate:posts -n 10 -u batman spiderman -i 123
|
|
|
|
Generate 10 topics with 5 posts:
|
|
|
|
> $ thor populate:posts -p 10 -n 5
|
|
|
|
MD
|
|
method_option :num_posts,
|
|
aliases: "-n",
|
|
type: :numeric,
|
|
required: true,
|
|
desc: "Number of posts to make"
|
|
method_option :users,
|
|
aliases: "-u",
|
|
type: :array,
|
|
desc: "Usernames of users who will make the posts"
|
|
method_option :title, aliases: "-t", desc: "The title of the topic, if making a new topic"
|
|
method_option :topic_id,
|
|
aliases: "-i",
|
|
type: :numeric,
|
|
desc: "The id of the topic where the posts will be added"
|
|
method_option :num_topics,
|
|
aliases: "-p",
|
|
type: :numeric,
|
|
default: 1,
|
|
desc: "Number of topics to create"
|
|
|
|
def posts
|
|
require "./config/environment"
|
|
users = []
|
|
if options[:users]
|
|
options[:users].each do |u|
|
|
provided_user = User.find_by_username(u.downcase)
|
|
puts "No user found: #{provided_user}" if provided_user.nil?
|
|
users << provided_user if provided_user
|
|
end
|
|
else
|
|
10.times do
|
|
user = create_user(generate_email)
|
|
users << user
|
|
end
|
|
end
|
|
RateLimiter.disable
|
|
options[:num_topics].times do
|
|
topic = Topic.find_by(id: options[:topic_id])
|
|
start_post = 1
|
|
topic = create_topic(users) unless topic
|
|
puts "Adding posts to '#{topic.title}'"
|
|
puts "Making #{options[:num_posts]} posts"
|
|
(start_post..options[:num_posts]).each { create_post(users, topic) }
|
|
puts ""
|
|
puts "Done. Topic id = #{topic.id}"
|
|
end
|
|
ensure
|
|
RateLimiter.enable
|
|
end
|
|
|
|
private
|
|
|
|
def create_user(user_email)
|
|
user = User.find_by_email(user_email)
|
|
unless user
|
|
puts "Creating new account: #{user_email}"
|
|
user =
|
|
User.create!(
|
|
email: user_email,
|
|
password: SecureRandom.hex,
|
|
username: UserNameSuggester.suggest(user_email),
|
|
)
|
|
end
|
|
user.active = true
|
|
user.save!
|
|
user
|
|
end
|
|
|
|
def create_topic(users)
|
|
topic_title = options[:title] || generate_sentence(5)
|
|
puts "Making a new topic: '#{topic_title}'"
|
|
post_creator = PostCreator.new(users.sample, title: topic_title, raw: generate_sentence(7))
|
|
first_post = post_creator.create
|
|
unless first_post
|
|
puts post_creator.errors.full_messages, ""
|
|
raise StandardError.new(post_creator.errors.full_messages)
|
|
end
|
|
topic = first_post.topic
|
|
start_post = 2
|
|
topic
|
|
end
|
|
|
|
def create_post(users, topic)
|
|
print "."
|
|
raw =
|
|
(
|
|
if rand(4) == 0
|
|
(rand(2) == 0 ? image_posts.sample : wikipedia_posts.sample)
|
|
else
|
|
generate_sentence(7)
|
|
end
|
|
)
|
|
post_creator = PostCreator.new(users.sample, topic_id: topic.id, raw: raw)
|
|
post = post_creator.create
|
|
puts post_creator.errors.full_messages, "" unless post
|
|
post
|
|
end
|
|
|
|
def hipster_words
|
|
@hipster_words ||= [
|
|
"etsy",
|
|
"twee",
|
|
"hoodie",
|
|
"Banksy",
|
|
"retro",
|
|
"synth",
|
|
"single-origin",
|
|
"coffee",
|
|
"art",
|
|
"party",
|
|
"cliche",
|
|
"artisan",
|
|
"Williamsburg",
|
|
"squid",
|
|
"helvetica",
|
|
"keytar",
|
|
"American Apparel",
|
|
"craft beer",
|
|
"food truck",
|
|
"you probably haven't heard of them",
|
|
"cardigan",
|
|
"aesthetic",
|
|
"raw denim",
|
|
"sartorial",
|
|
"gentrify",
|
|
"lomo",
|
|
"Vice",
|
|
"Pitchfork",
|
|
"Austin",
|
|
"sustainable",
|
|
"salvia",
|
|
"organic",
|
|
"thundercats",
|
|
"PBR",
|
|
"iPhone",
|
|
"lo-fi",
|
|
"skateboard",
|
|
"jean shorts",
|
|
"next level",
|
|
"beard",
|
|
"tattooed",
|
|
"trust fund",
|
|
"Four Loko",
|
|
"master cleanse",
|
|
"ethical",
|
|
"high life",
|
|
"wolf moon",
|
|
"fanny pack",
|
|
"Terry Richardson",
|
|
"8-bit",
|
|
"Carles",
|
|
"Shoreditch",
|
|
"seitan",
|
|
"freegan",
|
|
"keffiyeh",
|
|
"biodiesel",
|
|
"quinoa",
|
|
"farm-to-table",
|
|
"fixie",
|
|
"viral",
|
|
"chambray",
|
|
"scenester",
|
|
"leggings",
|
|
"readymade",
|
|
"Brooklyn",
|
|
"Wayfarers",
|
|
"Marfa",
|
|
"put a bird on it",
|
|
"dreamcatcher",
|
|
"photo booth",
|
|
"tofu",
|
|
"mlkshk",
|
|
"vegan",
|
|
"vinyl",
|
|
"DIY",
|
|
"banh mi",
|
|
"bicycle rights",
|
|
"before they sold out",
|
|
"gluten-free",
|
|
"yr butcher blog",
|
|
"whatever",
|
|
"+1",
|
|
"Cosby Sweater",
|
|
"VHS",
|
|
"messenger bag",
|
|
"cred",
|
|
"locavore",
|
|
"mustache",
|
|
"tumblr",
|
|
"Portland",
|
|
"mixtape",
|
|
"fap",
|
|
"letterpress",
|
|
"McSweeney's",
|
|
"stumptown",
|
|
"brunch",
|
|
"Wes Anderson",
|
|
"irony",
|
|
"echo park",
|
|
]
|
|
end
|
|
|
|
def generate_sentence(num_words)
|
|
sentence = hipster_words.sample(num_words).join(" ").capitalize + "."
|
|
sentence.force_encoding("UTF-8")
|
|
end
|
|
|
|
def generate_email
|
|
email = hipster_words.sample.delete(" ") + "@" + hipster_words.sample.delete(" ") + ".com"
|
|
email.delete("'").force_encoding("UTF-8")
|
|
end
|
|
|
|
def image_posts
|
|
@image_posts ||= [
|
|
"http://i.imgur.com/CnRF48R.jpg\n\n",
|
|
"http://i.imgur.com/2iaeK.png\n\n",
|
|
"http://i.imgur.com/WSD5t61.jpg\n\n",
|
|
"http://i.imgur.com/GUldmUd.jpg\n\n",
|
|
"http://i.imgur.com/nJnb6Bj.jpg\n\n",
|
|
"http://i.imgur.com/eljDYjm.jpg\n\n",
|
|
"http://i.imgur.com/5yZMWyY.png\n\n",
|
|
"http://i.imgur.com/2iCPGm2.jpg\n\n",
|
|
]
|
|
end
|
|
|
|
def wikipedia_posts
|
|
@wikipedia_posts ||= [
|
|
"http://en.wikipedia.org/wiki/Dwarf_fortress\n\n",
|
|
"http://en.wikipedia.org/wiki/Action_plan\n\n",
|
|
"http://en.wikipedia.org/wiki/Chang%27e_3\n\n",
|
|
"http://en.wikipedia.org/wiki/Carl_sagan\n\n",
|
|
"http://en.wikipedia.org/wiki/Chasmosaurus\n\n",
|
|
"http://en.wikipedia.org/wiki/Indian_Space_Research_Organisation\n\n",
|
|
"http://en.wikipedia.org/wiki/Rockstar_Consortium\n\n",
|
|
"http://en.wikipedia.org/wiki/Manitoulin_island\n\n",
|
|
]
|
|
end
|
|
end
|