flagship 0.4.0 → 0.5.0
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/CHANGELOG.md +6 -0
- data/README.md +53 -0
- data/lib/flagship.rb +43 -41
- data/lib/flagship/dsl.rb +17 -1
- data/lib/flagship/flagset.rb +3 -2
- data/lib/flagship/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8fb44a30b820db71bbf1edc824a3543a0e0f107e
|
4
|
+
data.tar.gz: 13d3196cd2ee42b7d1b7b6a4d9a09c966cf66e26
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a564740caca6345d3190830913d9d4e3b2e1ea060312bd36471d65e68335506043c1568aa2f653241c028318bd03655aad4cecd3e2aade9552cf8f14f90f5a9
|
7
|
+
data.tar.gz: ba3b294b5bc9cf320b5210b7c54084107bee59c08e6107ac48ff958e9009dce6611dd7501ff6fe234ba60af82acbfbe956fb669c82f96e8e3471ab9b1b18b636
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## [0.5.0] - 2017-01-07
|
4
|
+
|
5
|
+
- Documented about helper methods [#21](https://github.com/yuya-takeyama/flagship/pull/21)
|
6
|
+
- Helper methods can be specified as a `Symbol` [#21](https://github.com/yuya-takeyama/flagship/pull/21)
|
7
|
+
- Helper methods are extended [#22](https://github.com/yuya-takeyama/flagship/pull/22)
|
8
|
+
|
3
9
|
## [0.4.0] - 2016-12-23
|
4
10
|
|
5
11
|
### Added
|
data/README.md
CHANGED
@@ -147,6 +147,59 @@ Flagship.define :blog do
|
|
147
147
|
end
|
148
148
|
```
|
149
149
|
|
150
|
+
## Helper methods
|
151
|
+
|
152
|
+
You can define helpers as normal methods with `def`. Methods can be used within blocks, procs, or as symbolic names for if statements to tidy up your code.
|
153
|
+
|
154
|
+
```rb
|
155
|
+
Flagship.define :blog do
|
156
|
+
def is_author(comment, user)
|
157
|
+
comment.author == user
|
158
|
+
end
|
159
|
+
|
160
|
+
def can_view_comment(context)
|
161
|
+
context.current_user.moderator?
|
162
|
+
end
|
163
|
+
|
164
|
+
enable :comment, if: :can_view_comment
|
165
|
+
enable :comment_deletion, if: ->(context) { is_author(context.comment, context.current_user) }
|
166
|
+
end
|
167
|
+
```
|
168
|
+
|
169
|
+
To share helpers, you can simply include them as modules.
|
170
|
+
|
171
|
+
```rb
|
172
|
+
module FlagHelpers
|
173
|
+
def is_author(context)
|
174
|
+
context.comment.author == context.current_user
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
Flagship.define :development do
|
179
|
+
include FlagHelpers
|
180
|
+
enable :delete, if: :is_author
|
181
|
+
end
|
182
|
+
|
183
|
+
Flagship.define :production do
|
184
|
+
include FlagHelpers
|
185
|
+
enable :delete, if: :is_author
|
186
|
+
end
|
187
|
+
```
|
188
|
+
|
189
|
+
And you can also extend helper methods from base flagset.
|
190
|
+
|
191
|
+
```rb
|
192
|
+
Flagship.define :base do
|
193
|
+
def is_author(context)
|
194
|
+
context.comment.author == context.current_user
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
Flagship.define :production do
|
199
|
+
enable :delete, if: :is_author
|
200
|
+
end
|
201
|
+
```
|
202
|
+
|
150
203
|
## Development
|
151
204
|
|
152
205
|
After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/flagship.rb
CHANGED
@@ -9,46 +9,48 @@ require "flagship/flagsets_container"
|
|
9
9
|
module Flagship
|
10
10
|
class NoFlagsetSelectedError < ::StandardError; end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
12
|
+
class << self
|
13
|
+
def define(key, options = {}, &block)
|
14
|
+
context = self.default_context
|
15
|
+
base = options[:extend] ? self.get_flagset(options[:extend]) : nil
|
16
|
+
default_flagsets_container.add ::Flagship::Dsl.new(key, context, base, &block).flagset
|
17
|
+
end
|
18
|
+
|
19
|
+
def enabled?(key)
|
20
|
+
current_flagset.enabled?(key)
|
21
|
+
end
|
22
|
+
|
23
|
+
def set_context(key, value)
|
24
|
+
default_context.__set(key, value)
|
25
|
+
end
|
26
|
+
|
27
|
+
def select_flagset(key)
|
28
|
+
@current_flagset = default_flagsets_container.get(key)
|
29
|
+
end
|
30
|
+
|
31
|
+
def features
|
32
|
+
current_flagset.features
|
33
|
+
end
|
34
|
+
|
35
|
+
def get_flagset(key)
|
36
|
+
default_flagsets_container.get(key)
|
37
|
+
end
|
38
|
+
|
39
|
+
def default_flagsets_container
|
40
|
+
@default_flagsts_container ||= ::Flagship::FlagsetsContainer.new
|
41
|
+
end
|
42
|
+
|
43
|
+
def current_flagset
|
44
|
+
@current_flagset or raise NoFlagsetSelectedError.new('No flagset is selected')
|
45
|
+
end
|
46
|
+
|
47
|
+
def default_context
|
48
|
+
@default_context ||= ::Flagship::Context.new
|
49
|
+
end
|
50
|
+
|
51
|
+
def clear_state
|
52
|
+
@default_flagsts_container = nil
|
53
|
+
@current_flagset = nil
|
54
|
+
end
|
53
55
|
end
|
54
56
|
end
|
data/lib/flagship/dsl.rb
CHANGED
@@ -11,14 +11,26 @@ class Flagship::Dsl
|
|
11
11
|
@definition = block
|
12
12
|
@base_tags = {}
|
13
13
|
|
14
|
+
if @base
|
15
|
+
@base.helper_methods.each do |method|
|
16
|
+
define_singleton_method(method.name, &method)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
14
20
|
instance_eval(&@definition)
|
15
21
|
|
16
|
-
|
22
|
+
helper_methods = singleton_methods.map { |sym| method(sym) }
|
23
|
+
@flagset = ::Flagship::Flagset.new(@key, @features, @base, helper_methods)
|
17
24
|
end
|
18
25
|
|
19
26
|
def enable(key, opts = {})
|
20
27
|
tags = opts.dup
|
21
28
|
condition = tags.delete(:if)
|
29
|
+
# convert to proc
|
30
|
+
if condition.is_a?(Symbol)
|
31
|
+
sym = condition
|
32
|
+
condition = ->(context) { method(sym).call(context) }
|
33
|
+
end
|
22
34
|
|
23
35
|
if condition
|
24
36
|
@features[key] = ::Flagship::Feature.new(key, condition, @context, @base_tags.merge(tags))
|
@@ -49,4 +61,8 @@ class Flagship::Dsl
|
|
49
61
|
def disabled?(key)
|
50
62
|
@flagset.disabled?(key)
|
51
63
|
end
|
64
|
+
|
65
|
+
def include(mod)
|
66
|
+
extend mod
|
67
|
+
end
|
52
68
|
end
|
data/lib/flagship/flagset.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
class Flagship::Flagset
|
2
|
-
attr_reader :key
|
2
|
+
attr_reader :key, :helper_methods
|
3
3
|
|
4
4
|
class UndefinedFlagError < ::StandardError; end
|
5
5
|
|
6
|
-
def initialize(key, features_hash, base = nil)
|
6
|
+
def initialize(key, features_hash, base = nil, helper_methods = [])
|
7
7
|
@key = key
|
8
8
|
@features = base ?
|
9
9
|
extend_features(features_hash, base) :
|
10
10
|
features_hash
|
11
|
+
@helper_methods = helper_methods
|
11
12
|
end
|
12
13
|
|
13
14
|
def enabled?(key)
|
data/lib/flagship/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flagship
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuya Takeyama
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -98,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
98
|
version: '0'
|
99
99
|
requirements: []
|
100
100
|
rubyforge_project:
|
101
|
-
rubygems_version: 2.
|
101
|
+
rubygems_version: 2.6.8
|
102
102
|
signing_key:
|
103
103
|
specification_version: 4
|
104
104
|
summary: Ship/unship features using flags defined with declarative DSL
|