rflags 0.1.0 → 0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4e189abe3d250038bcc8060c64d3cb8d14c11df2
4
- data.tar.gz: 58d25ae13e6f8127cf9b27963f4536e0cef32628
3
+ metadata.gz: 777559cce034a5c0198966e148f18bd3e363f878
4
+ data.tar.gz: a5dcddfda202f53578037ef52687332c68c77a51
5
5
  SHA512:
6
- metadata.gz: 546ea83be0666bb1e309ad435621824d029153d3752f214962f704e20f7a812098165a16a0e088ee65f2fd03de14b24abdf18af61bafb69de4d9223001333faa
7
- data.tar.gz: 67e7a8d667c1311b059a2a5880892dc6cfa3d40536668ae4d108581415918f573c8af701424f97d9cadea75d9916c503237477a5e87258b06dc5fa5fb73d1aa1
6
+ metadata.gz: bc795e572b4aa88327b9af539da8f55351414e4891bc655de72b4528390dfee5580647a4d10f01753e79fe2bbd910c0d6b4676e88a03257baf2bf85e2859c85f
7
+ data.tar.gz: 8d660af52d41c2f4045cf2c837b1a190b54c7538a112af145f15e94c84ceb086bffceb23ff657e7491af88e48dc1e99682acf666354162bb7736dbc59321f4e5
@@ -5,39 +5,60 @@ require 'rflags/redis_flag'
5
5
 
6
6
  module RFlags
7
7
  def flag(definition)
8
- case definition
9
- when Symbol, String
10
- define_flag(definition, RFlags::Flag.new)
11
- when Hash
12
- definition.each do |name, backend|
13
- define_flag(name, resolve_flag_backend(backend))
8
+ name, backend = resolve_flag_params(definition)
9
+ instance_variable_set("@#{name}".to_sym, backend)
10
+ instance_eval <<-MTD, __FILE__, __LINE__
11
+ def #{name}
12
+ @#{name}
14
13
  end
15
- else
16
- raise TypeError,
17
- "RFlags#flag expects Symbol, String or Hash, but have #{definition.class}"
18
- end
14
+ MTD
19
15
  end
20
16
 
21
- private
17
+ def lazy_flag(name, &block)
18
+ if !block
19
+ raise "RFlags##{__method__} needs a block"
20
+ end
22
21
 
23
- def define_flag(name, backend)
24
- instance_variable_set(:"@#{name}", backend)
22
+ resolve = -> do
23
+ opts = block.call
24
+ resolve_flag_backend_class(opts).new(*opts)
25
+ end
26
+
27
+ instance_variable_set(:"@#{name}_block", resolve)
25
28
  instance_eval(<<-MTD, __FILE__, __LINE__)
26
- def #{name}; @#{name}; end
29
+ def #{name}
30
+ @#{name} ||= @#{name}_block.call
31
+ end
27
32
  MTD
28
33
  end
29
34
 
30
- def resolve_flag_backend(backend)
31
- case backend
32
- when String
33
- RFlags::FileFlag.new(backend)
35
+ private
36
+
37
+ def resolve_flag_params(definition)
38
+ case definition
39
+ when String, Symbol
40
+ [definition, RFlags::Flag.new]
41
+ when Hash
42
+ name = definition.keys[0]
43
+
44
+ backend_opts = definition[name]
45
+ backend_class = resolve_flag_backend_class(backend_opts)
46
+
47
+ [name, backend_class.new(*backend_opts)]
48
+ else
49
+ raise TypeError, "Can't handle #{definition.class}"
50
+ end
51
+ end
52
+
53
+ def resolve_flag_backend_class(opts)
54
+ case opts
55
+ when String, Pathname
56
+ RFlags::FileFlag
34
57
  when Array
35
- ::Object.const_get("::RFlags::#{backend[0].class}Flag")
36
- .new(*backend)
58
+ class_name = opts[0].class
59
+ ::Object.const_get("::RFlags::#{class_name}Flag")
37
60
  else
38
- raise TypeError,
39
- "Wrong backend definition for RFlags#flag.\n" <<
40
- "Backend should be instance of String or Array, but have #{backend.class}"
61
+ raise TypeError, "Can't handle #{opts.class}"
41
62
  end
42
63
  end
43
64
  end
@@ -1,5 +1,6 @@
1
1
  class TestFileFlag < Minitest::Test
2
2
  def setup
3
+ FileUtils.mkdir_p('tmp')
3
4
  @flag = RFlags::FileFlag.new('tmp/file_flag')
4
5
  FileUtils.rm_f('tmp/file_flag')
5
6
  end
@@ -8,6 +8,8 @@ class TestRFlags < Minitest::Test
8
8
  flag :flag_a
9
9
  flag :flag_b => 'tmp/flag_b'
10
10
  flag :flag_c => [Redis, 'key']
11
+ flag :flag_d => Pathname.new('tmp/flag_d')
12
+ lazy_flag(:flag_e) { Pathname.new('tmp/flag_e') }
11
13
  end
12
14
 
13
15
  def test_it_defines_flag_method
@@ -26,10 +28,18 @@ class TestRFlags < Minitest::Test
26
28
  assert_instance_of RFlags::RedisFlag, Flags.flag_c
27
29
  end
28
30
 
31
+ def test_it_defines_file_flag_from_pathname
32
+ assert_instance_of RFlags::FileFlag, Flags.flag_d
33
+ end
34
+
29
35
  def test_resolve_exception
30
36
  error = assert_raises(TypeError) do
31
- Flags.flag wrong: Pathname.new('.')
37
+ Flags.flag wrong: Struct.new(:a)
32
38
  end
33
- assert_match(/but have Pathname/, error.message)
39
+ assert_match(/Can't handle Class/, error.message)
40
+ end
41
+
42
+ def test_it_defines_lazy_evaluated_flag
43
+ assert_instance_of RFlags::FileFlag, Flags.flag_e
34
44
  end
35
45
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rflags
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Lutsiuk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-28 00:00:00.000000000 Z
11
+ date: 2015-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -81,3 +81,4 @@ signing_key:
81
81
  specification_version: 4
82
82
  summary: Boolean flags with different backends
83
83
  test_files: []
84
+ has_rdoc: