rflags 0.1.0 → 0.1.1

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: 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: