happy_seed 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/bin/happy_seed_plugin +14 -0
  3. data/happy_seed.rb +1 -1
  4. data/lib/generators/happy_seed/admin/admin_generator.rb +23 -1
  5. data/lib/generators/happy_seed/admin/templates/app/admin/campaigns.rb +36 -0
  6. data/lib/generators/happy_seed/admin/templates/app/admin/dashboard.rb +54 -0
  7. data/lib/generators/happy_seed/admin/templates/app/admin/newsletter.rb +48 -0
  8. data/lib/generators/happy_seed/admin/templates/app/controllers/admin/stats_controller.rb +15 -0
  9. data/lib/generators/happy_seed/admin/templates/app/views/admin/_chart.html.haml +5 -0
  10. data/lib/generators/happy_seed/admin/templates/docs/README.07.admin.rdoc +3 -0
  11. data/lib/generators/happy_seed/admin/templates/spec/controllers/admin/stats_controller_spec.rb +40 -0
  12. data/lib/generators/happy_seed/admin/templates/spec/factories/admin_users.rb +7 -0
  13. data/lib/generators/happy_seed/admin/templates/vendor/assets/javascripts/chartkick.js +830 -0
  14. data/lib/generators/happy_seed/{foreman/foreman_generator.rb → base/base_generator.rb} +15 -1
  15. data/lib/generators/happy_seed/{foreman → base}/templates/.env +0 -0
  16. data/lib/generators/happy_seed/{foreman → base}/templates/.foreman +0 -0
  17. data/lib/generators/happy_seed/{foreman → base}/templates/Procfile +0 -0
  18. data/lib/generators/happy_seed/{foreman → base}/templates/app/controllers/setup_controller.rb +0 -0
  19. data/lib/generators/happy_seed/{foreman → base}/templates/app/views/setup/index.html.haml +0 -0
  20. data/lib/generators/happy_seed/{foreman → base}/templates/application_controller.rb +0 -0
  21. data/lib/generators/happy_seed/{foreman → base}/templates/config/unicorn.rb +0 -0
  22. data/lib/generators/happy_seed/base/templates/docs/README.00.base.rdoc +43 -0
  23. data/lib/generators/happy_seed/{foreman → base}/templates/spec/controllers/application_controller_spec.rb +0 -0
  24. data/lib/generators/happy_seed/{foreman → base}/templates/spec/controllers/setup_controller_spec.rb +0 -0
  25. data/lib/generators/happy_seed/bootstrap/templates/app/views/application/_footer.html.haml +7 -6
  26. data/lib/generators/happy_seed/bootstrap/templates/docs/README.01.bootstrap.rdoc +6 -0
  27. data/lib/generators/happy_seed/devise/devise_generator.rb +3 -0
  28. data/lib/generators/happy_seed/devise/templates/docs/README.03.devise.rdoc +5 -3
  29. data/lib/generators/happy_seed/devise/templates/spec/factories/users.rb +15 -0
  30. data/lib/generators/happy_seed/facebook/templates/docs/README.06.facebook.rdoc +4 -0
  31. data/lib/generators/happy_seed/omniauth/omniauth_generator.rb +1 -0
  32. data/lib/generators/happy_seed/omniauth/templates/docs/README.04.omniauth.rdoc +9 -5
  33. data/lib/generators/happy_seed/plugin/plugin_generator.rb +32 -0
  34. data/lib/generators/happy_seed/plugin/templates/.autotest +7 -0
  35. data/lib/generators/happy_seed/plugin/templates/.rspec +3 -0
  36. data/lib/generators/happy_seed/plugin/templates/Rakefile +25 -0
  37. data/lib/generators/happy_seed/plugin/templates/gemspec +8 -0
  38. data/lib/generators/happy_seed/plugin/templates/spec/rails_helper.rb +43 -0
  39. data/lib/generators/happy_seed/plugin/templates/spec/spec_helper.rb +20 -0
  40. data/lib/generators/happy_seed/splash/templates/app/assets/stylesheets/splash.css.scss +4 -74
  41. data/lib/generators/happy_seed/splash/templates/app/views/layouts/splash.html.haml +6 -5
  42. data/lib/generators/happy_seed/splash/templates/app/views/splash/index.html.haml +66 -178
  43. data/lib/generators/happy_seed/splash/templates/docs/README.02.splash.rdoc +6 -4
  44. data/lib/generators/happy_seed/twitter/templates/docs/README.05.twitter.rdoc +3 -1
  45. data/lib/happy_seed/version.rb +1 -1
  46. data/test/dummy/db/test.sqlite3 +0 -0
  47. data/test/dummy/log/test.log +5 -0
  48. metadata +35 -13
  49. data/lib/generators/happy_seed/foreman/templates/docs/README.00.base.rdoc +0 -34
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: abfbe568c635b764f4d827088805d64a6b9fa441
4
- data.tar.gz: ff15a8f6302a0d8f27750b7561c20eb1d2f9bb6d
3
+ metadata.gz: 06bd0e21a25b074638ecba10e48852884e1c321d
4
+ data.tar.gz: 9c0399877461aa4b0d1747ff580aa1e8f25c1c87
5
5
  SHA512:
6
- metadata.gz: 9df1a0df197a4c01de8e6886043adae0f62a48638818377d86895e439c526c6e8d0d61a75c97b7cf35d81bcbf2a79e0a47dfb433e7c86e20a468aa7d5cee4c40
7
- data.tar.gz: 6e9a2d0e0746702b91b5bf1cdb01f0ef1728d932d5eb0bd9ade9a4fb74d2767708791db21301bf3a43c9cb07abd30949d220be6f89e8b2c156e456af4a1398ff
6
+ metadata.gz: 00cf03d8c8a5d214ecd1b59d0cca9eb922c1807b780e5a902c23d5b63981447b09c1f67f9bd51c4b8dffa049210390602bd2b0bffc5ed21f0cdb99dd203f41bb
7
+ data.tar.gz: b469fbd90c137ae52d094ce1ef84608608d995fed9ee877ea14705065dccb6750d6fd716a8736ef013a980ad3bf891782d5a3c781243a4c54b19151717ec67fd
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby -wU
2
+
3
+ spec = Gem::Specification.find_by_name("happy_seed")
4
+ gem_root = spec.gem_dir
5
+
6
+ file = File.join( ENV['SEED_DEVELOPMENT'] || gem_root, "lib/generators/happy_seed/plugin/plugin_generator.rb" )
7
+
8
+ # app_name = ARGV.shift
9
+
10
+ puts "Generating new plugin"
11
+
12
+ require file
13
+
14
+ HappySeed::Generators::PluginGenerator.start
data/happy_seed.rb CHANGED
@@ -37,7 +37,7 @@ gsub_file ".rspec", "--warnings\n", ""
37
37
  append_to_file ".rspec", "--format documentation\n"
38
38
 
39
39
  # Run the base generator
40
- generate "happy_seed:foreman"
40
+ generate "happy_seed:base"
41
41
 
42
42
  all_in = false
43
43
  all_in = true if yes? "Would you like to install everything?"
@@ -4,15 +4,37 @@ module HappySeed
4
4
  source_root File.expand_path('../templates', __FILE__)
5
5
 
6
6
  def install_landing_page
7
+ gem 'devise'
7
8
  gem 'activeadmin', github: 'gregbell/active_admin'
9
+ gem 'dateslices'
8
10
 
9
11
  Bundler.with_clean_env do
10
12
  run "bundle install"
11
13
  end
12
14
 
13
15
  generate 'active_admin:install'
14
- generate 'active_admin:resource User'
16
+
17
+ remove_file "app/admin/dashboard.rb"
18
+ remove_file "spec/factories/admin_users.rb"
19
+
20
+ directory 'app'
15
21
  directory "docs"
22
+ directory "spec"
23
+ directory "vendor"
24
+
25
+ insert_into_file "config/initializers/active_admin.rb", " config.register_javascript '//www.google.com/jsapi'\n config.register_javascript 'chartkick.js'\n", :after => "To load a javascript file:\n"
26
+ append_to_file "config/initializers/assets.rb", "\nRails.application.config.assets.precompile += %w( chartkick.js )\n"
27
+
28
+ route <<-'ROUTE'
29
+ namespace :admin do
30
+ # get "/stats" => "stats#stats"
31
+ devise_scope :admin_user do
32
+ get '/stats/:scope' => "stats#stats", as: :admin_stats
33
+ end
34
+ end
35
+ ROUTE
36
+
37
+
16
38
  end
17
39
 
18
40
  private
@@ -0,0 +1,36 @@
1
+ if ENV['MAILCHIMP_API_KEY']
2
+ ActiveAdmin.register_page "Campaigns" do
3
+ menu parent: "Newsletter"
4
+
5
+ content do
6
+ @c = {}
7
+ if params[:list_id]
8
+ @c = Gibbon::API.new.campaigns.list( :filters => { :list_id => params[:list_id] } )
9
+ elsif params[:campaign_id]
10
+ @c = Gibbon::API.new.campaigns.list( :filters => { :campaign_id => params[:campaign_id] } )
11
+ else
12
+ @c = Gibbon::API.new.campaigns.list
13
+ end
14
+
15
+ data = @c['data'].each do |d|
16
+ d['summary'] = {} if d['summary'].is_a? Array
17
+ end
18
+ table_for data do #.sort { |a,b| a['send_time'] <=> b['send_time'] } do
19
+ column( "list_id" ) { |d| d['list_id']}
20
+ column( "title" ) { |d| d['title'] }
21
+ column( "created" ) { |d| d['create_time'] }
22
+ column( "sent" ) { |d| d['send_time'] }
23
+ column( "subject" ) { |d| d['subject'] }
24
+ column( "emails sent") { |d| d['emails_sent'] }
25
+ column( "opens" ) { |d| d['summary']['opens'] }
26
+ column( "clicks" ) { |d| d['summary']['clicks'] }
27
+ column( "UUser Clicks" ) { |d| d['summary']['users_who_clicked'] }
28
+ column( "last click" ) { |d| d['summary']['last_click'] }
29
+ end
30
+ end
31
+
32
+ action_item do
33
+ link_to "Go to Mailchimp", "https://login.mailchimp.com/"
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,54 @@
1
+ ActiveAdmin.register_page "Dashboard" do
2
+
3
+ menu priority: 1, label: proc{ I18n.t("active_admin.dashboard") }
4
+
5
+ content title: proc{ I18n.t("active_admin.dashboard") } do
6
+ columns do
7
+ column do
8
+ panel "Users" do
9
+ render partial: "admin/chart", locals: { scope: 'users' }
10
+ end
11
+ end
12
+ end
13
+
14
+ columns do
15
+ column do
16
+ panel "Twitter" do
17
+ render partial: "admin/chart", locals: { scope: 'instagram_users' }
18
+ end
19
+ end
20
+ column do
21
+ panel "Instagram" do
22
+ render partial: "admin/chart", locals: { scope: 'twitter_users' }
23
+ end
24
+ end
25
+ end
26
+ end
27
+ # div class: "blank_slate_container", id: "dashboard_default_message" do
28
+ # span class: "blank_slate" do
29
+ # span I18n.t("active_admin.dashboard_welcome.welcome")
30
+ # small I18n.t("active_admin.dashboard_welcome.call_to_action")
31
+ # end
32
+ # end
33
+
34
+ # Here is an example of a simple dashboard with columns and panels.
35
+ #
36
+ # columns do
37
+ # column do
38
+ # panel "Recent Posts" do
39
+ # ul do
40
+ # Post.recent(5).map do |post|
41
+ # li link_to(post.title, admin_post_path(post))
42
+ # end
43
+ # end
44
+ # end
45
+ # end
46
+
47
+ # column do
48
+ # panel "Info" do
49
+ # para "Welcome to ActiveAdmin."
50
+ # end
51
+ # end
52
+ # end
53
+ # end # content
54
+ end
@@ -0,0 +1,48 @@
1
+ if ENV['MAILCHIMP_API_KEY']
2
+ ActiveAdmin.register_page "Newsletter" do
3
+ content do
4
+ if !params[:list_id]
5
+ @lists = Gibbon::API.new.lists.list
6
+
7
+ panel "MailChimp Lists" do
8
+ table_for @lists['data'] do
9
+ column( "name" ) { |d| d['name'] }
10
+ column( "members" ) { |d| d['stats']['member_count'] }
11
+ column( "unsubscribe_count") { |d| d["stats"]["unsubscribe_count"] }
12
+ column( "new members") { |d| d["stats"]["member_count_since_send"] }
13
+ column( "campaigns") do |d|
14
+ link_to "View #{d["stats"]["campaign_count"]} Campaigns", admin_campaigns_path( :list_id => d['id'] )
15
+ end
16
+ column( "open_rate") { |d| sprintf "%.2f%", d["stats"]["open_rate"] }
17
+ column( "click_rate") { |d| sprintf "%.2f%", d["stats"]["click_rate"] }
18
+ column( "created" ) { |d| d['date_created'] }
19
+ # column( "action" ) do |d|
20
+ # link_to "Send Message", admin_newsletter_create_message_path( list_id: d['id'] ), class: "button"
21
+ # end
22
+ end
23
+ end
24
+ else
25
+ render partial: "create_message"
26
+ end
27
+ end
28
+
29
+ action_item do
30
+ link_to "Go to Mailchimp", "https://login.mailchimp.com/"
31
+ end
32
+
33
+ # page_action :create_message do
34
+ # redirect_to admin_newsletter_path( list_id: params[:list_id] )
35
+ # end
36
+
37
+ # page_action :send_message, method: :post do
38
+ # if params[:list_id].blank? || params[:subject].blank? || params[:message].blank?
39
+ # redirect_to admin_newsletter_path, notice: "Message NOT sent, missing params"
40
+ # end
41
+
42
+ # puts "Sending message: #{params[:subject]}"
43
+ # puts "Body: #{params[:message]}"
44
+
45
+ # redirect_to admin_newsletter_path, notice: "Message sent!"
46
+ # end
47
+ end
48
+ end
@@ -0,0 +1,15 @@
1
+ class Admin::StatsController < ApplicationController
2
+ before_filter :authenticate_admin_user!
3
+
4
+ def stats
5
+ if params[:scope].blank?
6
+ render :json => { :errors => "scope not set" }, :status => 422
7
+ else
8
+ cls = User
9
+ cls = Identity.where( "provider = ?", "twitter" ) if params[:scope] == 'twitter_users'
10
+ cls = Identity.where( "provider = ?", "instagram" ) if params[:scope] == 'instagram_users'
11
+ ret = cls.group_by_month.collect { |x| [x[:date_slice],x[:count]] }
12
+ render json: ret
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ = scope
2
+ %div{ id: scope, style: "height: 300px" }
3
+
4
+ :javascript
5
+ $( function() { new Chartkick.ColumnChart( '#{scope}', "/admin/stats/#{scope}" ) } )
@@ -8,6 +8,7 @@ The happy_seed bootstrap generator
8
8
  * Installs active admin from git
9
9
  * Runs the active_admin:install generator
10
10
  * Creates AdminUser model
11
+ * Creates basic newsletter/campaign admin panel if MAILCHIMP_API_KEY is active
11
12
 
12
13
  ### Why do you want this?
13
14
 
@@ -20,3 +21,5 @@ na
20
21
  ### What needs to be done?
21
22
 
22
23
  Add models to the dashboard.
24
+
25
+ (the happy_Seed stats module is in development)
@@ -0,0 +1,40 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Admin::StatsController, :type => :controller do
4
+ before( :each ) do
5
+ @request.env["devise.mapping"] = Devise.mappings[:admin_user]
6
+ # @request.env["warden"] ||= Whatever.new
7
+ end
8
+
9
+ it "should require the scope param" do
10
+ sign_in :admin_user, create( :admin_user )
11
+
12
+ get :stats, scope: ''
13
+ expect( response.status ).to eq( 422 )
14
+ expect( response.content_type).to eq( "application/json" )
15
+ expect( response.body ).to eq( "{\"errors\":\"scope not set\"}" )
16
+ end
17
+
18
+ it "should return data for a logged in user" do
19
+ sign_in :admin_user, create( :admin_user )
20
+
21
+ get :stats, scope: 'user'
22
+ expect( response.status ).to eq( 200 )
23
+ expect( response.content_type).to eq( "application/json" )
24
+ end
25
+
26
+ it "should return hourly data for user scope" do
27
+ start_time = Time.parse "2014-07-19 15:26:48 -0400"
28
+
29
+ 10.times do |t|
30
+ create :user, created_at: start_time - (21.minutes * t)
31
+ end
32
+
33
+ sign_in :admin_user, create( :admin_user )
34
+
35
+ get :stats, scope: 'user'
36
+ expect( response.status ).to eq( 200 )
37
+ expect( response.content_type).to eq( "application/json" )
38
+ expect( response.body ).to eq("[[\"2014-07-19 16:00:00 UTC\",3],[\"2014-07-19 17:00:00 UTC\",2],[\"2014-07-19 18:00:00 UTC\",3],[\"2014-07-19 19:00:00 UTC\",2]]")
39
+ end
40
+ end
@@ -0,0 +1,7 @@
1
+ FactoryGirl.define do
2
+ factory :admin_user do
3
+ email "admin@example.com"
4
+ password "12345678"
5
+ password_confirmation "12345678"
6
+ end
7
+ end