arturo 2.1.0 → 4.1.1

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 (40) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +90 -0
  3. data/README.md +142 -93
  4. data/app/controllers/arturo/features_controller.rb +6 -13
  5. data/app/helpers/arturo/features_helper.rb +1 -0
  6. data/app/views/arturo/features/_feature.html.erb +1 -0
  7. data/app/views/arturo/features/_form.html.erb +1 -0
  8. data/app/views/arturo/features/edit.html.erb +1 -0
  9. data/app/views/arturo/features/forbidden.html.erb +1 -0
  10. data/app/views/arturo/features/index.html.erb +1 -0
  11. data/app/views/arturo/features/new.html.erb +1 -0
  12. data/app/views/arturo/features/show.html.erb +1 -0
  13. data/config/locales/en.yml +1 -1
  14. data/config/routes.rb +4 -12
  15. data/lib/arturo/controller_filters.rb +3 -2
  16. data/lib/arturo/engine.rb +2 -8
  17. data/lib/arturo/feature_availability.rb +2 -1
  18. data/lib/arturo/feature_caching.rb +118 -23
  19. data/lib/arturo/feature_factories.rb +3 -2
  20. data/lib/arturo/feature_management.rb +1 -0
  21. data/lib/arturo/feature_methods.rb +95 -0
  22. data/lib/arturo/feature_params_support.rb +6 -4
  23. data/lib/arturo/middleware.rb +1 -0
  24. data/lib/arturo/no_such_feature.rb +1 -0
  25. data/lib/arturo/null_logger.rb +8 -0
  26. data/lib/arturo/special_handling.rb +6 -6
  27. data/lib/arturo/test_support.rb +3 -2
  28. data/lib/arturo/version.rb +4 -0
  29. data/lib/arturo.rb +28 -6
  30. data/lib/generators/arturo/assets_generator.rb +1 -0
  31. data/lib/generators/arturo/feature_model_generator.rb +14 -0
  32. data/lib/generators/arturo/initializer_generator.rb +1 -0
  33. data/lib/generators/arturo/migration_generator.rb +10 -10
  34. data/lib/generators/arturo/routes_generator.rb +1 -0
  35. data/lib/generators/arturo/templates/feature.rb +9 -0
  36. data/lib/generators/arturo/templates/initializer.rb +1 -0
  37. data/lib/generators/arturo/templates/migration.erb +17 -0
  38. metadata +36 -200
  39. data/lib/arturo/feature.rb +0 -90
  40. data/lib/generators/arturo/templates/migration.rb +0 -17
metadata CHANGED
@@ -1,261 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arturo
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 4.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - James A. Rosen
8
8
  autorequire:
9
9
  bindir: bin
10
- cert_chain:
11
- - gem-public_cert.pem
12
- date: 2015-01-03 00:00:00.000000000 Z
10
+ cert_chain: []
11
+ date: 2024-07-12 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: activerecord
16
15
  requirement: !ruby/object:Gem::Requirement
17
16
  requirements:
18
- - - '>'
19
- - !ruby/object:Gem::Version
20
- version: '3.2'
21
- - - <
22
- - !ruby/object:Gem::Version
23
- version: '5.0'
24
- type: :runtime
25
- prerelease: false
26
- version_requirements: !ruby/object:Gem::Requirement
27
- requirements:
28
- - - '>'
29
- - !ruby/object:Gem::Version
30
- version: '3.2'
31
- - - <
32
- - !ruby/object:Gem::Version
33
- version: '5.0'
34
- - !ruby/object:Gem::Dependency
35
- name: rails
36
- requirement: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - '>'
39
- - !ruby/object:Gem::Version
40
- version: '3.2'
41
- - - <
42
- - !ruby/object:Gem::Version
43
- version: '5.0'
44
- type: :development
45
- prerelease: false
46
- version_requirements: !ruby/object:Gem::Requirement
47
- requirements:
48
- - - '>'
49
- - !ruby/object:Gem::Version
50
- version: '3.2'
51
- - - <
52
- - !ruby/object:Gem::Version
53
- version: '5.0'
54
- - !ruby/object:Gem::Dependency
55
- name: mocha
56
- requirement: !ruby/object:Gem::Requirement
57
- requirements:
58
- - - ~>
59
- - !ruby/object:Gem::Version
60
- version: '1.1'
61
- type: :development
62
- prerelease: false
63
- version_requirements: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - ~>
66
- - !ruby/object:Gem::Version
67
- version: '1.1'
68
- - !ruby/object:Gem::Dependency
69
- name: rake
70
- requirement: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - ~>
73
- - !ruby/object:Gem::Version
74
- version: '10.3'
75
- type: :development
76
- prerelease: false
77
- version_requirements: !ruby/object:Gem::Requirement
78
- requirements:
79
- - - ~>
80
- - !ruby/object:Gem::Version
81
- version: '10.3'
82
- - !ruby/object:Gem::Dependency
83
- name: minitest
84
- requirement: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - '>'
87
- - !ruby/object:Gem::Version
88
- version: '0'
89
- - - <
90
- - !ruby/object:Gem::Version
91
- version: '6.0'
92
- type: :development
93
- prerelease: false
94
- version_requirements: !ruby/object:Gem::Requirement
95
- requirements:
96
- - - '>'
97
- - !ruby/object:Gem::Version
98
- version: '0'
99
- - - <
100
- - !ruby/object:Gem::Version
101
- version: '6.0'
102
- - !ruby/object:Gem::Dependency
103
- name: minitest-rg
104
- requirement: !ruby/object:Gem::Requirement
105
- requirements:
106
- - - '>'
107
- - !ruby/object:Gem::Version
108
- version: '0'
109
- - - <
17
+ - - ">="
110
18
  - !ruby/object:Gem::Version
111
19
  version: '6.0'
112
- type: :development
20
+ type: :runtime
113
21
  prerelease: false
114
22
  version_requirements: !ruby/object:Gem::Requirement
115
23
  requirements:
116
- - - '>'
117
- - !ruby/object:Gem::Version
118
- version: '0'
119
- - - <
24
+ - - ">="
120
25
  - !ruby/object:Gem::Version
121
26
  version: '6.0'
122
- - !ruby/object:Gem::Dependency
123
- name: rails-dom-testing
124
- requirement: !ruby/object:Gem::Requirement
125
- requirements:
126
- - - ~>
127
- - !ruby/object:Gem::Version
128
- version: '1.0'
129
- type: :development
130
- prerelease: false
131
- version_requirements: !ruby/object:Gem::Requirement
132
- requirements:
133
- - - ~>
134
- - !ruby/object:Gem::Version
135
- version: '1.0'
136
- - !ruby/object:Gem::Dependency
137
- name: sqlite3
138
- requirement: !ruby/object:Gem::Requirement
139
- requirements:
140
- - - ~>
141
- - !ruby/object:Gem::Version
142
- version: '1.3'
143
- type: :development
144
- prerelease: false
145
- version_requirements: !ruby/object:Gem::Requirement
146
- requirements:
147
- - - ~>
148
- - !ruby/object:Gem::Version
149
- version: '1.3'
150
- - !ruby/object:Gem::Dependency
151
- name: factory_girl
152
- requirement: !ruby/object:Gem::Requirement
153
- requirements:
154
- - - ~>
155
- - !ruby/object:Gem::Version
156
- version: '4.2'
157
- type: :development
158
- prerelease: false
159
- version_requirements: !ruby/object:Gem::Requirement
160
- requirements:
161
- - - ~>
162
- - !ruby/object:Gem::Version
163
- version: '4.2'
164
- - !ruby/object:Gem::Dependency
165
- name: timecop
166
- requirement: !ruby/object:Gem::Requirement
167
- requirements:
168
- - - ~>
169
- - !ruby/object:Gem::Version
170
- version: '0.3'
171
- type: :development
172
- prerelease: false
173
- version_requirements: !ruby/object:Gem::Requirement
174
- requirements:
175
- - - ~>
176
- - !ruby/object:Gem::Version
177
- version: '0.3'
178
- - !ruby/object:Gem::Dependency
179
- name: wwtd
180
- requirement: !ruby/object:Gem::Requirement
181
- requirements:
182
- - - ~>
183
- - !ruby/object:Gem::Version
184
- version: '0.5'
185
- type: :development
186
- prerelease: false
187
- version_requirements: !ruby/object:Gem::Requirement
188
- requirements:
189
- - - ~>
190
- - !ruby/object:Gem::Version
191
- version: '0.5'
192
27
  description: Deploy features incrementally to your users
193
28
  email: james.a.rosen@gmail.com
194
29
  executables: []
195
30
  extensions: []
196
31
  extra_rdoc_files: []
197
32
  files:
33
+ - CHANGELOG.md
34
+ - LICENSE
35
+ - README.md
36
+ - app/assets/images/colon.png
37
+ - app/assets/javascripts/arturo.js
38
+ - app/assets/stylesheets/arturo.css
39
+ - app/controllers/arturo/features_controller.rb
40
+ - app/helpers/arturo/features_helper.rb
41
+ - app/views/arturo/features/_feature.html.erb
42
+ - app/views/arturo/features/_form.html.erb
43
+ - app/views/arturo/features/edit.html.erb
44
+ - app/views/arturo/features/forbidden.html.erb
45
+ - app/views/arturo/features/index.html.erb
46
+ - app/views/arturo/features/new.html.erb
47
+ - app/views/arturo/features/show.html.erb
48
+ - config/locales/en.yml
49
+ - config/routes.rb
50
+ - lib/arturo.rb
198
51
  - lib/arturo/controller_filters.rb
199
52
  - lib/arturo/engine.rb
200
- - lib/arturo/feature.rb
201
53
  - lib/arturo/feature_availability.rb
202
54
  - lib/arturo/feature_caching.rb
203
55
  - lib/arturo/feature_factories.rb
204
56
  - lib/arturo/feature_management.rb
57
+ - lib/arturo/feature_methods.rb
205
58
  - lib/arturo/feature_params_support.rb
206
59
  - lib/arturo/middleware.rb
207
60
  - lib/arturo/no_such_feature.rb
61
+ - lib/arturo/null_logger.rb
208
62
  - lib/arturo/special_handling.rb
209
63
  - lib/arturo/test_support.rb
210
- - lib/arturo.rb
64
+ - lib/arturo/version.rb
211
65
  - lib/generators/arturo/assets_generator.rb
66
+ - lib/generators/arturo/feature_model_generator.rb
212
67
  - lib/generators/arturo/initializer_generator.rb
213
68
  - lib/generators/arturo/migration_generator.rb
214
69
  - lib/generators/arturo/routes_generator.rb
215
70
  - lib/generators/arturo/templates/arturo_customizations.css
71
+ - lib/generators/arturo/templates/feature.rb
216
72
  - lib/generators/arturo/templates/initializer.rb
217
- - lib/generators/arturo/templates/migration.rb
218
- - app/assets/images/colon.png
219
- - app/assets/javascripts/arturo.js
220
- - app/assets/stylesheets/arturo.css
221
- - app/controllers/arturo/features_controller.rb
222
- - app/helpers/arturo/features_helper.rb
223
- - app/views/arturo/features/_feature.html.erb
224
- - app/views/arturo/features/_form.html.erb
225
- - app/views/arturo/features/edit.html.erb
226
- - app/views/arturo/features/forbidden.html.erb
227
- - app/views/arturo/features/index.html.erb
228
- - app/views/arturo/features/new.html.erb
229
- - app/views/arturo/features/show.html.erb
230
- - config/locales/en.yml
231
- - config/routes.rb
232
- - README.md
233
- - CHANGELOG.md
234
- - LICENSE
235
- homepage: http://github.com/jamesarosen/arturo
73
+ - lib/generators/arturo/templates/migration.erb
74
+ homepage: http://github.com/zendesk/arturo
236
75
  licenses:
237
76
  - APLv2
238
77
  metadata: {}
239
78
  post_install_message:
240
79
  rdoc_options: []
241
80
  require_paths:
242
- - .
243
81
  - lib
244
82
  required_ruby_version: !ruby/object:Gem::Requirement
245
83
  requirements:
246
- - - '>='
84
+ - - ">="
247
85
  - !ruby/object:Gem::Version
248
- version: '0'
86
+ version: '3.0'
249
87
  required_rubygems_version: !ruby/object:Gem::Requirement
250
88
  requirements:
251
- - - '>='
89
+ - - ">="
252
90
  - !ruby/object:Gem::Version
253
91
  version: '0'
254
92
  requirements: []
255
- rubyforge_project:
256
- rubygems_version: 2.0.14
93
+ rubygems_version: 3.5.11
257
94
  signing_key:
258
- specification_version: 2
95
+ specification_version: 4
259
96
  summary: Feature sliders, wrapped up in an engine
260
97
  test_files: []
261
- has_rdoc: 'false'
@@ -1,90 +0,0 @@
1
- require 'active_record'
2
-
3
- # a stub
4
- # possible TODO: remove and and refactor into an acts_as_feature mixin
5
- module Arturo
6
- class Feature < ::ActiveRecord::Base
7
-
8
- include Arturo::SpecialHandling
9
-
10
- Arturo::Feature::SYMBOL_REGEX = /^[a-zA-z][a-zA-Z0-9_]*$/
11
- DEFAULT_ATTRIBUTES = { :deployment_percentage => 0 }.with_indifferent_access
12
-
13
- attr_accessible :symbol, :deployment_percentage if ActiveRecord::VERSION::MAJOR < 4
14
- attr_readonly :symbol
15
-
16
- validates_presence_of :symbol, :deployment_percentage
17
- validates_uniqueness_of :symbol, :allow_blank => true
18
- validates_numericality_of :deployment_percentage,
19
- :only_integer => true,
20
- :allow_blank => true,
21
- :greater_than_or_equal_to => 0,
22
- :less_than_or_equal_to => 100
23
-
24
- # Looks up a feature by symbol. Also accepts a Feature as input.
25
- # @param [Symbol, Arturo::Feature] feature_or_name a Feature or the Symbol of a Feature
26
- # @return [Arturo::Feature, nil] the Feature if found, else Arturo::NoSuchFeature
27
- def self.to_feature(feature_or_symbol)
28
- return feature_or_symbol if feature_or_symbol.kind_of?(self)
29
- symbol = feature_or_symbol.to_sym.to_s
30
- self.where(:symbol => symbol).first || Arturo::NoSuchFeature.new(symbol)
31
- end
32
-
33
- # Looks up a feature by symbol. Also accepts a Feature as input.
34
- # @param [Symbol, Arturo::Feature] feature_or_name a Feature or the Symbol of a Feature
35
- # @return [Arturo::Feature, nil] the Feature if found, else nil
36
- def self.find_feature(feature_or_symbol)
37
- feature = to_feature(feature_or_symbol)
38
- feature.is_a?(Arturo::NoSuchFeature) ? nil : feature
39
- end
40
-
41
- # Create a new Feature
42
- def initialize(*args, &block)
43
- args[0] = DEFAULT_ATTRIBUTES.merge(args[0] || {})
44
- super(*args, &block)
45
- end
46
-
47
- # @param [Object] feature_recipient a User, Account,
48
- # or other model with an #id method
49
- # @return [true,false] whether or not this feature is enabled
50
- # for feature_recipient
51
- # @see Arturo::SpecialHandling#whitelisted?
52
- # @see Arturo::SpecialHandling#blacklisted?
53
- def enabled_for?(feature_recipient)
54
- return false if feature_recipient.nil?
55
- return false if blacklisted?(feature_recipient)
56
- return true if whitelisted?(feature_recipient)
57
- passes_threshold?(feature_recipient)
58
- end
59
-
60
- def name
61
- return I18n.translate("arturo.feature.nameless") if symbol.blank?
62
- I18n.translate("arturo.feature.#{symbol}", :default => symbol.to_s.titleize)
63
- end
64
-
65
- def to_s
66
- "Feature #{name}"
67
- end
68
-
69
- def to_param
70
- persisted? ? "#{id}-#{symbol.to_s.parameterize}" : nil
71
- end
72
-
73
- def inspect
74
- "<Arturo::Feature #{name}, deployed to #{deployment_percentage}%>"
75
- end
76
-
77
- def self.last_updated_at
78
- maximum(:updated_at)
79
- end
80
-
81
- protected
82
-
83
- def passes_threshold?(feature_recipient)
84
- threshold = self.deployment_percentage || 0
85
- return true if threshold == 100
86
- return false if threshold == 0 || !feature_recipient.id
87
- (((feature_recipient.id + (self.id || 1) + 17) * 13) % 100) < threshold
88
- end
89
- end
90
- end
@@ -1,17 +0,0 @@
1
- require 'active_support/core_ext'
2
-
3
- class CreateFeatures < ActiveRecord::Migration
4
- def self.up
5
- create_table :features do |t|
6
- t.string :symbol, :null => false
7
- t.integer :deployment_percentage, :null => false
8
- #Any additional fields here
9
-
10
- t.timestamps
11
- end
12
- end
13
-
14
- def self.down
15
- drop_table :features
16
- end
17
- end