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.
- checksums.yaml +4 -4
- data/bin/happy_seed_plugin +14 -0
- data/happy_seed.rb +1 -1
- data/lib/generators/happy_seed/admin/admin_generator.rb +23 -1
- data/lib/generators/happy_seed/admin/templates/app/admin/campaigns.rb +36 -0
- data/lib/generators/happy_seed/admin/templates/app/admin/dashboard.rb +54 -0
- data/lib/generators/happy_seed/admin/templates/app/admin/newsletter.rb +48 -0
- data/lib/generators/happy_seed/admin/templates/app/controllers/admin/stats_controller.rb +15 -0
- data/lib/generators/happy_seed/admin/templates/app/views/admin/_chart.html.haml +5 -0
- data/lib/generators/happy_seed/admin/templates/docs/README.07.admin.rdoc +3 -0
- data/lib/generators/happy_seed/admin/templates/spec/controllers/admin/stats_controller_spec.rb +40 -0
- data/lib/generators/happy_seed/admin/templates/spec/factories/admin_users.rb +7 -0
- data/lib/generators/happy_seed/admin/templates/vendor/assets/javascripts/chartkick.js +830 -0
- data/lib/generators/happy_seed/{foreman/foreman_generator.rb → base/base_generator.rb} +15 -1
- data/lib/generators/happy_seed/{foreman → base}/templates/.env +0 -0
- data/lib/generators/happy_seed/{foreman → base}/templates/.foreman +0 -0
- data/lib/generators/happy_seed/{foreman → base}/templates/Procfile +0 -0
- data/lib/generators/happy_seed/{foreman → base}/templates/app/controllers/setup_controller.rb +0 -0
- data/lib/generators/happy_seed/{foreman → base}/templates/app/views/setup/index.html.haml +0 -0
- data/lib/generators/happy_seed/{foreman → base}/templates/application_controller.rb +0 -0
- data/lib/generators/happy_seed/{foreman → base}/templates/config/unicorn.rb +0 -0
- data/lib/generators/happy_seed/base/templates/docs/README.00.base.rdoc +43 -0
- data/lib/generators/happy_seed/{foreman → base}/templates/spec/controllers/application_controller_spec.rb +0 -0
- data/lib/generators/happy_seed/{foreman → base}/templates/spec/controllers/setup_controller_spec.rb +0 -0
- data/lib/generators/happy_seed/bootstrap/templates/app/views/application/_footer.html.haml +7 -6
- data/lib/generators/happy_seed/bootstrap/templates/docs/README.01.bootstrap.rdoc +6 -0
- data/lib/generators/happy_seed/devise/devise_generator.rb +3 -0
- data/lib/generators/happy_seed/devise/templates/docs/README.03.devise.rdoc +5 -3
- data/lib/generators/happy_seed/devise/templates/spec/factories/users.rb +15 -0
- data/lib/generators/happy_seed/facebook/templates/docs/README.06.facebook.rdoc +4 -0
- data/lib/generators/happy_seed/omniauth/omniauth_generator.rb +1 -0
- data/lib/generators/happy_seed/omniauth/templates/docs/README.04.omniauth.rdoc +9 -5
- data/lib/generators/happy_seed/plugin/plugin_generator.rb +32 -0
- data/lib/generators/happy_seed/plugin/templates/.autotest +7 -0
- data/lib/generators/happy_seed/plugin/templates/.rspec +3 -0
- data/lib/generators/happy_seed/plugin/templates/Rakefile +25 -0
- data/lib/generators/happy_seed/plugin/templates/gemspec +8 -0
- data/lib/generators/happy_seed/plugin/templates/spec/rails_helper.rb +43 -0
- data/lib/generators/happy_seed/plugin/templates/spec/spec_helper.rb +20 -0
- data/lib/generators/happy_seed/splash/templates/app/assets/stylesheets/splash.css.scss +4 -74
- data/lib/generators/happy_seed/splash/templates/app/views/layouts/splash.html.haml +6 -5
- data/lib/generators/happy_seed/splash/templates/app/views/splash/index.html.haml +66 -178
- data/lib/generators/happy_seed/splash/templates/docs/README.02.splash.rdoc +6 -4
- data/lib/generators/happy_seed/twitter/templates/docs/README.05.twitter.rdoc +3 -1
- data/lib/happy_seed/version.rb +1 -1
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/test.log +5 -0
- metadata +35 -13
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 06bd0e21a25b074638ecba10e48852884e1c321d
|
4
|
+
data.tar.gz: 9c0399877461aa4b0d1747ff580aa1e8f25c1c87
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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:
|
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
|
-
|
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
|
@@ -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)
|
data/lib/generators/happy_seed/admin/templates/spec/controllers/admin/stats_controller_spec.rb
ADDED
@@ -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
|