flagship 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c9f85fb317ee229493f115ec7c65647e75660a0f
4
- data.tar.gz: 449021917bc8f499d51ae96a20eb76c3192bfcc3
3
+ metadata.gz: 152c5eda261cabe740a9ffc0b42c86aa43f98365
4
+ data.tar.gz: ffe613bc7a54e1f473570705b30a36fca4dbbfac
5
5
  SHA512:
6
- metadata.gz: faffff4c99df31cf5b2e4addc170fe651274917b3d093fd6fdb84917dacbfc677b904fe0f336ae6238084acf62e356700a8b9243193ef8972a845e5f132006f3
7
- data.tar.gz: d4d2b1cf9e573615f92616e71a1f29800f0dad42819724a9a97961b24e853b16357b5d5e260f25399ba80027b3542ea1d0517a60e37a968b2f47ca54505d9c97
6
+ metadata.gz: 12fee08a5382b52a4dd31dbaecebfdd454204167c6520370cf7481e3dba517b115a1cd84942cf81e72b1eff20d12ddce61c51e78be31cee4a9bd90c80fb92452
7
+ data.tar.gz: a9b877654a436dc9fe154c8849d6fbc3afcef2db6e713a35f71fbc0af7afdd02d00e32dd50fad070464e2db337f5b5f45587ef4e84088af438d474e10abc63dd
data/CHANGELOG.md ADDED
@@ -0,0 +1,19 @@
1
+ # Change Log
2
+
3
+ ## [0.2.0] - 2016-11-14
4
+
5
+ ### Added
6
+
7
+ - `Flagship.features` method to fetch all `Flagship::Feature`
8
+ - Tagging
9
+ - `Flagship.select_flagset` instead of `Flagship.set_flagset`
10
+
11
+ ### Deprecated
12
+
13
+ - `Flagship.set_flagset` method
14
+
15
+ ## [0.1.0] - 2016-10-30
16
+
17
+ ### Added
18
+
19
+ - Initial release
data/README.md CHANGED
@@ -29,7 +29,7 @@ Flagship.define :app do
29
29
  disable :deprecate_feature
30
30
  end
31
31
 
32
- Flagship.set_flagset(:app)
32
+ Flagship.select_flagset(:app)
33
33
  ```
34
34
 
35
35
  ### Branch with a flag
@@ -55,7 +55,7 @@ Flagship.set_context :foo, ->(context) { 'FOO' }
55
55
  Or you can set a method too.
56
56
 
57
57
  ```rb
58
- Flagship.set_method :current_user, method(:current_user)
58
+ Flagship.set_context :current_user, method(:current_user)
59
59
  ```
60
60
 
61
61
  ### Extend flagset
@@ -74,18 +74,44 @@ Flagship.define :production, extend: :common do
74
74
  end
75
75
 
76
76
  if Rails.env.production?
77
- Flagset.set_flagset(:production)
77
+ Flagship.select_flagset(:production)
78
78
  else
79
- Flagset.set_flagset(:development)
79
+ Flagship.select_flagset(:development)
80
80
  end
81
81
  ```
82
82
 
83
83
  ### Override flag with ENV
84
84
 
85
- You can override flags with ENV named `FLAG_***`.
85
+ You can override flags with ENV named `FLAGSHIP_***`.
86
86
 
87
87
  Assuming that there is a flag `:foo`, you can override it with ENV `FLAGSHIP_FOO=1`.
88
88
 
89
+ ### Fetch all features
90
+
91
+ ```rb
92
+ Flagship.features
93
+ # => Array of Flagship::Feature
94
+
95
+ Flagship.features.map(&:key)
96
+ # => Array key of enabled features
97
+ ```
98
+
99
+ ### Categorize features with tags
100
+
101
+ ```rb
102
+ Flagship.define :blog do
103
+ enable :post
104
+ enable :comment, communication: true
105
+ enable :trackback, communication: true
106
+ end
107
+
108
+ Flagship.select_flagset(:blog)
109
+
110
+ # Fetch keys of enabled communication features
111
+ Flagship.features.select{ |feature| feature.tags[:communication] && feature.enabled? }.map(&:key)
112
+ # => [:comment, :trackback]
113
+ ```
114
+
89
115
  ## Development
90
116
 
91
117
  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/dsl.rb CHANGED
@@ -5,26 +5,29 @@ class Flagship::Dsl
5
5
  @key = key
6
6
  @context = context
7
7
  @base = base
8
- @flags = {}
8
+ @features = {}
9
9
  @definition = block
10
10
  end
11
11
 
12
12
  def enable(key, opts = {})
13
- if opts[:if]
14
- @flags[key] = opts[:if]
13
+ opts = opts.dup
14
+ condition = opts.delete(:if)
15
+
16
+ if condition
17
+ @features[key] = ::Flagship::Feature.new(key, condition, @context, opts)
15
18
  else
16
- @flags[key] = true
19
+ @features[key] = ::Flagship::Feature.new(key, true, @context, opts)
17
20
  end
18
21
  end
19
22
 
20
23
  def disable(key, opts = {})
21
24
  raise InvalidOptionError.new("Option :if is not available for #disable") if opts[:if]
22
25
 
23
- @flags[key] = false
26
+ @features[key] = ::Flagship::Feature.new(key, false, @context, opts)
24
27
  end
25
28
 
26
29
  def flagset
27
30
  instance_eval(&@definition)
28
- ::Flagship::Flagset.new(@key, @flags, @context, @base)
31
+ ::Flagship::Flagset.new(@key, @features, @base)
29
32
  end
30
33
  end
@@ -0,0 +1,29 @@
1
+ class Flagship::Feature
2
+ attr_reader :key, :tags
3
+
4
+ def initialize(key, enabled, context, tags = {})
5
+ @key = key
6
+ @enabled = enabled
7
+ @context = context
8
+ @tags = tags
9
+ end
10
+
11
+ def enabled?
12
+ env = ENV['FLAGSHIP_' + key.to_s.upcase]
13
+
14
+ if env
15
+ case env.downcase
16
+ when '1', 'true'
17
+ return true
18
+ when '0', 'false', ''
19
+ return false
20
+ end
21
+ end
22
+
23
+ if @enabled.respond_to?(:call)
24
+ !!@enabled.call(@context)
25
+ else
26
+ !!@enabled
27
+ end
28
+ end
29
+ end
@@ -1,34 +1,23 @@
1
1
  class Flagship::Flagset
2
- attr_reader :key, :flags
2
+ attr_reader :key
3
3
 
4
4
  class UndefinedFlagError < ::StandardError; end
5
5
 
6
- def initialize(key, flags, context, base = nil)
6
+ def initialize(key, features_hash, base = nil)
7
7
  @key = key
8
- @flags = base ? base.flags.merge(flags) : flags
9
- @context = context
8
+ @features = base ?
9
+ base.features.map{ |f| [f.key, f] }.to_h.merge(features_hash) :
10
+ features_hash
10
11
  end
11
12
 
12
- def enabled?(key, if: nil)
13
- raise UndefinedFlagError.new("The flag :#{key} is not defined") unless @flags.key? key
13
+ def enabled?(key)
14
+ raise UndefinedFlagError.new("The flag :#{key} is not defined") unless @features.key? key
14
15
 
15
- env = ENV['FLAGSHIP_' + key.to_s.upcase]
16
16
 
17
- if env
18
- case env.downcase
19
- when '1', 'true'
20
- return true
21
- when '0', 'false', ''
22
- return false
23
- end
24
- end
25
-
26
- flag = @flags[key]
17
+ @features[key].enabled?
18
+ end
27
19
 
28
- if flag.respond_to?(:call)
29
- !!@flags[key].call(@context)
30
- else
31
- !!@flags[key]
32
- end
20
+ def features
21
+ @features.map { |key, feature| feature }
33
22
  end
34
23
  end
@@ -1,3 +1,3 @@
1
1
  module Flagship
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/flagship.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "flagship/version"
2
2
  require "flagship/context"
3
3
  require "flagship/dsl"
4
+ require "flagship/feature"
4
5
  require "flagship/flagset"
5
6
  require "flagship/flagsets_container"
6
7
 
@@ -21,10 +22,20 @@ module Flagship
21
22
  self.default_context.__set(key, value)
22
23
  end
23
24
 
24
- def self.set_flagset(key)
25
+ def self.select_flagset(key)
25
26
  @@current_flagset = self.default_flagsets_container.get(key)
26
27
  end
27
28
 
29
+ # Deprecated: Use select_flagset
30
+ def self.set_flagset(key)
31
+ warn "[DEPRECATION] `set_flagset` is deprecated. Please use `select_flagset` instead."
32
+ self.select_flagset(key)
33
+ end
34
+
35
+ def self.features
36
+ self.current_flagset.features
37
+ end
38
+
28
39
  def self.get_flagset(key)
29
40
  self.default_flagsets_container.get(key)
30
41
  end
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.1.0
4
+ version: 0.2.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: 2016-10-30 00:00:00.000000000 Z
11
+ date: 2016-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -62,6 +62,7 @@ files:
62
62
  - ".gitignore"
63
63
  - ".rspec"
64
64
  - ".travis.yml"
65
+ - CHANGELOG.md
65
66
  - Gemfile
66
67
  - LICENSE.txt
67
68
  - README.md
@@ -72,6 +73,7 @@ files:
72
73
  - lib/flagship.rb
73
74
  - lib/flagship/context.rb
74
75
  - lib/flagship/dsl.rb
76
+ - lib/flagship/feature.rb
75
77
  - lib/flagship/flagset.rb
76
78
  - lib/flagship/flagsets_container.rb
77
79
  - lib/flagship/version.rb