concord 0.1.1 → 0.1.6

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
+ SHA256:
3
+ metadata.gz: 00e1baf3ada59ca39db75ee30475ab7f0cee4de044b7e3656f9de5265e7468a9
4
+ data.tar.gz: 709c2cce624598048899d5335dc45d1922caccb4aa9347bbf010477de9145496
5
+ SHA512:
6
+ metadata.gz: 6e79d310bb26e6291a5935d1dbe5a91dce9cac422cd9922971b14dc5429e6c284aaa4f5777fc42a506599b79a0034275377d514f15c42b152282dc0651ffb551
7
+ data.tar.gz: 9211e15e7bf7ccfa4dd7c20f1768cf72c6362a82e0066a308c0342cae2eabd5ea29efed345c27ab0c0d5250b208a7c7f27e3d2e38b03fc1e8577778d6054f476
@@ -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,68 +25,70 @@ 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
+ fail "Composition of more than #{MAX_NR_OF_OBJECTS} objects is not allowed"
27
30
  end
28
31
 
29
- @names = names
32
+ @names, @module = names, Module.new
33
+ define_initialize
34
+ define_readers
35
+ define_equalizer
30
36
  end
31
37
 
32
38
  # Hook run when module is included
33
39
  #
34
- # @param [Class|Module] descendant
35
- #
36
40
  # @return [undefined]
37
41
  #
38
42
  # @api private
39
43
  #
40
44
  def included(descendant)
41
- define_initializer(descendant)
42
- define_readers(descendant)
43
- define_equalizer(descendant)
45
+ descendant.send(:include, @module)
44
46
  end
45
47
 
46
48
  # Define equalizer
47
49
  #
48
- # @param [Class|Module] descendant
49
- #
50
50
  # @return [undefined]
51
51
  #
52
52
  # @api private
53
53
  #
54
- def define_equalizer(descendant)
55
- descendant.send(:include, Equalizer.new(*@names))
54
+ def define_equalizer
55
+ @module.send(:include, Equalizer.new(*@names))
56
56
  end
57
57
 
58
58
  # Define readers
59
59
  #
60
- # @param [Class|Module] descendant
61
- #
62
60
  # @return [undefined]
63
61
  #
64
62
  # @api private
65
63
  #
66
- def define_readers(descendant)
64
+ def define_readers
67
65
  attribute_names = names
68
- descendant.send(:attr_reader, *attribute_names)
69
- descendant.send(:protected, *attribute_names)
66
+ @module.class_eval do
67
+ attr_reader(*attribute_names)
68
+ protected(*attribute_names)
69
+ end
70
70
  end
71
71
 
72
- # Define initializer
73
- #
74
- # @param [Class|Module] descendant
72
+ # Define initialize method
75
73
  #
76
74
  # @return [undefined]
77
75
  #
78
76
  # @api private
79
77
  #
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
78
+ # rubocop:disable MethodLength
79
+ #
80
+ def define_initialize
81
+ ivars, size = instance_variable_names, names.size
82
+ @module.class_eval do
83
+ define_method :initialize do |*args|
84
+ args_size = args.size
85
+ if args_size != size
86
+ fail ArgumentError, "wrong number of arguments (#{args_size} for #{size})"
87
+ end
88
+ ivars.zip(args) { |ivar, arg| instance_variable_set(ivar, arg) }
89
+ end
90
+ private :initialize
91
+ end
87
92
  end
88
93
 
89
94
  # Return instance variable names
@@ -93,23 +98,13 @@ private
93
98
  # @api private
94
99
  #
95
100
  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(', ')
101
+ names.map { |name| "@#{name}" }
107
102
  end
108
103
 
109
104
  # Mixin for public attribute readers
110
105
  class Public < self
111
106
 
112
- # Hook called when module is included
107
+ # Hook called when module is included
113
108
  #
114
109
  # @param [Class,Module] descendant
115
110
  #
metadata CHANGED
@@ -1,98 +1,86 @@
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.6
6
5
  platform: ruby
7
6
  authors:
8
7
  - Markus Schirp
9
- autorequire:
8
+ autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-05-21 00:00:00.000000000 Z
11
+ date: 2020-09-10 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.2.0
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.2.0
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
37
- version: 0.0.5
33
+ version: 0.0.9
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
- version: 0.0.5
40
+ version: 0.0.9
41
+ - !ruby/object:Gem::Dependency
42
+ name: devtools
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.1.26
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.1.26
46
55
  description: Helper for object composition
47
56
  email:
48
- - mbj@seonic.net
57
+ - mbj@schirp-dso.com
49
58
  executables: []
50
59
  extensions: []
51
60
  extra_rdoc_files: []
52
61
  files:
53
- - .gitignore
54
- - .rspec
55
- - .travis.yml
56
- - Changelog.md
57
- - Gemfile
58
- - Gemfile.devtools
59
- - Guardfile
60
- - LICENSE
61
- - README.md
62
- - Rakefile
63
- - concord.gemspec
64
- - config/flay.yml
65
- - config/flog.yml
66
- - config/mutant.yml
67
- - config/reek.yml
68
- - config/roodi.yml
69
- - config/yardstick.yml
70
62
  - lib/concord.rb
71
- - spec/spec_helper.rb
72
- - spec/unit/concord/universal_spec.rb
73
- homepage: https://github.com/mbj/composition
74
- licenses: []
75
- post_install_message:
63
+ homepage: https://github.com/mbj/concord
64
+ licenses:
65
+ - MIT
66
+ metadata: {}
67
+ post_install_message:
76
68
  rdoc_options: []
77
69
  require_paths:
78
70
  - lib
79
71
  required_ruby_version: !ruby/object:Gem::Requirement
80
- none: false
81
72
  requirements:
82
- - - ! '>='
73
+ - - ">="
83
74
  - !ruby/object:Gem::Version
84
- version: '0'
75
+ version: 1.9.3
85
76
  required_rubygems_version: !ruby/object:Gem::Requirement
86
- none: false
87
77
  requirements:
88
- - - ! '>='
78
+ - - ">="
89
79
  - !ruby/object:Gem::Version
90
80
  version: '0'
91
81
  requirements: []
92
- rubyforge_project:
93
- rubygems_version: 1.8.23
94
- signing_key:
95
- specification_version: 3
82
+ rubygems_version: 3.0.3
83
+ signing_key:
84
+ specification_version: 4
96
85
  summary: Helper for object composition
97
86
  test_files: []
98
- has_rdoc:
data/.gitignore DELETED
@@ -1,4 +0,0 @@
1
- /tmp
2
- /Gemfile.lock
3
- /.bundle
4
- /vendor
data/.rspec DELETED
@@ -1,5 +0,0 @@
1
- --color
2
- --format progress
3
- --profile
4
- --order random
5
- --fail-fast
@@ -1,18 +0,0 @@
1
- language: ruby
2
- script: 'bundle exec rake ci'
3
- rvm:
4
- - ree
5
- - 1.8.7
6
- - 1.9.2
7
- - 1.9.3
8
- - 2.0.0
9
- - ruby-head
10
- - jruby-18mode
11
- - jruby-19mode
12
- - jruby-head
13
- - rbx-18mode
14
- - rbx-19mode
15
- notifications:
16
- irc: "irc.freenode.org#datamapper"
17
- email:
18
- - mbj@seonic.net
@@ -1,19 +0,0 @@
1
- # v0.1.1 2013-05-15
2
-
3
- + Add Concord::Public mixin defaulting to public attr_readers
4
-
5
- # v0.1.0 2013-05-15
6
-
7
- * [change] Set default attribute visibility to protected
8
-
9
- # v0.0.3 2013-03-08
10
-
11
- * [fix] 1.9.2 visibility problem
12
-
13
- # v0.0.2 2013-03-07
14
-
15
- * [change] remove unneded backports dependency
16
-
17
- # v0.0.1 2013-03-06
18
-
19
- * First public release!
data/Gemfile DELETED
@@ -1,6 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec
4
-
5
- gem 'devtools', :git => 'https://github.com/datamapper/devtools.git'
6
- eval File.read('Gemfile.devtools')
@@ -1,60 +0,0 @@
1
- # encoding: utf-8
2
-
3
- group :development do
4
- gem 'rake', '~> 10.0.4'
5
- gem 'rspec', '~> 2.13.0'
6
- gem 'yard', '~> 0.8.6.1'
7
- end
8
-
9
- group :yard do
10
- gem 'kramdown', '~> 1.0.1'
11
- end
12
-
13
- group :guard do
14
- gem 'guard', '~> 1.8.0'
15
- gem 'guard-bundler', '~> 1.0.0'
16
- gem 'guard-rspec', '~> 2.5.4'
17
-
18
- # file system change event handling
19
- gem 'listen', '~> 1.0.2'
20
- gem 'rb-fchange', '~> 0.0.6', :require => false
21
- gem 'rb-fsevent', '~> 0.9.3', :require => false
22
- gem 'rb-inotify', '~> 0.9.0', :require => false
23
-
24
- # notification handling
25
- gem 'libnotify', '~> 0.8.0', :require => false
26
- gem 'rb-notifu', '~> 0.0.4', :require => false
27
- gem 'terminal-notifier-guard', '~> 1.5.3', :require => false
28
- end
29
-
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'
38
-
39
- platforms :ruby_19 do
40
- gem 'yard-spellcheck', '~> 0.1.5'
41
- end
42
-
43
- platforms :mri_19, :rbx do
44
- gem 'mutant', '~> 0.2.20'
45
- end
46
-
47
- platforms :rbx do
48
- gem 'pelusa', '~> 0.2.2'
49
- end
50
- end
51
-
52
- group :benchmarks do
53
- gem 'rbench', '~> 0.2.3'
54
- end
55
-
56
- platform :jruby do
57
- group :jruby do
58
- gem 'jruby-openssl', '~> 0.8.5'
59
- end
60
- end
data/Guardfile DELETED
@@ -1,8 +0,0 @@
1
- # A sample Guardfile
2
- # More info at https://github.com/guard/guard#readme
3
-
4
- guard 'rspec' do
5
- watch(%r{^spec/.+_spec\.rb$})
6
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
- watch('spec/spec_helper.rb') { "spec" }
8
- end
data/LICENSE DELETED
@@ -1,20 +0,0 @@
1
- Copyright (c) 2012 Markus Schirp
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
10
-
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
13
-
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md DELETED
@@ -1,81 +0,0 @@
1
- concord
2
- =======
3
-
4
- [![Build Status](https://secure.travis-ci.org/mbj/concord.png?branch=master)](http://travis-ci.org/mbj/concord)
5
- [![Dependency Status](https://gemnasium.com/mbj/concord.png)](https://gemnasium.com/mbj/concord)
6
- [![Code Climate](https://codeclimate.com/github/mbj/concord.png)](https://codeclimate.com/github/mbj/concord)
7
-
8
- Library to transform this:
9
-
10
- ```ruby
11
- class ComposedObject
12
- include Equalizer.new(:foo, :bar)
13
-
14
- # Return foo
15
- #
16
- # @return [Foo]
17
- #
18
- # @api private
19
- #
20
- attr_reader :foo
21
- protected :foo
22
-
23
- # Return bar
24
- #
25
- # @return [Bar]
26
- #
27
- # @api private
28
- #
29
- attr_reader :bar
30
- protected :bar
31
-
32
- # Initialize object
33
- #
34
- # @param [Foo] foo
35
- # @param [Bar] bar
36
- #
37
- # @return [undefined]
38
- #
39
- # @api private
40
- #
41
- def initialize(foo, bar)
42
- @foo, @bar = foo, bar
43
- end
44
- end
45
- ```
46
-
47
- Into shorter and easier to parse by eyes:
48
-
49
- ```ruby
50
- class ComposedObject
51
- include Concord.new(:foo, :bar)
52
- end
53
- ```
54
-
55
- Sure the replacement is missing YARD docs, but IMHO it is better.
56
-
57
- Installation
58
- ------------
59
-
60
- Install the gem `concord` via your prefered method.
61
-
62
- Credits
63
- -------
64
-
65
- * [mbj](https://github.com/mbj)
66
-
67
- Contributing
68
- -------------
69
-
70
- * Fork the project.
71
- * Make your feature addition or bug fix.
72
- * Add tests for it. This is important so I don't break it in a
73
- future version unintentionally.
74
- * Commit, do not mess with Rakefile or version
75
- (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
76
- * Send me a pull request. Bonus points for topic branches.
77
-
78
- License
79
- -------
80
-
81
- See LICENSE
data/Rakefile DELETED
@@ -1,29 +0,0 @@
1
- require 'devtools'
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
@@ -1,19 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
- Gem::Specification.new do |s|
4
- s.name = 'concord'
5
- s.version = '0.1.1'
6
- s.authors = ['Markus Schirp']
7
- s.email = ['mbj@seonic.net']
8
- s.homepage = 'https://github.com/mbj/composition'
9
- s.summary = %q{Helper for object composition}
10
- s.description = s.summary
11
-
12
- s.files = `git ls-files`.split("\n")
13
- s.test_files = `git ls-files -- {spec}/*`.split("\n")
14
- s.executables = []
15
- s.require_paths = ['lib']
16
-
17
- s.add_dependency('adamantium', '~> 0.0.7')
18
- s.add_dependency('equalizer', '~> 0.0.5')
19
- end
@@ -1,3 +0,0 @@
1
- ---
2
- threshold: 5
3
- total_score: 13.0
@@ -1,2 +0,0 @@
1
- ---
2
- threshold: 10.0
@@ -1,2 +0,0 @@
1
- name: concord
2
- namespace: Concord
@@ -1,90 +0,0 @@
1
- UncommunicativeParameterName:
2
- accept: []
3
- exclude: []
4
- enabled: true
5
- reject:
6
- - !ruby/regexp /^.$/
7
- - !ruby/regexp /[0-9]$/
8
- - !ruby/regexp /[A-Z]/
9
- TooManyMethods:
10
- max_methods: 14
11
- enabled: true
12
- exclude: []
13
- max_instance_variables: 4
14
- UncommunicativeMethodName:
15
- accept: []
16
- exclude: []
17
- enabled: true
18
- reject:
19
- - !ruby/regexp /^[a-z]$/
20
- - !ruby/regexp /[0-9]$/
21
- - !ruby/regexp /[A-Z]/
22
- LongParameterList:
23
- max_params: 2
24
- exclude: []
25
- enabled: true
26
- overrides: {}
27
- FeatureEnvy:
28
- exclude:
29
- - Concord#define_readers
30
- enabled: true
31
- ClassVariable:
32
- exclude: []
33
- enabled: true
34
- BooleanParameter:
35
- exclude: []
36
- enabled: true
37
- IrresponsibleModule:
38
- exclude: []
39
- enabled: true
40
- UncommunicativeModuleName:
41
- accept: []
42
- exclude: []
43
- enabled: true
44
- reject:
45
- - !ruby/regexp /^.$/
46
- - !ruby/regexp /[0-9]$/
47
- NestedIterators:
48
- ignore_iterators: []
49
- exclude: []
50
- enabled: true
51
- max_allowed_nesting: 1
52
- TooManyStatements:
53
- max_statements: 5
54
- exclude: []
55
- enabled: true
56
- DuplicateMethodCall:
57
- allow_calls: []
58
- exclude: []
59
- enabled: true
60
- max_calls: 1
61
- UtilityFunction:
62
- max_helper_calls: 0
63
- exclude: []
64
- enabled: true
65
- Attribute:
66
- exclude: []
67
- enabled: false
68
- UncommunicativeVariableName:
69
- accept: []
70
- exclude: []
71
- enabled: true
72
- reject:
73
- - !ruby/regexp /^.$/
74
- - !ruby/regexp /[0-9]$/
75
- - !ruby/regexp /[A-Z]/
76
- RepeatedConditional:
77
- enabled: true
78
- max_ifs: 1
79
- DataClump:
80
- exclude: []
81
- enabled: true
82
- max_copies: 0
83
- min_clump_size: 2
84
- ControlParameter:
85
- exclude: []
86
- enabled: true
87
- LongYieldList:
88
- max_params: 0
89
- exclude: []
90
- enabled: true
@@ -1,20 +0,0 @@
1
- ---
2
- AbcMetricMethodCheck:
3
- score: 25.1
4
- AssignmentInConditionalCheck: { }
5
- CaseMissingElseCheck: { }
6
- ClassLineCountCheck: { line_count: 317 }
7
- ClassNameCheck:
8
- pattern: !ruby/regexp /\A(?:[A-Z]+|[A-Z][a-z](?:[A-Z]?[a-z])+)\z/
9
- ClassVariableCheck: { }
10
- CyclomaticComplexityBlockCheck: { complexity: 3 }
11
- CyclomaticComplexityMethodCheck: { complexity: 4 }
12
- EmptyRescueBodyCheck: { }
13
- ForLoopCheck: { }
14
- MethodLineCountCheck: { line_count: 14 }
15
- MethodNameCheck:
16
- pattern: !ruby/regexp /\A(?:[a-z\d](?:_?[a-z\d])+[?!=]?|\[\]=?|==|<=>|<<|[+*&|-])\z/
17
- ModuleLineCountCheck: { line_count: 320 }
18
- ModuleNameCheck:
19
- pattern: !ruby/regexp /\A(?:[A-Z]+|[A-Z][a-z](?:[A-Z]?[a-z])+)\z/
20
- ParameterNumberCheck: { parameter_count: 3 }
@@ -1,2 +0,0 @@
1
- ---
2
- threshold: 100
@@ -1,3 +0,0 @@
1
- require 'devtools'
2
- require 'concord'
3
- Devtools.init_spec_helper
@@ -1,77 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Concord do
4
-
5
- let(:class_under_test) do
6
- Class.new do
7
- include Concord.new(:foo, :bar)
8
- end
9
- end
10
-
11
- let(:instance_a) { class_under_test.new(foo, bar) }
12
- let(:instance_b) { class_under_test.new(foo, bar) }
13
- let(:instance_c) { class_under_test.new(foo, mock('Baz')) }
14
-
15
- let(:foo) { mock('Foo') }
16
- let(:bar) { mock('Bar') }
17
-
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
29
- end
30
- end
31
-
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]
37
- end
38
- end
39
-
40
- context 'attribute behavior' do
41
- subject { instance_a }
42
-
43
- specify { subject.send(:foo).should be(foo) }
44
- specify { subject.send(:bar).should be(bar) }
45
- end
46
-
47
- context 'equalization behavior' do
48
- 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)
55
- end
56
- end
57
-
58
- context 'to much composition behavior' do
59
- 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')
61
- end
62
- end
63
-
64
- context Concord::Public do
65
- let(:class_under_test) do
66
- Class.new do
67
- include Concord::Public.new(:foo, :bar)
68
- end
69
- end
70
-
71
- it 'should create public attr readers' do
72
- object = class_under_test.new(:foo, :bar)
73
- object.foo.should eql(:foo)
74
- object.bar.should eql(:bar)
75
- end
76
- end
77
- end