descendants_tracker 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,13 +1,32 @@
1
+ # encoding: utf-8
2
+
1
3
  # Module that adds descendant tracking to a class
2
4
  module DescendantsTracker
3
5
 
6
+ # @private
7
+ def self.extended(descendant)
8
+ setup(descendant)
9
+ end
10
+ private_class_method :extended
11
+
12
+ # @return [Array]
13
+ #
14
+ # @private
15
+ def self.setup(descendant)
16
+ descendant.instance_variable_set('@descendants', [])
17
+ end
18
+ private_class_method :extended
19
+
4
20
  # Return the descendants of this class
5
21
  #
22
+ # @example
23
+ # descendants = ParentClass.descendants
24
+ #
6
25
  # @return [Array<Class>]
7
26
  #
8
- # @api private
27
+ # @api public
9
28
  def descendants
10
- @descendants ||= []
29
+ @descendants
11
30
  end
12
31
 
13
32
  # Add the descendant to this class and the superclass
@@ -18,8 +37,10 @@ module DescendantsTracker
18
37
  #
19
38
  # @api private
20
39
  def add_descendant(descendant)
21
- superclass = self.superclass
22
- superclass.add_descendant(descendant) if superclass.respond_to?(:add_descendant)
40
+ ancestor = superclass
41
+ if ancestor.respond_to?(:add_descendant)
42
+ ancestor.add_descendant(descendant)
43
+ end
23
44
  descendants.unshift(descendant)
24
45
  self
25
46
  end
@@ -30,11 +51,12 @@ private
30
51
  #
31
52
  # @param [Class] descendant
32
53
  #
33
- # @return [undefined]
54
+ # @return [self]
34
55
  #
35
56
  # @api private
36
57
  def inherited(descendant)
37
58
  super
59
+ DescendantsTracker.setup(descendant)
38
60
  add_descendant(descendant)
39
61
  end
40
62
 
@@ -1,3 +1,8 @@
1
+ # encoding: utf-8
2
+
1
3
  module DescendantsTracker
2
- VERSION = '0.0.1'.freeze
3
- end
4
+
5
+ # Unreleased gem version
6
+ VERSION = '0.0.2'.freeze
7
+
8
+ end # module DescendantsTracker
@@ -1,11 +1,30 @@
1
1
  # encoding: utf-8
2
2
 
3
+ require 'devtools/spec_helper'
4
+
5
+ if ENV['COVERAGE'] == 'true'
6
+ require 'simplecov'
7
+ require 'coveralls'
8
+
9
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
10
+ SimpleCov::Formatter::HTMLFormatter,
11
+ Coveralls::SimpleCov::Formatter
12
+ ]
13
+
14
+ SimpleCov.start do
15
+ command_name 'spec:unit'
16
+ add_filter 'config'
17
+ add_filter 'spec'
18
+ minimum_coverage 100
19
+ end
20
+ end
21
+
3
22
  require 'descendants_tracker'
4
- require 'spec'
5
- require 'spec/autorun'
6
23
 
7
24
  # require spec support files and shared behavior
8
- Dir[File.expand_path('../{support,shared}/**/*.rb', __FILE__)].each { |f| require f }
25
+ Dir[File.expand_path('../{support,shared}/**/*.rb', __FILE__)].each do |file|
26
+ require file
27
+ end
9
28
 
10
- Spec::Runner.configure do |config|
29
+ RSpec.configure do |config|
11
30
  end
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'rbconfig'
2
4
 
3
5
  ::Config = RbConfig unless defined?(::Config)
@@ -1,24 +1,26 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe DescendantsTracker, '#add_descendant' do
4
6
  subject { object.add_descendant(descendant) }
5
7
 
6
8
  let(:described_class) { Class.new { extend DescendantsTracker } }
7
- let(:object) { Class.new(described_class) }
8
- let(:descendant) { Class.new }
9
+ let(:object) { Class.new(described_class) }
10
+ let(:descendant) { Class.new }
9
11
 
10
- it { should equal(object) }
12
+ it_should_behave_like 'a command method'
11
13
 
12
14
  it 'prepends the class to the descendants' do
13
15
  object.descendants << original = Class.new
14
- expect { subject }.to change { object.descendants.dup }.
15
- from([ original ]).
16
- to([ descendant, original ])
16
+ expect { subject }.to change { object.descendants.dup }
17
+ .from([original])
18
+ .to([descendant, original])
17
19
  end
18
20
 
19
21
  it 'prepends the class to the superclass descendants' do
20
- expect { subject }.to change { object.superclass.descendants.dup }.
21
- from([ object ]).
22
- to([ descendant, object ])
22
+ expect { subject }.to change { object.superclass.descendants.dup }
23
+ .from([object])
24
+ .to([descendant, object])
23
25
  end
24
26
  end
@@ -1,10 +1,12 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe DescendantsTracker, '#descendants' do
4
6
  subject { object.descendants }
5
7
 
6
8
  let(:described_class) { Class.new { extend DescendantsTracker } }
7
- let(:object) { described_class }
9
+ let(:object) { described_class }
8
10
 
9
11
  context 'when there are no descendants' do
10
12
  it_should_behave_like 'an idempotent method'
@@ -17,6 +19,6 @@ describe DescendantsTracker, '#descendants' do
17
19
 
18
20
  it_should_behave_like 'an idempotent method'
19
21
 
20
- it { should eql([ descendant ]) }
22
+ it { should eql([descendant]) }
21
23
  end
22
24
  end
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe DescendantsTracker, '#inherited' do
6
+ subject { Class.new(object) }
7
+
8
+ let!(:object) { Class.new(superklass).extend(self.class.described_class) }
9
+ let(:superklass) { Class.new }
10
+
11
+ it 'delegates to the superclass #inherited method' do
12
+ superklass.should_receive(:inherited) do |descendant|
13
+ descendant.should be_instance_of(Class)
14
+ descendant.ancestors.should include(object)
15
+ end
16
+ subject
17
+ end
18
+
19
+ it 'adds the descendant' do
20
+ expect(object.descendants).to include(subject)
21
+ end
22
+
23
+ it 'sets up descendants in the child class' do
24
+ expect(subject.descendants).to eql([])
25
+ end
26
+ end
metadata CHANGED
@@ -1,141 +1,123 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: descendants_tracker
3
- version: !ruby/object:Gem::Version
4
- hash: 29
5
- prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 1
10
- version: 0.0.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Dan Kubb
14
8
  - Piotr Solnica
15
9
  - Markus Schirp
16
10
  autorequire:
17
11
  bindir: bin
18
12
  cert_chain: []
19
-
20
- date: 2012-11-24 00:00:00 Z
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
13
+ date: 2013-10-05 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
23
16
  name: rake
24
- prerelease: false
25
- requirement: &id001 !ruby/object:Gem::Requirement
26
- none: false
27
- requirements:
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
28
19
  - - ~>
29
- - !ruby/object:Gem::Version
30
- hash: 75
31
- segments:
32
- - 10
33
- - 0
34
- - 2
35
- version: 10.0.2
20
+ - !ruby/object:Gem::Version
21
+ version: 10.1.0
36
22
  type: :development
37
- version_requirements: *id001
38
- - !ruby/object:Gem::Dependency
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ version: 10.1.0
29
+ - !ruby/object:Gem::Dependency
39
30
  name: rspec
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ~>
34
+ - !ruby/object:Gem::Version
35
+ version: 2.13.0
36
+ type: :development
40
37
  prerelease: false
41
- requirement: &id002 !ruby/object:Gem::Requirement
42
- none: false
43
- requirements:
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
44
40
  - - ~>
45
- - !ruby/object:Gem::Version
46
- hash: 31
47
- segments:
48
- - 1
49
- - 3
50
- - 2
51
- version: 1.3.2
41
+ - !ruby/object:Gem::Version
42
+ version: 2.13.0
43
+ - !ruby/object:Gem::Dependency
44
+ name: yard
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ~>
48
+ - !ruby/object:Gem::Version
49
+ version: 0.8.6.1
52
50
  type: :development
53
- version_requirements: *id002
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ~>
55
+ - !ruby/object:Gem::Version
56
+ version: 0.8.6.1
54
57
  description: Module that adds descendant tracking to a class
55
- email:
58
+ email:
56
59
  - dan.kubb@gmail.com
57
60
  - piotr.solnica@gmail.com
58
- - mbj@seonic.net
61
+ - mbj@schirp-dso.com
59
62
  executables: []
60
-
61
63
  extensions: []
62
-
63
- extra_rdoc_files:
64
+ extra_rdoc_files:
64
65
  - LICENSE
65
66
  - README.md
66
67
  - TODO
67
- files:
68
+ files:
68
69
  - .gitignore
69
70
  - .rvmrc
70
71
  - .travis.yml
71
72
  - Gemfile
73
+ - Gemfile.devtools
72
74
  - Guardfile
73
75
  - LICENSE
74
76
  - README.md
75
77
  - Rakefile
76
78
  - TODO
79
+ - config/devtools.yml
77
80
  - config/flay.yml
78
81
  - config/flog.yml
79
- - config/roodi.yml
80
- - config/site.reek
82
+ - config/mutant.yml
83
+ - config/reek.yml
84
+ - config/rubocop.yml
81
85
  - config/yardstick.yml
82
86
  - descendants_tracker.gemspec
83
87
  - lib/descendants_tracker.rb
84
88
  - lib/descendants_tracker/version.rb
85
89
  - spec/rcov.opts
86
- - spec/shared/command_method_behavior.rb
87
- - spec/shared/each_method_behaviour.rb
88
- - spec/shared/hash_method_behavior.rb
89
- - spec/shared/idempotent_method_behavior.rb
90
- - spec/shared/invertible_method_behaviour.rb
91
90
  - spec/spec.opts
92
91
  - spec/spec_helper.rb
93
92
  - spec/support/config_alias.rb
94
93
  - spec/unit/descendants_tracker/add_descendant_spec.rb
95
94
  - spec/unit/descendants_tracker/descendants_spec.rb
96
- - tasks/metrics/ci.rake
97
- - tasks/metrics/flay.rake
98
- - tasks/metrics/flog.rake
99
- - tasks/metrics/heckle.rake
100
- - tasks/metrics/metric_fu.rake
101
- - tasks/metrics/reek.rake
102
- - tasks/metrics/roodi.rake
103
- - tasks/metrics/yardstick.rake
104
- - tasks/spec.rake
105
- - tasks/yard.rake
95
+ - spec/unit/descendants_tracker/inherited_spec.rb
106
96
  homepage: https://github.com/dkubb/descendants_tracker
107
97
  licenses: []
108
-
98
+ metadata: {}
109
99
  post_install_message:
110
100
  rdoc_options: []
111
-
112
- require_paths:
101
+ require_paths:
113
102
  - lib
114
- required_ruby_version: !ruby/object:Gem::Requirement
115
- none: false
116
- requirements:
117
- - - ">="
118
- - !ruby/object:Gem::Version
119
- hash: 3
120
- segments:
121
- - 0
122
- version: "0"
123
- required_rubygems_version: !ruby/object:Gem::Requirement
124
- none: false
125
- requirements:
126
- - - ">="
127
- - !ruby/object:Gem::Version
128
- hash: 3
129
- segments:
130
- - 0
131
- version: "0"
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - '>='
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
132
113
  requirements: []
133
-
134
114
  rubyforge_project:
135
- rubygems_version: 1.8.24
115
+ rubygems_version: 2.0.2
136
116
  signing_key:
137
- specification_version: 3
117
+ specification_version: 4
138
118
  summary: Module that adds descendant tracking to a class
139
- test_files: []
140
-
119
+ test_files:
120
+ - spec/unit/descendants_tracker/add_descendant_spec.rb
121
+ - spec/unit/descendants_tracker/descendants_spec.rb
122
+ - spec/unit/descendants_tracker/inherited_spec.rb
141
123
  has_rdoc:
@@ -1,18 +0,0 @@
1
- ---
2
- AbcMetricMethodCheck: { score: 10.3 }
3
- AssignmentInConditionalCheck: { }
4
- CaseMissingElseCheck: { }
5
- ClassLineCountCheck: { line_count: 293 }
6
- ClassNameCheck: { pattern: !ruby/regexp '/\A(?:[A-Z]+|[A-Z][a-z](?:[A-Z]?[a-z])+)\z/' }
7
- ClassVariableCheck: { }
8
- CyclomaticComplexityBlockCheck: { complexity: 2 }
9
- CyclomaticComplexityMethodCheck: { complexity: 4 }
10
- EmptyRescueBodyCheck: { }
11
- ForLoopCheck: { }
12
- # TODO: decrease line_count to 5 to 10
13
- MethodLineCountCheck: { line_count: 14 }
14
- MethodNameCheck: { pattern: !ruby/regexp '/\A(?:[a-z\d](?:_?[a-z\d])+[?!=]?|\[\]=?|==|<=>|[+*&|-])\z/' }
15
- ModuleLineCountCheck: { line_count: 295 }
16
- ModuleNameCheck: { pattern: !ruby/regexp '/\A(?:[A-Z]+|[A-Z][a-z](?:[A-Z]?[a-z])+)\z/' }
17
- # TODO: decrease parameter_count to 2 or less
18
- ParameterNumberCheck: { parameter_count: 3 }
@@ -1,7 +0,0 @@
1
- # encoding: utf-8
2
-
3
- shared_examples_for 'a command method' do
4
- it 'returns self' do
5
- should equal(object)
6
- end
7
- end
@@ -1,15 +0,0 @@
1
- # encoding: utf-8
2
-
3
- shared_examples_for 'an #each method' do
4
- it_should_behave_like 'a command method'
5
-
6
- context 'with no block' do
7
- subject { object.each }
8
-
9
- it { should be_instance_of(to_enum.class) }
10
-
11
- it 'yields the expected values' do
12
- subject.to_a.should eql(object.to_a)
13
- end
14
- end
15
- end