namespace :forge do
%w{admin super_admin contributor}.each do |role|
desc "Create #{role.humanize} user (#{role}@factore.ca/#{role}) (Or pass it PASSWORD=)"
task("create_#{role}".to_sym => :environment) do
password = ENV['PASSWORD'].blank? ? role : ENV['PASSWORD']
user = User.new(:password => password, :password_confirmation => password, :email => "#{role}@factore.ca")
user.approved = true
user.roles << Role.find_or_create_by_title(role.humanize.titleize)
if user.save
puts "#{role.humanize.titleize} user created with username: #{user.email}, password: #{password}"
else
puts "#{role.humanize.titleize} user not saved because #{user.errors.full_messages.to_sentence}. Make sure your database is set up correctly."
end
end
end
desc "Load help files"
task(:load_help => :environment ) do
Dir.chdir("db/help") do
Dir.foreach(".") do |entry|
status, ht_values = parse_help_file(entry)
# if the status is anything other than "published", ignore it
if status == "published"
if ht_values[:slugs] =~ /,/
slugs = ht_values[:slugs].split(', ')
else
slugs = [ht_values[:slugs]]
end
slugs.each do |slug|
if ht = HelpTopic.where(:language => ht_values[:language], :slug => slug).first
ht.title = ht_values[:title]
ht.content = ht_values[:content]
else
ht = HelpTopic.new
ht_values[:slug] = slug
ht_values.reject {|k, v| k == :slugs}.each { |key, value| ht.send((key.to_s + '=').to_sym, value) }
end
if ht.save
puts "Help Topic #{slug} was saved"
else
puts "ERROR: Help Topic with slug #{slug} could not be saved because #{ht.errors.full_messages.to_sentence}"
end
end
else
"Skipping #{entry} because it isn't published."
end
end
end
end
desc "Destroy help files"
task(:destroy_help => :environment) do
HelpTopic.all.each do |topic|
topic.destroy
end
puts "All Help Topics have been destroyed"
end
desc "Create Fake Dispatch"
task(:create_fake_dispatch => :environment) do
require 'ipaddr'
date1, date2 = Time.now - 1.month, Time.now
opened = lambda { Time.at((date2.to_f - date1.to_f)*rand + date1.to_f) }
dispatch = Dispatch.create!(:subject => "Fake Dispatch for Testing", :content => "It has links and also some spots that aren't links.factore.ca", :sent_at => date1)
3235.times { Subscriber.create(:name => Faker::Name.name, :email => Faker::Internet.free_email) }
Subscriber.all.each { |s| QueuedDispatch.create(:dispatch_id => dispatch.id, :subscriber_id => s.id, :sent_at => date1)}
# Opens, clicks, unsubscribes
Subscriber.limit(2303).each { |s| DispatchOpen.create(:dispatch_id => dispatch.id, :email => s.email, :created_at => opened.call, :ip => IPAddr.new(rand(2**32),Socket::AF_INET).to_s) }
948.times { DispatchLinkClick.create(:dispatch_link_id => DispatchLink.order("RAND()").first.id, :ip => IPAddr.new(rand(2**32),Socket::AF_INET).to_s, :created_at => opened.call) }
126.times { DispatchUnsubscribe.create(:dispatch_id => dispatch.id, :email => Subscriber.order("RAND()").first.email, :created_at => opened.call) }
end
desc "Set up Development Database"
task(:setup_database) do
db_file = File.join(Rails.root, 'config', 'database.yml')
raise 'database.yml exists!' if File.exist?(db_file)
# Build and write database.yml
config_string = File.read(File.join(Rails.root, 'config', 'database.yml.template'))
app_name = Rails.root.to_s.split("/").last
config_string.gsub!(/(_production|_development|_test)/) { |w| "#{app_name}#{w}" }
config_string.gsub!('username: ', "username: #{ENV['USERNAME']}") unless ENV['USERNAME'].blank?
config_string.gsub!('password: ', "password: #{ENV['PASSWORD']}") unless ENV['PASSWORD'].blank?
config_string.gsub!(" socket: \n", (ENV['SOCKET'].blank? ? "" : " socket: #{ENV['SOCKET']}\n"))
f = File.open(File.join(db_file), 'w')
f.puts config_string
f.close
# Create and migrate the databases
unless ENV['USERNAME'].blank?
# system("rake db:create; rake db:migrate; rake db:test:prepare; rake db:seed")
# use forge:deploy rather than db:seed, since that seeds the database and adds some default settings
system("rake db:create; rake db:migrate; rake db:test:prepare; rake forge:deploy")
puts "Created database.yml, created databases, migrated, seeded."
end
end
def parse_help_file(entry)
status, title, content, language, slugs = "", "", "", "", ""
if entry.split(".").last == "help" && File.file?(entry)
File.open(entry) do |file|
# first few lines are in yml format:
# key: value
# so, need to read line, split it on : and trim both sides
# eventually, you come to a line with a number of asterixes
# when that happens, ignore that line, but load the rest of the file in as :content
parse_as = :yaml
file.each_line do |line|
if line[0..4] == "*****"
parse_as = :markdown
else
case parse_as
when :yaml
eval "#{line.split(":")[0].strip} = '#{line.split(":")[1].strip}'"
when :markdown
content += line
end
end
end
end
end
return status.downcase, {:title => title, :content => content, :slugs => slugs, :language => language}
end
desc "Deploy a new Forge-based site"
task :deploy => :environment do
# eCommerce
# db defaults from _gunk/sitemap.yml
Rake::Task["db:seed"].invoke
# by default, use flat rate shipping
MySettings.flat_rate_shipping = true
end
desc "Expire cache"
task :expire_cache => :environment do
ActionController::Base.new.trash_cache
puts "Expired Page Cache"
end
desc "Get updates from Zencoder"
task :encode_notify => :environment do
system "zencoder_fetcher -u http://localhost:3000/forge/videos/encode_notify #{Forge.config.videos.zencoder_api_key}"
end
desc "Generate a static secret token"
task :secret => :environment do
require 'securerandom'
token = SecureRandom.hex(256)
Rails.root.join("config", "secret_token.txt").open("w") do |f|
f.write(token)
end
end
end