punchout 0.0.4

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a28f37c6b1f21bf3390778bb0104757e9b1c2e81
4
+ data.tar.gz: de7232745143ba047eb6220f26f4e61e2def2947
5
+ SHA512:
6
+ metadata.gz: 4f2177f1aaceb39aeac074f449d4433fde323a6096348503abcc64e6d5f0030393d70a3183745424b41a5ebbd76a89f51f2c3a5b559267937faee0db4e3d9d33
7
+ data.tar.gz: 23d3be7c90f197b9b6e9412cfc00216ec2ceb61948b64d03a09232f836a9504751a2b155937e81076d549bc23a6921da925ac28b9afe291337359d4e44749978
@@ -0,0 +1,20 @@
1
+ require 'punchout/puncher'
2
+ require 'punchout/matcher/class'
3
+
4
+ module Punchout
5
+ module Punchable
6
+ def punchable?
7
+ true
8
+ end
9
+
10
+ attr_accessor :matcher
11
+
12
+ def puncher
13
+ @puncher ||= Puncher.new
14
+ end
15
+
16
+ def punch(obj)
17
+ puncher.punch(obj)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,17 @@
1
+ require 'punchout/puncher/matchable'
2
+
3
+ module Punchout
4
+ class Matcher
5
+ def initialize(subject)
6
+ @subject = subject
7
+ end
8
+
9
+ def punches(thing)
10
+ Punchout::Puncher::Matchable.new(self, thing)
11
+ end
12
+
13
+ def conflicts?(other)
14
+ false
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ require 'punchout/matcher'
2
+
3
+ module Punchout
4
+ class Matcher
5
+ class Ancestry < Matcher
6
+ def conflicts?(matcher)
7
+
8
+ end
9
+
10
+ def matches?(candidate)
11
+ (@subject >= candidate.class) == true
12
+ end
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,16 @@
1
+ require 'punchout/matcher'
2
+
3
+ module Punchout
4
+ class Matcher
5
+ class Klass < Matcher
6
+ def conflicts?(matcher)
7
+ false
8
+ end
9
+
10
+ def matches?(candidate)
11
+ @subject == candidate.class
12
+ end
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,16 @@
1
+ require 'punchout/matcher'
2
+
3
+ module Punchout
4
+ class Matcher
5
+ class Equal < Matcher
6
+ def conflicts?(matcher)
7
+
8
+ end
9
+
10
+ def matches?(candidate)
11
+ @subject == candidate
12
+ end
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,15 @@
1
+ require 'punchout/matcher'
2
+
3
+ module Punchout
4
+ class Matcher
5
+ class Progeny < Matcher
6
+ def conflicts?(matcher)
7
+
8
+ end
9
+
10
+ def matches?(candidate)
11
+ (@subject <= candidate.class) == true
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,32 @@
1
+ require 'punchout/puncher/matchable'
2
+ require 'punchout/puncher/matchables'
3
+
4
+ module Punchout
5
+ class Puncher
6
+ def initialize
7
+ @matchables = Matchables.new
8
+ end
9
+
10
+ def add(matchable)
11
+ if !matchable.kind_of?(Matchable)
12
+ raise
13
+ end
14
+
15
+ @matchables.add(matchable)
16
+ end
17
+
18
+ def can_punch?(type)
19
+ @matchables.include?(type)
20
+ end
21
+
22
+ def punch(type)
23
+
24
+ match = @matchables.find(type)
25
+
26
+ if match
27
+ match.thing
28
+ end
29
+ end
30
+ end
31
+ end
32
+
@@ -0,0 +1,20 @@
1
+ module Punchout
2
+ class Puncher
3
+ class Matchable
4
+ def initialize(matcher, thing)
5
+ @matcher = matcher
6
+ @thing = thing
7
+ end
8
+
9
+ attr_reader :thing
10
+
11
+ def matches?(subject)
12
+ @matcher.matches?(subject)
13
+ end
14
+
15
+ def conflicts?(other)
16
+ false
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ module Punchout
2
+ class Puncher
3
+ class Matchable
4
+ class Resolver
5
+ def initialize(matcher)
6
+ @matcher = matcher
7
+ end
8
+
9
+ def build(thing)
10
+ Matchable.new(@matcher,thing)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,36 @@
1
+ module Punchout
2
+ class Puncher
3
+ class Matchables
4
+ def initialize
5
+ @matchables = []
6
+ end
7
+
8
+ def add(matchable)
9
+ if conflicts?(matchable)
10
+ raise
11
+ end
12
+ @matchables << matchable
13
+ end
14
+
15
+ def include?(type)
16
+ @matchables.any? do |p|
17
+ p.matches?(type)
18
+ end
19
+ end
20
+
21
+ def find(type)
22
+ @matchables.find do |p|
23
+ p.matches?(type)
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def conflicts?(matchable)
30
+ @matchables.any? do |m|
31
+ m.conflicts?(matchable) || matchable.conflicts?(m)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,39 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ require 'punchout'
4
+ require 'punchout/matcher/class'
5
+
6
+ class Punchout::Test < ActiveSupport::TestCase
7
+ setup do
8
+ @punchout_klass = Class.new do
9
+ include Punchout::Punchable
10
+ end
11
+
12
+ @pairings = 3.times.map {
13
+ {match: Class.new, punchable: Class.new}
14
+ }
15
+ end
16
+
17
+ test "#punch" do
18
+ punchout = @punchout_klass.new
19
+ puncher = punchout.puncher
20
+
21
+ @pairings.each do |p|
22
+ matcher = Punchout::Matcher::Klass.new(p[:match])
23
+
24
+ matchable = matcher.punches(p[:punchable])
25
+
26
+ puncher.add(matchable)
27
+ end
28
+
29
+ expected = @pairings.first
30
+
31
+ expected_matching_instance = expected[:match].new
32
+
33
+ result = puncher.can_punch?(expected_matching_instance)
34
+ assert result, "#{punchout.puncher.inspect} CAN NOT PUNCH #{expected[:match]}"
35
+
36
+ result = puncher.punch(expected_matching_instance)
37
+ assert_equal expected[:punchable],result
38
+ end
39
+ end
@@ -0,0 +1,18 @@
1
+ $:.push('lib')
2
+
3
+ require 'coveralls'
4
+ Coveralls.wear!
5
+
6
+ if ENV["ENABLE_SIMPLE_COV"]
7
+ require 'simplecov'
8
+ # require File.expand_path('../simplecov_helper', __FILE__)
9
+ SimpleCov.start do
10
+ add_filter "test"
11
+ add_group 'API', "lib"
12
+ end
13
+ end
14
+
15
+ require 'active_support/time'
16
+ require 'active_support/test_case'
17
+ require 'test/unit'
18
+
@@ -0,0 +1,46 @@
1
+ require File.expand_path('../../../test_helper', __FILE__)
2
+
3
+ require 'punchout/matcher/ancestry'
4
+
5
+ class Punchout::Matcher::AncestryTest < ActiveSupport::TestCase
6
+ setup do
7
+ @ancestor_klass = Class.new
8
+
9
+ @base_klass = Class.new(@ancestor_klass)
10
+
11
+ @derived_klass = Class.new(@base_klass)
12
+
13
+ @independent_klass = Class.new
14
+
15
+ @mock_thing = mock
16
+ end
17
+
18
+ test "#match none" do
19
+ matcher = Punchout::Matcher::Ancestry.new(@derived_klass)
20
+ result = matcher.matches?(@independent_klass.new)
21
+
22
+ assert_equal false, result
23
+ end
24
+
25
+ test "#match should match equivalence" do
26
+ matcher = Punchout::Matcher::Ancestry.new(@base_klass)
27
+ result = matcher.matches?(@base_klass.new)
28
+
29
+ assert_equal true, result
30
+ end
31
+
32
+ test "#match should match descendant" do
33
+ matcher = Punchout::Matcher::Ancestry.new(@base_klass)
34
+ result = matcher.matches?(@derived_klass.new)
35
+
36
+ assert_equal true, result
37
+ end
38
+
39
+ test "#match should not match ancestor" do
40
+ matcher = Punchout::Matcher::Ancestry.new(@derived_klass)
41
+ result = matcher.matches?(@base_klass.new)
42
+
43
+ assert_equal false, result
44
+ end
45
+ end
46
+
@@ -0,0 +1,48 @@
1
+
2
+ require File.expand_path('../../../test_helper', __FILE__)
3
+
4
+ require 'punchout/matcher/class'
5
+
6
+ class Punchout::Matcher::KlassTest < ActiveSupport::TestCase
7
+ setup do
8
+ @ancestor_klass = Class.new
9
+
10
+ @base_klass = Class.new(@ancestor_klass)
11
+
12
+ @derived_klass = Class.new(@base_klass)
13
+
14
+ @independent_klass = Class.new
15
+
16
+ @mock_thing = mock
17
+ end
18
+
19
+ test "#match none" do
20
+ matcher = Punchout::Matcher::Klass.new(@derived_klass)
21
+ result = matcher.matches?(@independent_klass.new)
22
+
23
+ assert_equal false, result
24
+ end
25
+
26
+ test "#match should match equivalence" do
27
+ matcher = Punchout::Matcher::Klass.new(@base_klass)
28
+ result = matcher.matches?(@base_klass.new)
29
+
30
+ assert_equal true, result
31
+ end
32
+
33
+ test "#match should match descendant" do
34
+ matcher = Punchout::Matcher::Klass.new(@base_klass)
35
+ result = matcher.matches?(@derived_klass.new)
36
+
37
+ assert_equal false, result
38
+ end
39
+
40
+ test "#match should not match ancestor" do
41
+ matcher = Punchout::Matcher::Klass.new(@derived_klass)
42
+ result = matcher.matches?(@base_klass.new)
43
+
44
+ assert_equal false, result
45
+ end
46
+ end
47
+
48
+
@@ -0,0 +1,17 @@
1
+
2
+ require File.expand_path('../../../test_helper', __FILE__)
3
+
4
+ require 'punchout/matcher/equal'
5
+
6
+ class Punchout::Matcher::EqualTest < ActiveSupport::TestCase
7
+ test "#match none" do
8
+ matcher = Punchout::Matcher::Equal.new("foo")
9
+ assert_equal false, matcher.matches?("bar")
10
+ end
11
+
12
+ test "#match should match equivalence" do
13
+ matcher = Punchout::Matcher::Equal.new("foo")
14
+ assert_equal true, matcher.matches?("foo")
15
+ end
16
+
17
+ end
@@ -0,0 +1,47 @@
1
+ require File.expand_path('../../../test_helper', __FILE__)
2
+
3
+ require 'punchout/matcher/progeny'
4
+
5
+ class Punchout::Matcher::ProgenyTest < ActiveSupport::TestCase
6
+ setup do
7
+ @ancestor_klass = Class.new
8
+
9
+ @base_klass = Class.new(@ancestor_klass)
10
+
11
+ @derived_klass = Class.new(@base_klass)
12
+
13
+ @independent_klass = Class.new
14
+
15
+ @mock_thing = mock
16
+ end
17
+
18
+ test "#match none" do
19
+ matcher = Punchout::Matcher::Progeny.new(@derived_klass)
20
+ result = matcher.matches?(@independent_klass.new)
21
+
22
+ assert_equal false, result
23
+ end
24
+
25
+ test "#match should match equivalence" do
26
+ matcher = Punchout::Matcher::Progeny.new(@base_klass)
27
+ result = matcher.matches?(@base_klass.new)
28
+
29
+ assert_equal true, result
30
+ end
31
+
32
+ test "#match should match descendant" do
33
+ matcher = Punchout::Matcher::Progeny.new(@base_klass)
34
+ result = matcher.matches?(@derived_klass.new)
35
+
36
+ assert_equal false, result
37
+ end
38
+
39
+ test "#match should not match ancestor" do
40
+ matcher = Punchout::Matcher::Progeny.new(@derived_klass)
41
+ result = matcher.matches?(@base_klass.new)
42
+
43
+ assert_equal true, result
44
+ end
45
+ end
46
+
47
+
@@ -0,0 +1,22 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ require 'punchout/matcher'
4
+
5
+ class Punchout::MatcherTest < ActiveSupport::TestCase
6
+ setup do
7
+ @mock_subject = mock
8
+ @matcher = Punchout::Matcher.new(@mock_subject)
9
+ end
10
+
11
+ test "#punches" do
12
+ mock_thing = mock
13
+
14
+ mock_matchable = mock
15
+
16
+ Punchout::Puncher::Matchable.expects(:new).returns(mock_matchable)
17
+
18
+ result = @matcher.punches(mock_thing)
19
+
20
+ assert_equal result, mock_matchable
21
+ end
22
+ end
@@ -0,0 +1,29 @@
1
+ require File.expand_path('../../../test_helper', __FILE__)
2
+
3
+ require 'punchout/puncher/matchable'
4
+
5
+ class Punchout::Puncher::MatchableTest < ActiveSupport::TestCase
6
+ test "#matches? true" do
7
+ mock_matcher = mock
8
+ mock_thing = mock
9
+
10
+ mock_matcher.expects(:matches?).with(mock_thing).returns(true)
11
+ matchable = Punchout::Puncher::Matchable.new(mock_matcher, mock_thing)
12
+
13
+ result = matchable.matches?(mock_thing)
14
+
15
+ assert_equal true, result
16
+ end
17
+
18
+ test "#matches? false" do
19
+ mock_matcher = mock
20
+ mock_thing = mock
21
+
22
+ mock_matcher.expects(:matches?).with(mock_thing).returns(false)
23
+ matchable = Punchout::Puncher::Matchable.new(mock_matcher, mock_thing)
24
+
25
+ result = matchable.matches?(mock_thing)
26
+
27
+ assert_equal false, result
28
+ end
29
+ end
@@ -0,0 +1,68 @@
1
+ require File.expand_path('../../../test_helper', __FILE__)
2
+
3
+ require 'punchout/puncher/matchables'
4
+
5
+ class Punchout::Puncher::MatchablesTest < ActiveSupport::TestCase
6
+ setup do
7
+
8
+ @mock_matchables = 5.times.map {|x|
9
+ mock_matchable = mock
10
+ mock_matchable.expects(:conflicts?).at_least_once.returns(false)
11
+ mock_matchable
12
+ }
13
+
14
+ @matchables = Punchout::Puncher::Matchables.new
15
+
16
+ @mock_matchables.each {|p|
17
+ @matchables.add(p)
18
+ }
19
+
20
+ @mock_type = mock
21
+ end
22
+
23
+ test '#include? no match' do
24
+ @mock_matchables.each {|p|
25
+ p.expects(:matches?).with(@mock_type).returns(false)
26
+ }
27
+
28
+ result = @matchables.include?(@mock_type)
29
+
30
+ assert_equal false, result
31
+ end
32
+
33
+ test '#include? match located' do
34
+ @mock_matchables.take(4).each {|p|
35
+ p.expects(:matches?).with(@mock_type).returns(false)
36
+ }
37
+
38
+
39
+ @mock_matchables.last.expects(:matches?).with(@mock_type).returns(true)
40
+
41
+ result = @matchables.include?(@mock_type)
42
+
43
+ assert_equal true, result
44
+ end
45
+
46
+ test '#fetch no match' do
47
+ @mock_matchables.each {|p|
48
+ p.expects(:matches?).with(@mock_type).returns(false)
49
+ }
50
+
51
+ result = @matchables.find(@mock_type)
52
+
53
+ assert_equal nil, result
54
+ end
55
+
56
+ test '#fetch match located' do
57
+ @mock_matchables.take(4).each {|p|
58
+ p.expects(:matches?).with(@mock_type).returns(false)
59
+ }
60
+
61
+
62
+ @mock_matchables.last.expects(:matches?).with(@mock_type).returns(true)
63
+
64
+ result = @matchables.find(@mock_type)
65
+
66
+ assert_equal @mock_matchables.last, result
67
+ end
68
+ end
@@ -0,0 +1,39 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ require 'punchout/puncher'
4
+
5
+ class Punchout::PuncherTest < ActiveSupport::TestCase
6
+ setup do
7
+
8
+ @mock_matchables = mock
9
+
10
+ @puncher = Punchout::Puncher.new
11
+
12
+ @mock_type = mock
13
+ end
14
+
15
+ test '#punch no match' do
16
+ @mock_matchables.expects(:find).with(@mock_type).returns(nil)
17
+
18
+ @puncher.instance_variable_set(:@matchables, @mock_matchables)
19
+
20
+ result = @puncher.punch(@mock_type)
21
+
22
+ assert_equal nil, result
23
+ end
24
+
25
+ test '#punch match located' do
26
+ mock_matchable = mock
27
+
28
+ @mock_matchables.expects(:find).with(@mock_type).returns(mock_matchable)
29
+
30
+ mock_thing = mock
31
+ mock_matchable.expects(:thing).returns(mock_thing)
32
+
33
+ @puncher.instance_variable_set(:@matchables, @mock_matchables)
34
+
35
+ result = @puncher.punch(@mock_type)
36
+
37
+ assert_equal mock_thing, result
38
+ end
39
+ end
@@ -0,0 +1,74 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ require 'punchout'
4
+
5
+ class Punchout::PunchableTest < ActiveSupport::TestCase
6
+ test "#include" do
7
+ @klass = Class.new do
8
+ include Punchout::Punchable
9
+ end
10
+ end
11
+
12
+ test "#puncher greenfield" do
13
+ @klass = Class.new do
14
+ include Punchout::Punchable
15
+ end
16
+
17
+ instance = @klass.new
18
+
19
+ mock_matcher_klass = mock
20
+
21
+ mock_puncher = mock
22
+ Punchout::Puncher.expects(:new).returns(mock_puncher)
23
+
24
+ instance.matcher = mock_matcher_klass
25
+
26
+ result = instance.puncher
27
+
28
+ assert_equal mock_puncher, result
29
+ end
30
+
31
+ test "#puncher cached" do
32
+ @klass = Class.new do
33
+ include Punchout::Punchable
34
+ end
35
+
36
+ instance = @klass.new
37
+
38
+ mock_matcher_klass = mock
39
+
40
+ mock_puncher = mock
41
+
42
+ instance.matcher = mock_matcher_klass
43
+ instance.instance_variable_set(:@puncher, mock_puncher)
44
+
45
+ result = instance.puncher
46
+
47
+ assert_equal mock_puncher, result
48
+ end
49
+
50
+ test "#punch" do
51
+ @klass = Class.new do
52
+ include Punchout::Punchable
53
+ end
54
+
55
+ instance = @klass.new
56
+
57
+ mock_matcher_klass = mock
58
+
59
+ mock_puncher = mock
60
+
61
+ instance.matcher = mock_matcher_klass
62
+ instance.instance_variable_set(:@puncher, mock_puncher)
63
+
64
+ mock_obj = mock
65
+
66
+ mock_punched = mock
67
+ mock_puncher.expects(:punch).with(mock_obj).returns(mock_punched)
68
+
69
+ result = instance.punch(mock_obj)
70
+
71
+ assert_equal mock_punched, result
72
+ end
73
+ end
74
+
@@ -0,0 +1,18 @@
1
+ $:.push('lib')
2
+
3
+ require 'coveralls'
4
+ Coveralls.wear!
5
+
6
+ if ENV["ENABLE_SIMPLE_COV"]
7
+ require 'simplecov'
8
+ # require File.expand_path('../simplecov_helper', __FILE__)
9
+ SimpleCov.start do
10
+ add_filter "test"
11
+ add_group 'API', "lib"
12
+ end
13
+ end
14
+
15
+ require 'active_support/time'
16
+ require 'active_support/test_case'
17
+ require 'test/unit'
18
+
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: punchout
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ platform: ruby
6
+ authors:
7
+ - Ed Carrel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-11-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: active_support
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mocha
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: simplecov
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: A flexible implementation of the Registry pattern, with an extensible
56
+ finder/matcher mechanism.
57
+ email:
58
+ - edward@carrel.org
59
+ - ed@pocketchange.com
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - lib/punchout/matcher/ancestry.rb
65
+ - lib/punchout/matcher/class.rb
66
+ - lib/punchout/matcher/equal.rb
67
+ - lib/punchout/matcher/progeny.rb
68
+ - lib/punchout/matcher.rb
69
+ - lib/punchout/puncher/matchable/resolver.rb
70
+ - lib/punchout/puncher/matchable.rb
71
+ - lib/punchout/puncher/matchables.rb
72
+ - lib/punchout/puncher.rb
73
+ - lib/punchout.rb
74
+ - test/integration/punchout_test.rb
75
+ - test/integration/test_helper.rb
76
+ - test/unit/punchout/matcher/ancestry_test.rb
77
+ - test/unit/punchout/matcher/class_test.rb
78
+ - test/unit/punchout/matcher/equal_test.rb
79
+ - test/unit/punchout/matcher/progeny_test.rb
80
+ - test/unit/punchout/matcher_test.rb
81
+ - test/unit/punchout/puncher/matchable_test.rb
82
+ - test/unit/punchout/puncher/matchables_test.rb
83
+ - test/unit/punchout/puncher_test.rb
84
+ - test/unit/punchout_test.rb
85
+ - test/unit/test_helper.rb
86
+ homepage:
87
+ licenses:
88
+ - MIT
89
+ metadata: {}
90
+ post_install_message:
91
+ rdoc_options: []
92
+ require_paths:
93
+ - lib
94
+ required_ruby_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ required_rubygems_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ requirements: []
105
+ rubyforge_project:
106
+ rubygems_version: 2.1.10
107
+ signing_key:
108
+ specification_version: 4
109
+ summary: A flexible registry pattern gem
110
+ test_files: []
111
+ has_rdoc: