paid_up 0.4.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,24 +2,24 @@ PaidUp.configure do |config|
2
2
  config.anonymous_customer_stripe_id = 'anonymous-customer'
3
3
  config.anonymous_plan_stripe_id = 'anonymous-plan'
4
4
  config.free_plan_stripe_id = 'free-plan'
5
- end
6
5
 
7
- PaidUp::Feature.new(
8
- slug: 'ad_free',
9
- title: 'Ad Free',
10
- description: 'Are ads removed from the site with this plan?',
11
- setting_type: 'boolean'
12
- )
13
- PaidUp::Feature.new(
14
- slug: 'groups',
15
- title: 'Groups',
16
- description: 'How many groups are allowed with this plan?',
17
- setting_type: 'table_rows' # Enables table row counting that is enabled by a positive value
6
+ PaidUp.add_feature(
7
+ slug: 'ad_free',
8
+ title: 'Ad Free',
9
+ description: 'Are ads removed from the site with this plan?',
10
+ setting_type: 'boolean'
11
+ )
12
+ PaidUp.add_feature(
13
+ slug: 'groups',
14
+ title: 'Groups',
15
+ description: 'How many groups are allowed with this plan?',
16
+ setting_type: 'table_rows' # Enables table row counting that is enabled by a positive value
18
17
  # for the PaidUp::PlanFeatureSetting.setting associated with this PaidUp::Feature
19
- )
20
- PaidUp::Feature.new(
21
- slug: 'doodads',
22
- title: 'Doodads',
23
- description: 'How many doodads included with this plan?',
24
- setting_type: 'rolify_rows'
25
- )
18
+ )
19
+ PaidUp.add_feature(
20
+ slug: 'doodads',
21
+ title: 'Doodads',
22
+ description: 'How many doodads included with this plan?',
23
+ setting_type: 'rolify_rows'
24
+ )
25
+ end
@@ -5,18 +5,19 @@ module PaidUp
5
5
  end
6
6
  @@configuration = configuration
7
7
  end
8
-
8
+
9
9
  def self.configuration
10
10
  @@configuration ||= PaidUp::Configuration.new
11
11
  end
12
-
12
+
13
13
  class Configuration
14
- attr_accessor :anonymous_customer_stripe_id, :anonymous_plan_stripe_id, :free_plan_stripe_id
15
-
14
+ attr_accessor :anonymous_customer_stripe_id, :anonymous_plan_stripe_id, :free_plan_stripe_id, :features
15
+
16
16
  def initialize
17
17
  self.anonymous_customer_stripe_id = "TODO"
18
18
  self.anonymous_plan_stripe_id = "TODO"
19
19
  self.free_plan_stripe_id = "TODO"
20
+ self.features = {}
20
21
  end
21
22
  end
22
23
  end
@@ -0,0 +1,90 @@
1
+ module PaidUp
2
+
3
+ @@feature_object = {}
4
+
5
+ def self.add_feature(params)
6
+ feature = PaidUp::Feature.new(params)
7
+ @@feature_object[feature.slug.to_sym] = feature
8
+ end
9
+
10
+ def self.features
11
+ @@feature_object
12
+ end
13
+
14
+
15
+ class Feature
16
+ include ActiveModel::Model
17
+ include ActiveModel::AttributeMethods
18
+
19
+ attr_accessor :slug, :title, :setting_type, :description
20
+
21
+ validates_presence_of :slug, :title, :setting_type
22
+ validates :setting_type, inclusion: { in: %w(boolean table_rows rolify_rows) }
23
+ validates_with PaidUp::Validators::TableRows, field: 'setting_type', comparison: 'table_rows', found_in: 'slug'
24
+ validates_with PaidUp::Validators::RolifyRows, field: 'setting_type', comparison: 'rolify_rows', found_in: 'slug'
25
+
26
+ def self.raw
27
+ PaidUp.features
28
+ end
29
+
30
+ def to_s
31
+ slug
32
+ end
33
+
34
+ def feature_model_name
35
+ acceptable_setting_types = ['table_rows', 'rolify_rows']
36
+ unless acceptable_setting_types.include? setting_type
37
+ raise :no_implicit_conversion_of_type_features.l(type: setting_type)
38
+ end
39
+ slug.classify
40
+ end
41
+
42
+ def feature_model
43
+ feature_model_name.constantize
44
+ end
45
+
46
+ def self.find_by_slug(slug)
47
+ raw[slug.to_sym]
48
+ end
49
+
50
+ def self.all
51
+ raw.values
52
+ end
53
+
54
+ def self.find_all(**conditions)
55
+ collection = []
56
+ for feature in all
57
+ qualifies = true
58
+ conditions.each do |key, value|
59
+ unless feature.send(key) == value
60
+ qualifies = false
61
+ end
62
+ end
63
+ if qualifies
64
+ collection << feature
65
+ end
66
+ end
67
+ collection
68
+ end
69
+
70
+ def self.find(**conditions)
71
+ find_all(conditions).first
72
+ end
73
+
74
+ # Define on self, since it's a class method
75
+ def self.method_missing(method_sym, *arguments, &block)
76
+ # the first argument is a Symbol, so you need to_s it if you want to pattern match
77
+ if method_sym.to_s =~ /^find_by_(.*)$/
78
+ self.find($1.to_sym => arguments.first)
79
+ elsif method_sym.to_s =~ /^find_all_by_(.*)$/
80
+ self.find_all($1.to_sym => arguments.first)
81
+ else
82
+ super
83
+ end
84
+ end
85
+
86
+ def self.respond_to_missing?(method_name, include_private = false)
87
+ method_name.to_s.start_with?('find_') || super
88
+ end
89
+ end
90
+ end
data/lib/paid_up.rb CHANGED
@@ -14,7 +14,11 @@ module PaidUp
14
14
  require 'cancan'
15
15
  require 'rolify'
16
16
 
17
+ require 'paid_up/validators/table_rows'
18
+ require 'paid_up/validators/rolify_rows'
19
+
17
20
  require 'paid_up/configuration'
21
+ require 'paid_up/feature'
18
22
  require 'paid_up/railtie'
19
23
  require 'paid_up/engine'
20
24
  require 'paid_up/localization'
@@ -26,9 +30,6 @@ module PaidUp
26
30
  require 'paid_up/mixins/subscriber'
27
31
  require 'paid_up/mixins/paid_for'
28
32
 
29
- require 'paid_up/validators/table_rows'
30
- require 'paid_up/validators/rolify_rows'
31
-
32
33
  require 'haml-rails'
33
34
  require 'bootstrap_leather'
34
35
 
data/paid_up.gemspec CHANGED
@@ -2,19 +2,18 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: paid_up 0.4.4 ruby lib
5
+ # stub: paid_up 0.5.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "paid_up"
9
- s.version = "0.4.4"
9
+ s.version = "0.5.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Karen Lundgren"]
14
- s.date = "2015-05-25"
14
+ s.date = "2015-05-26"
15
15
  s.description = "Allows a model of your choosing (such as users) to subscribe to a plan, which enables features."
16
16
  s.email = "karen.e.lundgren@gmail.com"
17
- s.executables = ["rails"]
18
17
  s.extra_rdoc_files = [
19
18
  "LICENSE.txt",
20
19
  "README.md"
@@ -36,7 +35,6 @@ Gem::Specification.new do |s|
36
35
  "app/helpers/paid_up/plans_helper.rb",
37
36
  "app/helpers/paid_up/subscriptions_helper.rb",
38
37
  "app/models/paid_up/ability.rb",
39
- "app/models/paid_up/feature.rb",
40
38
  "app/models/paid_up/plan.rb",
41
39
  "app/models/paid_up/plan_feature_setting.rb",
42
40
  "app/models/paid_up/unlimited.rb",
@@ -55,7 +53,6 @@ Gem::Specification.new do |s|
55
53
  "app/views/paid_up/plans/index.html.haml",
56
54
  "app/views/paid_up/subscriptions/index.html.haml",
57
55
  "app/views/paid_up/subscriptions/new.html.haml",
58
- "bin/rails",
59
56
  "config/initializers/stripe.rb",
60
57
  "config/locales/en.yml",
61
58
  "config/routes.rb",
@@ -74,6 +71,7 @@ Gem::Specification.new do |s|
74
71
  "lib/paid_up/engine.rb",
75
72
  "lib/paid_up/extensions/integer.rb",
76
73
  "lib/paid_up/extensions/stripe.rb",
74
+ "lib/paid_up/feature.rb",
77
75
  "lib/paid_up/localization.rb",
78
76
  "lib/paid_up/mixins/paid_for.rb",
79
77
  "lib/paid_up/mixins/subscriber.rb",
@@ -95,11 +93,6 @@ Gem::Specification.new do |s|
95
93
  "spec/dummy/app/models/user.rb",
96
94
  "spec/dummy/app/views/layouts/application.html.haml",
97
95
  "spec/dummy/app/views/pages/index.html.haml",
98
- "spec/dummy/bin/bundle",
99
- "spec/dummy/bin/rails",
100
- "spec/dummy/bin/rake",
101
- "spec/dummy/bin/rspec",
102
- "spec/dummy/bin/setup",
103
96
  "spec/dummy/config.ru",
104
97
  "spec/dummy/config/application.rb",
105
98
  "spec/dummy/config/boot.rb",
@@ -199,6 +192,7 @@ Gem::Specification.new do |s|
199
192
  s.add_development_dependency(%q<bootstrap-sass>, ["~> 3.3"])
200
193
  s.add_development_dependency(%q<sass-rails>, ["~> 5.0"])
201
194
  s.add_development_dependency(%q<high_voltage>, ["~> 2.3"])
195
+ s.add_development_dependency(%q<rspec-rails>, ["~> 3.2"])
202
196
  else
203
197
  s.add_dependency(%q<rails>, ["~> 4"])
204
198
  s.add_dependency(%q<rails-i18n>, ["~> 4"])
@@ -218,6 +212,7 @@ Gem::Specification.new do |s|
218
212
  s.add_dependency(%q<bootstrap-sass>, ["~> 3.3"])
219
213
  s.add_dependency(%q<sass-rails>, ["~> 5.0"])
220
214
  s.add_dependency(%q<high_voltage>, ["~> 2.3"])
215
+ s.add_dependency(%q<rspec-rails>, ["~> 3.2"])
221
216
  end
222
217
  else
223
218
  s.add_dependency(%q<rails>, ["~> 4"])
@@ -238,6 +233,7 @@ Gem::Specification.new do |s|
238
233
  s.add_dependency(%q<bootstrap-sass>, ["~> 3.3"])
239
234
  s.add_dependency(%q<sass-rails>, ["~> 5.0"])
240
235
  s.add_dependency(%q<high_voltage>, ["~> 2.3"])
236
+ s.add_dependency(%q<rspec-rails>, ["~> 3.2"])
241
237
  end
242
238
  end
243
239
 
@@ -15,8 +15,6 @@ Rails.application.configure do
15
15
 
16
16
  # Don't care if the mailer can't send.
17
17
  config.action_mailer.raise_delivery_errors = false
18
- config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
19
-
20
18
 
21
19
  # Print deprecation notices to the Rails logger.
22
20
  config.active_support.deprecation = :log
@@ -40,7 +38,4 @@ Rails.application.configure do
40
38
 
41
39
  # Raises error for missing translations
42
40
  # config.action_view.raise_on_missing_translations = true
43
-
44
- # We need to serve static files since there's no webserver to do it.
45
- config.serve_static_files = true
46
41
  end
@@ -29,7 +29,7 @@ Rails.application.configure do
29
29
  # config.assets.css_compressor = :sass
30
30
 
31
31
  # Do not fallback to assets pipeline if a precompiled asset is missed.
32
- config.assets.compile = true
32
+ config.assets.compile = false
33
33
 
34
34
  # Asset digests allow you to set far-future HTTP expiration dates on all assets,
35
35
  # yet still be able to expire them through the digest params.
@@ -39,7 +39,4 @@ Rails.application.configure do
39
39
 
40
40
  # Raises error for missing translations
41
41
  # config.action_view.raise_on_missing_translations = true
42
-
43
- # We need to serve static files since there's no webserver to do it.
44
- config.serve_static_files = true
45
42
  end
@@ -7,5 +7,5 @@ Rails.application.config.assets.version = '1.0'
7
7
  # Rails.application.config.assets.paths << Emoji.images_path
8
8
 
9
9
  # Precompile additional assets.
10
- # application.js, application.css.scss, and all non-JS/CSS in app/assets folder are already added.
10
+ # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
11
11
  # Rails.application.config.assets.precompile += %w( search.js )
@@ -2,24 +2,24 @@ PaidUp.configure do |config|
2
2
  config.anonymous_customer_stripe_id = 'anonymous-customer'
3
3
  config.anonymous_plan_stripe_id = 'anonymous-plan'
4
4
  config.free_plan_stripe_id = 'free-plan'
5
- end
6
5
 
7
- PaidUp::Feature.new(
8
- slug: 'ad_free',
9
- title: 'Ad Free',
10
- description: 'Are ads removed from the site with this plan?',
11
- setting_type: 'boolean'
12
- )
13
- PaidUp::Feature.new(
14
- slug: 'groups',
15
- title: 'Groups',
16
- description: 'How many groups are allowed with this plan?',
17
- setting_type: 'rolify_rows' # Enables table row counting that is enabled by a positive value
6
+ PaidUp.add_feature(
7
+ slug: 'ad_free',
8
+ title: 'Ad Free',
9
+ description: 'Are ads removed from the site with this plan?',
10
+ setting_type: 'boolean'
11
+ )
12
+ PaidUp.add_feature(
13
+ slug: 'groups',
14
+ title: 'Groups',
15
+ description: 'How many groups are allowed with this plan?',
16
+ setting_type: 'rolify_rows' # Enables table row counting that is enabled by a positive value
18
17
  # for the PaidUp::PlanFeatureSetting.setting associated with this PaidUp::Feature
19
- )
20
- PaidUp::Feature.new(
21
- slug: 'doodads',
22
- title: 'Doodads',
23
- description: 'How many doodads included with this plan?',
24
- setting_type: 'table_rows'
25
- )
18
+ )
19
+ PaidUp.add_feature(
20
+ slug: 'doodads',
21
+ title: 'Doodads',
22
+ description: 'How many doodads included with this plan?',
23
+ setting_type: 'table_rows'
24
+ )
25
+ end
@@ -17,6 +17,11 @@ describe PaidUp::Feature do
17
17
  it { should eq 'Group' }
18
18
  end
19
19
 
20
+ context '.raw' do
21
+ subject { PaidUp::Feature.raw }
22
+ it { should eq( { ad_free: ad_free_feature, groups: groups_feature, doodads: doodads_feature } ) }
23
+ end
24
+
20
25
  context '.all' do
21
26
  subject { PaidUp::Feature.all }
22
27
  it { should eq [ad_free_feature, groups_feature, doodads_feature] }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paid_up
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Karen Lundgren
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-25 00:00:00.000000000 Z
11
+ date: 2015-05-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -262,11 +262,24 @@ dependencies:
262
262
  - - "~>"
263
263
  - !ruby/object:Gem::Version
264
264
  version: '2.3'
265
+ - !ruby/object:Gem::Dependency
266
+ name: rspec-rails
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - "~>"
270
+ - !ruby/object:Gem::Version
271
+ version: '3.2'
272
+ type: :development
273
+ prerelease: false
274
+ version_requirements: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - "~>"
277
+ - !ruby/object:Gem::Version
278
+ version: '3.2'
265
279
  description: Allows a model of your choosing (such as users) to subscribe to a plan,
266
280
  which enables features.
267
281
  email: karen.e.lundgren@gmail.com
268
- executables:
269
- - rails
282
+ executables: []
270
283
  extensions: []
271
284
  extra_rdoc_files:
272
285
  - LICENSE.txt
@@ -288,7 +301,6 @@ files:
288
301
  - app/helpers/paid_up/plans_helper.rb
289
302
  - app/helpers/paid_up/subscriptions_helper.rb
290
303
  - app/models/paid_up/ability.rb
291
- - app/models/paid_up/feature.rb
292
304
  - app/models/paid_up/plan.rb
293
305
  - app/models/paid_up/plan_feature_setting.rb
294
306
  - app/models/paid_up/unlimited.rb
@@ -307,7 +319,6 @@ files:
307
319
  - app/views/paid_up/plans/index.html.haml
308
320
  - app/views/paid_up/subscriptions/index.html.haml
309
321
  - app/views/paid_up/subscriptions/new.html.haml
310
- - bin/rails
311
322
  - config/initializers/stripe.rb
312
323
  - config/locales/en.yml
313
324
  - config/routes.rb
@@ -326,6 +337,7 @@ files:
326
337
  - lib/paid_up/engine.rb
327
338
  - lib/paid_up/extensions/integer.rb
328
339
  - lib/paid_up/extensions/stripe.rb
340
+ - lib/paid_up/feature.rb
329
341
  - lib/paid_up/localization.rb
330
342
  - lib/paid_up/mixins/paid_for.rb
331
343
  - lib/paid_up/mixins/subscriber.rb
@@ -347,11 +359,6 @@ files:
347
359
  - spec/dummy/app/models/user.rb
348
360
  - spec/dummy/app/views/layouts/application.html.haml
349
361
  - spec/dummy/app/views/pages/index.html.haml
350
- - spec/dummy/bin/bundle
351
- - spec/dummy/bin/rails
352
- - spec/dummy/bin/rake
353
- - spec/dummy/bin/rspec
354
- - spec/dummy/bin/setup
355
362
  - spec/dummy/config.ru
356
363
  - spec/dummy/config/application.rb
357
364
  - spec/dummy/config/boot.rb
@@ -1,75 +0,0 @@
1
- class PaidUp::Feature
2
- include ActiveModel::Model
3
- include ActiveModel::AttributeMethods
4
-
5
- @@instance_collector = []
6
-
7
- attr_accessor :slug, :title, :setting_type, :description
8
-
9
- validates_presence_of :slug, :title, :setting_type
10
- validates :setting_type, inclusion: { in: %w(boolean table_rows rolify_rows) }
11
- validates_with PaidUp::Validators::TableRows, field: 'setting_type', comparison: 'table_rows', found_in: 'slug'
12
- validates_with PaidUp::Validators::RolifyRows, field: 'setting_type', comparison: 'rolify_rows', found_in: 'slug'
13
-
14
- def initialize(attributes = {})
15
- super attributes
16
- @@instance_collector << self
17
- end
18
-
19
- def to_s
20
- slug
21
- end
22
-
23
- def feature_model_name
24
- acceptable_setting_types = ['table_rows', 'rolify_rows']
25
- unless acceptable_setting_types.include? setting_type
26
- raise :no_implicit_conversion_of_type_features.l(type: setting_type)
27
- end
28
- slug.classify
29
- end
30
-
31
- def feature_model
32
- feature_model_name.constantize
33
- end
34
-
35
- def self.all
36
- @@instance_collector
37
- end
38
-
39
- def self.find_all(**conditions)
40
- collection = []
41
- for feature in all
42
- qualifies = true
43
- conditions.each do |key, value|
44
- unless feature.send(key) == value
45
- qualifies = false
46
- end
47
- end
48
- if qualifies
49
- collection << feature
50
- end
51
- end
52
- collection
53
- end
54
-
55
- def self.find(**conditions)
56
- find_all(conditions).first
57
- end
58
-
59
- # Define on self, since it's a class method
60
- def self.method_missing(method_sym, *arguments, &block)
61
- # the first argument is a Symbol, so you need to_s it if you want to pattern match
62
- if method_sym.to_s =~ /^find_by_(.*)$/
63
- self.find($1.to_sym => arguments.first)
64
- elsif method_sym.to_s =~ /^find_all_by_(.*)$/
65
- self.find_all($1.to_sym => arguments.first)
66
- else
67
- super
68
- end
69
- end
70
-
71
- def self.respond_to_missing?(method_name, include_private = false)
72
- method_name.to_s.start_with?('find_') || super
73
- end
74
-
75
- end
data/bin/rails DELETED
@@ -1,19 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # This command will automatically be run when you run "rails" with Rails 4 gems installed from the root of your application.
3
-
4
- ENGINE_ROOT = File.expand_path('../..', __FILE__)
5
- ENGINE_PATH = File.expand_path('../../lib/paid_up/engine', __FILE__)
6
-
7
- # Set up gems listed in the Gemfile.
8
- ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
9
- require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
10
-
11
- # require 'rails/all'
12
-
13
- require "active_record/railtie"
14
- require "action_controller/railtie"
15
- require "action_mailer/railtie"
16
- require "action_view/railtie"
17
- require "sprockets/railtie"
18
-
19
- require 'rails/engine/commands'
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env ruby
2
- ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
3
- load Gem.bin_path('bundler', 'bundle')
data/spec/dummy/bin/rails DELETED
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env ruby
2
- APP_PATH = File.expand_path('../../config/application', __FILE__)
3
- require_relative '../config/boot'
4
- require 'rails/commands'
data/spec/dummy/bin/rake DELETED
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require_relative '../config/boot'
3
- require 'rake'
4
- Rake.application.run
data/spec/dummy/bin/rspec DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'bundler/setup'
3
- load Gem.bin_path('rspec-core', 'rspec')
data/spec/dummy/bin/setup DELETED
@@ -1,29 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'pathname'
3
-
4
- # path to your application root.
5
- APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
6
-
7
- Dir.chdir APP_ROOT do
8
- # This script is a starting point to setup your application.
9
- # Add necessary setup steps to this file:
10
-
11
- puts "== Installing dependencies =="
12
- system "gem install bundler --conservative"
13
- system "bundle check || bundle install"
14
-
15
- # puts "\n== Copying sample files =="
16
- # unless File.exist?("config/database.yml")
17
- # system "cp config/database.yml.sample config/database.yml"
18
- # end
19
-
20
- puts "\n== Preparing database =="
21
- system "bin/rake db:setup"
22
-
23
- puts "\n== Removing old logs and tempfiles =="
24
- system "rm -f log/*"
25
- system "rm -rf tmp/cache"
26
-
27
- puts "\n== Restarting application server =="
28
- system "touch tmp/restart.txt"
29
- end