concord 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2bdb5ade2038b5884813deb9d527d44ddeed1322
4
+ data.tar.gz: 3f7a3684bd50c715622730568f9e99eb510273da
5
+ SHA512:
6
+ metadata.gz: ef6645627811abf8ea289ede8ed2ef4ed6af2b04c5b8548cef13a3697dafa2a13cffdc439b8cfc962c263d1cf24b1af3de71736608d066870001065af31b9316
7
+ data.tar.gz: 798fe84211b8dca1afec360dc8b86b1d2519f605df699d21dd56314f1a54bc6f36d629a8afb257111b78d6cc2af311f174def3f38b239a0eb241b5146549e28c
@@ -1,18 +1,19 @@
1
1
  language: ruby
2
2
  script: 'bundle exec rake ci'
3
3
  rvm:
4
- - ree
5
- - 1.8.7
6
4
  - 1.9.2
7
5
  - 1.9.3
8
6
  - 2.0.0
9
7
  - ruby-head
10
- - jruby-18mode
11
8
  - jruby-19mode
12
9
  - jruby-head
13
- - rbx-18mode
14
10
  - rbx-19mode
11
+ matrix:
12
+ allow_failures:
13
+ - rvm: ruby-head
15
14
  notifications:
16
- irc: "irc.freenode.org#datamapper"
17
- email:
18
- - mbj@seonic.net
15
+ irc:
16
+ channels:
17
+ - irc.freenode.org#rom-rb
18
+ on_success: never
19
+ on_failure: change
data/Gemfile CHANGED
@@ -2,5 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- gem 'devtools', :git => 'https://github.com/datamapper/devtools.git'
5
+ gem 'devtools', :git => 'https://github.com/rom-rb/devtools.git'
6
6
  eval File.read('Gemfile.devtools')
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  group :development do
4
- gem 'rake', '~> 10.0.4'
4
+ gem 'rake', '~> 10.1.0'
5
5
  gem 'rspec', '~> 2.13.0'
6
6
  gem 'yard', '~> 0.8.6.1'
7
7
  end
@@ -11,12 +11,12 @@ group :yard do
11
11
  end
12
12
 
13
13
  group :guard do
14
- gem 'guard', '~> 1.8.0'
14
+ gem 'guard', '~> 1.8.1'
15
15
  gem 'guard-bundler', '~> 1.0.0'
16
- gem 'guard-rspec', '~> 2.5.4'
16
+ gem 'guard-rspec', '~> 3.0.2'
17
17
 
18
18
  # file system change event handling
19
- gem 'listen', '~> 1.0.2'
19
+ gem 'listen', '~> 1.2.2'
20
20
  gem 'rb-fchange', '~> 0.0.6', :require => false
21
21
  gem 'rb-fsevent', '~> 0.9.3', :require => false
22
22
  gem 'rb-inotify', '~> 0.9.0', :require => false
@@ -28,20 +28,20 @@ group :guard do
28
28
  end
29
29
 
30
30
  group :metrics do
31
- gem 'backports', '~> 3.3', '>= 3.3.0'
32
- gem 'coveralls', '~> 0.6.6'
33
- gem 'flay', '~> 2.2.0'
34
- gem 'flog', '~> 4.0.0'
35
- gem 'reek', '~> 1.3.1', :git => 'https://github.com/troessner/reek.git'
36
- gem 'simplecov', '~> 0.7.1'
37
- gem 'yardstick', '~> 0.9.6'
31
+ gem 'backports', '~> 3.3', '>= 3.3.2'
32
+ gem 'coveralls', '~> 0.6.7'
33
+ gem 'flay', '~> 2.3.0'
34
+ gem 'flog', '~> 4.1.0'
35
+ gem 'reek', '~> 1.3.1', :git => 'https://github.com/troessner/reek.git'
36
+ gem 'simplecov', '~> 0.7.1'
37
+ gem 'yardstick', '~> 0.9.6'
38
38
 
39
39
  platforms :ruby_19 do
40
40
  gem 'yard-spellcheck', '~> 0.1.5'
41
41
  end
42
42
 
43
- platforms :mri_19, :rbx do
44
- gem 'mutant', '~> 0.2.20'
43
+ platforms :ruby_19, :ruby_20 do
44
+ gem 'mutant', '~> 0.3.0.beta6'
45
45
  end
46
46
 
47
47
  platforms :rbx do
data/README.md CHANGED
@@ -12,7 +12,7 @@ class ComposedObject
12
12
  include Equalizer.new(:foo, :bar)
13
13
 
14
14
  # Return foo
15
- #
15
+ #
16
16
  # @return [Foo]
17
17
  #
18
18
  # @api private
@@ -54,6 +54,11 @@ end
54
54
 
55
55
  Sure the replacement is missing YARD docs, but IMHO it is better.
56
56
 
57
+ Rubies
58
+ ------
59
+
60
+ Tested under all >= 1.9 rubies.
61
+
57
62
  Installation
58
63
  ------------
59
64
 
data/Rakefile CHANGED
@@ -1,29 +1,2 @@
1
1
  require 'devtools'
2
2
  Devtools.init_rake_tasks
3
-
4
- class Rake::Task
5
- def overwrite(&block)
6
- @actions.clear
7
- enhance(&block)
8
- end
9
- end
10
-
11
- Rake.application.load_imports
12
-
13
- begin
14
- require 'mutant'
15
- rescue LoadError
16
- end
17
-
18
- mutant_present = defined?(Mutant)
19
-
20
- allowed_versions = %w(mri-1.9.3 rbx-1.9.3)
21
-
22
- if allowed_versions.include?(Devtools.rvm) and mutant_present and !ENV['DEVTOOLS_SELF']
23
- Rake::Task['metrics:mutant'].overwrite do
24
- status = Mutant::CLI.run(%W(--rspec-full -r ./spec/spec_helper.rb ::Concord))
25
- unless status.zero?
26
- fail "Not mutation covered :("
27
- end
28
- end
29
- end
@@ -2,10 +2,10 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'concord'
5
- s.version = '0.1.1'
5
+ s.version = '0.1.2'
6
6
  s.authors = ['Markus Schirp']
7
- s.email = ['mbj@seonic.net']
8
- s.homepage = 'https://github.com/mbj/composition'
7
+ s.email = ['mbj@schirp-dso.com']
8
+ s.homepage = 'https://github.com/mbj/concord'
9
9
  s.summary = %q{Helper for object composition}
10
10
  s.description = s.summary
11
11
 
@@ -14,6 +14,6 @@ Gem::Specification.new do |s|
14
14
  s.executables = []
15
15
  s.require_paths = ['lib']
16
16
 
17
- s.add_dependency('adamantium', '~> 0.0.7')
18
- s.add_dependency('equalizer', '~> 0.0.5')
17
+ s.add_dependency('adamantium', '~> 0.0.10')
18
+ s.add_dependency('equalizer', '~> 0.0.5')
19
19
  end
@@ -1,3 +1,3 @@
1
1
  ---
2
- threshold: 5
3
- total_score: 13.0
2
+ threshold: 3
3
+ total_score: 16.0
@@ -1,2 +1,2 @@
1
1
  ---
2
- threshold: 10.0
2
+ threshold: 23.3
@@ -1,2 +1,3 @@
1
1
  name: concord
2
2
  namespace: Concord
3
+ strategy: --rspec-unit
@@ -46,7 +46,8 @@ UncommunicativeModuleName:
46
46
  - !ruby/regexp /[0-9]$/
47
47
  NestedIterators:
48
48
  ignore_iterators: []
49
- exclude: []
49
+ exclude:
50
+ - Concord#define_initialize
50
51
  enabled: true
51
52
  max_allowed_nesting: 1
52
53
  TooManyStatements:
@@ -1,10 +1,10 @@
1
1
  ---
2
- AbcMetricMethodCheck:
2
+ AbcMetricMethodCheck:
3
3
  score: 25.1
4
4
  AssignmentInConditionalCheck: { }
5
5
  CaseMissingElseCheck: { }
6
6
  ClassLineCountCheck: { line_count: 317 }
7
- ClassNameCheck:
7
+ ClassNameCheck:
8
8
  pattern: !ruby/regexp /\A(?:[A-Z]+|[A-Z][a-z](?:[A-Z]?[a-z])+)\z/
9
9
  ClassVariableCheck: { }
10
10
  CyclomaticComplexityBlockCheck: { complexity: 3 }
@@ -12,9 +12,9 @@ CyclomaticComplexityMethodCheck: { complexity: 4 }
12
12
  EmptyRescueBodyCheck: { }
13
13
  ForLoopCheck: { }
14
14
  MethodLineCountCheck: { line_count: 14 }
15
- MethodNameCheck:
15
+ MethodNameCheck:
16
16
  pattern: !ruby/regexp /\A(?:[a-z\d](?:_?[a-z\d])+[?!=]?|\[\]=?|==|<=>|<<|[+*&|-])\z/
17
17
  ModuleLineCountCheck: { line_count: 320 }
18
- ModuleNameCheck:
18
+ ModuleNameCheck:
19
19
  pattern: !ruby/regexp /\A(?:[A-Z]+|[A-Z][a-z](?:[A-Z]?[a-z])+)\z/
20
20
  ParameterNumberCheck: { parameter_count: 3 }
@@ -5,6 +5,9 @@ require 'equalizer'
5
5
  class Concord < Module
6
6
  include Adamantium::Flat, Equalizer.new(:names)
7
7
 
8
+ # The maximum number of objects the hosting class is composed of
9
+ MAX_NR_OF_OBJECTS = 3
10
+
8
11
  # Return names
9
12
  #
10
13
  # @return [Enumerable<Symbol>]
@@ -13,7 +16,7 @@ class Concord < Module
13
16
  #
14
17
  attr_reader :names
15
18
 
16
- private
19
+ private
17
20
 
18
21
  # Initialize object
19
22
  #
@@ -22,8 +25,8 @@ private
22
25
  # @api private
23
26
  #
24
27
  def initialize(*names)
25
- if names.length > 3
26
- raise 'Composition of more than three objects is not allowed'
28
+ if names.length > MAX_NR_OF_OBJECTS
29
+ raise "Composition of more than #{MAX_NR_OF_OBJECTS} objects is not allowed"
27
30
  end
28
31
 
29
32
  @names = names
@@ -38,7 +41,7 @@ private
38
41
  # @api private
39
42
  #
40
43
  def included(descendant)
41
- define_initializer(descendant)
44
+ define_initialize(descendant)
42
45
  define_readers(descendant)
43
46
  define_equalizer(descendant)
44
47
  end
@@ -65,11 +68,13 @@ private
65
68
  #
66
69
  def define_readers(descendant)
67
70
  attribute_names = names
68
- descendant.send(:attr_reader, *attribute_names)
69
- descendant.send(:protected, *attribute_names)
71
+ descendant.class_eval do
72
+ attr_reader *attribute_names
73
+ protected *attribute_names
74
+ end
70
75
  end
71
76
 
72
- # Define initializer
77
+ # Define initialize method
73
78
  #
74
79
  # @param [Class|Module] descendant
75
80
  #
@@ -77,13 +82,18 @@ private
77
82
  #
78
83
  # @api private
79
84
  #
80
- def define_initializer(descendant)
81
- names = argument_names
82
- descendant.class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
83
- def initialize(#{names}) # def initialize(foo, bar)
84
- #{instance_variable_names} = #{names} # @foo, @bar = foo, bar
85
- end # end
86
- RUBY
85
+ def define_initialize(descendant)
86
+ ivars, size = instance_variable_names, names.size
87
+ descendant.class_eval do
88
+ define_method :initialize do |*args|
89
+ args_size = args.size
90
+ if args_size != size
91
+ raise ArgumentError,
92
+ "wrong number of arguments (#{args_size} for #{size})"
93
+ end
94
+ ivars.zip(args) { |ivar, arg| instance_variable_set(ivar, arg) }
95
+ end
96
+ end
87
97
  end
88
98
 
89
99
  # Return instance variable names
@@ -93,23 +103,13 @@ private
93
103
  # @api private
94
104
  #
95
105
  def instance_variable_names
96
- names.map { |name| "@#{name}" }.join(', ')
97
- end
98
-
99
- # Return param names
100
- #
101
- # @return [String]
102
- #
103
- # @api private
104
- #
105
- def argument_names
106
- names.join(', ')
106
+ names.map { |name| "@#{name}" }
107
107
  end
108
108
 
109
109
  # Mixin for public attribute readers
110
110
  class Public < self
111
111
 
112
- # Hook called when module is included
112
+ # Hook called when module is included
113
113
  #
114
114
  # @param [Class,Module] descendant
115
115
  #
@@ -16,48 +16,68 @@ describe Concord do
16
16
  let(:bar) { mock('Bar') }
17
17
 
18
18
  context 'initializer lines' do
19
- unless Devtools.jruby?
20
- it 'sets initializer correctly' do
21
- klass = Class.new
22
- # Nicer way to assert this?
23
- klass.should_receive(:class_eval) do |code, file, line|
24
- file.should eql(File.expand_path('../../../../lib/concord.rb', __FILE__))
25
- line.should be(83)
26
- end
27
- klass.send(:include, Concord.new)
28
- end
19
+ it 'creates a private #initialize method' do
20
+ mod = Module.new
21
+ expect { mod.send(:include, Concord.new) }.
22
+ to change { mod.private_method_defined?(:initialize) }.
23
+ from(false).to(true)
24
+ end
25
+
26
+ it 'creates an initializer that asserts the number of arguments' do
27
+ expect { class_under_test.new(1) }.
28
+ to raise_error(ArgumentError, 'wrong number of arguments (1 for 2)')
29
+ end
30
+
31
+ it 'creates an initializer that allows 2 arguments' do
32
+ expect { class_under_test.new(1, 2) }.to_not raise_error
33
+ end
34
+
35
+ it 'creates an initializer that sets the instance variables' do
36
+ instance = class_under_test.new(1, 2)
37
+ expect(instance.instance_variable_get(:@foo)).to be(1)
38
+ expect(instance.instance_variable_get(:@bar)).to be(2)
29
39
  end
30
40
  end
31
41
 
32
- context 'visibiluty' do
33
- it 'should set attribute readers to public' do
34
- klass = Class.new
35
- klass.send(:include, Concord.new(:foo))
36
- klass.protected_instance_methods.map(&:to_sym).should == [:foo]
42
+ context 'with no objects to compose' do
43
+ it 'assigns no ivars' do
44
+ instance = Class.new { include Concord.new }.new
45
+ expect(instance.instance_variables).to be_empty
46
+ end
47
+ end
48
+
49
+ context 'visibility' do
50
+ it 'should set attribute readers to protected' do
51
+ protected_methods = class_under_test.protected_instance_methods
52
+ expect(protected_methods).to match_array([:foo, :bar])
37
53
  end
38
54
  end
39
55
 
40
56
  context 'attribute behavior' do
41
57
  subject { instance_a }
42
58
 
43
- specify { subject.send(:foo).should be(foo) }
44
- specify { subject.send(:bar).should be(bar) }
59
+ specify { expect(subject.send(:foo)).to be(foo) }
60
+ specify { expect(subject.send(:bar)).to be(bar) }
45
61
  end
46
62
 
47
63
  context 'equalization behavior' do
48
64
  specify 'composed objects are equalized on attributes' do
49
- instance_a.should == instance_b
50
- instance_a.hash.should == instance_b.hash
51
- instance_a.should eql(instance_b)
52
-
53
- instance_a.should_not == instance_c
54
- instance_a.should_not eql(instance_c)
65
+ expect(instance_a).to eql(instance_b)
66
+ expect(instance_a.hash).to eql(instance_b.hash)
67
+ expect(instance_a).to eql(instance_b)
68
+ expect(instance_a).to_not be(instance_c)
69
+ expect(instance_a).to_not eql(instance_c)
55
70
  end
56
71
  end
57
72
 
58
- context 'to much composition behavior' do
73
+ context 'when composing too many objects' do
59
74
  specify 'it raises an error' do
60
- expect { Concord.new(:a, :b, :c, :d) }.to raise_error(RuntimeError, 'Composition of more than three objects is not allowed')
75
+ expect {
76
+ Concord.new(:a, :b, :c, :d)
77
+ }.to raise_error(RuntimeError, 'Composition of more than 3 objects is not allowed')
78
+ expect {
79
+ Concord.new(:a, :b, :c)
80
+ }.to_not raise_error
61
81
  end
62
82
  end
63
83
 
@@ -70,8 +90,8 @@ describe Concord do
70
90
 
71
91
  it 'should create public attr readers' do
72
92
  object = class_under_test.new(:foo, :bar)
73
- object.foo.should eql(:foo)
74
- object.bar.should eql(:bar)
93
+ expect(object.foo).to eql(:foo)
94
+ expect(object.bar).to eql(:bar)
75
95
  end
76
96
  end
77
97
  end
metadata CHANGED
@@ -1,36 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: concord
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
5
- prerelease:
4
+ version: 0.1.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Markus Schirp
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-05-21 00:00:00.000000000 Z
11
+ date: 2013-07-07 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: adamantium
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
21
- version: 0.0.7
19
+ version: 0.0.10
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
29
- version: 0.0.7
26
+ version: 0.0.10
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: equalizer
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,14 +34,13 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
45
40
  version: 0.0.5
46
41
  description: Helper for object composition
47
42
  email:
48
- - mbj@seonic.net
43
+ - mbj@schirp-dso.com
49
44
  executables: []
50
45
  extensions: []
51
46
  extra_rdoc_files: []
@@ -70,29 +65,28 @@ files:
70
65
  - lib/concord.rb
71
66
  - spec/spec_helper.rb
72
67
  - spec/unit/concord/universal_spec.rb
73
- homepage: https://github.com/mbj/composition
68
+ homepage: https://github.com/mbj/concord
74
69
  licenses: []
70
+ metadata: {}
75
71
  post_install_message:
76
72
  rdoc_options: []
77
73
  require_paths:
78
74
  - lib
79
75
  required_ruby_version: !ruby/object:Gem::Requirement
80
- none: false
81
76
  requirements:
82
- - - ! '>='
77
+ - - '>='
83
78
  - !ruby/object:Gem::Version
84
79
  version: '0'
85
80
  required_rubygems_version: !ruby/object:Gem::Requirement
86
- none: false
87
81
  requirements:
88
- - - ! '>='
82
+ - - '>='
89
83
  - !ruby/object:Gem::Version
90
84
  version: '0'
91
85
  requirements: []
92
86
  rubyforge_project:
93
- rubygems_version: 1.8.23
87
+ rubygems_version: 2.0.2
94
88
  signing_key:
95
- specification_version: 3
89
+ specification_version: 4
96
90
  summary: Helper for object composition
97
91
  test_files: []
98
92
  has_rdoc: