keyword_init 1.4.0 → 1.5.0

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: 0e8bc2a63aa1c7e7e6548c160bc51df2f23dfe1b
4
+ data.tar.gz: 57660108296d0af296eb473a9e318c63c10be197
5
+ SHA512:
6
+ metadata.gz: 138568b1d59f117a0f15ebeb8d9fb336d8c48eca62766000dab45ab32cfb0c75746ea42b034e335dba5ff5e86c244e44c7294d73f54b84cd41bd8596b9366f14
7
+ data.tar.gz: 118fa2ee52b19fe221dc6b52576aeab6c15627bfe81af639f97ef0610cdef4d1f471d9e55ae703adcf3df24b6dc4fe660b2749905413362640d8fe939bd189c5
data/.gitignore CHANGED
@@ -50,8 +50,10 @@ build/
50
50
  # for a library or gem, you might want to ignore these files since the code is
51
51
  # intended to run in multiple environments; otherwise, check them in:
52
52
  # Gemfile.lock
53
- # .ruby-version
54
- # .ruby-gemset
53
+ .ruby-version
54
+ .ruby-gemset
55
+
56
+ /cc-test-reporter
55
57
 
56
58
  # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
57
59
  .rvmrc
@@ -1,16 +1,26 @@
1
+ env:
2
+ global:
3
+ - CC_TEST_REPORTER_ID=9d7b49edac4909edf2e78624b9c0589e15bf2573e5fc2c3d9e79f4994ffcc411
4
+
1
5
  language: ruby
2
6
  cache: bundler
3
7
 
4
8
  rvm:
5
- - 2.1.1
9
+ - 2.5.0
10
+ - 2.4.3
11
+ - 2.3.6
12
+ - 2.2.9
13
+ - 2.1.10
6
14
  - 2.0.0
7
- - 1.9.3
8
-
9
- addons:
10
- code_climate:
11
- repo_token: 9d7b49edac4909edf2e78624b9c0589e15bf2573e5fc2c3d9e79f4994ffcc411
12
15
 
13
- script: 'bundle exec rake spec'
16
+ before_script:
17
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
18
+ - chmod +x ./cc-test-reporter
19
+ - ./cc-test-reporter before-build
20
+ script:
21
+ - bundle exec rake spec
22
+ after_script:
23
+ - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
14
24
 
15
25
  notifications:
16
26
  email:
data/Gemfile CHANGED
@@ -2,4 +2,4 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in keyword_init.gemspec
4
4
  gemspec
5
- gem 'codeclimate-test-reporter', :group => :test, :require => nil
5
+ gem 'simplecov', group: :test, require: false
data/README.md CHANGED
@@ -21,17 +21,6 @@ Or install it yourself as:
21
21
 
22
22
  $ gem install keyword_init
23
23
 
24
- ## Changelog
25
-
26
- ### v1.4.0 (renamed from v1.3.1)
27
- supports passing `nil` to both initializer and `_set_properties`
28
-
29
- ### v1.3.0
30
- the work is done by a private method `_set_properties` that expects a hash of attributes. This way the work can be performed on an existing instance by calling that private method.
31
-
32
- ### 1.2.0
33
- now works with private setters
34
-
35
24
  ## Usage
36
25
 
37
26
  You can have the basic keyword initialization in your class, by including the `KeywordInit` module in your class. This will include the `initialize` method in the class.
@@ -53,19 +42,60 @@ class TestKlass
53
42
  end
54
43
  end
55
44
 
56
- o = TestKlass.new attrib: 1, writeonly: 2, readonly: 3
45
+ x = TestKlass.new attrib: 1, writeonly: 2, readonly: 3
57
46
  x.attrib # => 1
58
-
59
47
  # did not set the value because there is no `readonly=` method
60
48
  x.readonly # => nil
61
49
 
62
50
  x.my_data # => {attrib: 1, writeonly: 2, readonly: nil}
63
51
  ```
64
52
 
53
+ ### Strict mode
54
+
55
+ if we include `KeywordInit::Strict` instead of `KeywordInit` or `KeywordInit::Relaxed`, when the initializer receives a key with no matching setter, it will raise a `KeywordInit::KeyError` exception.
56
+
57
+ ```ruby
58
+ class TestKlass
59
+ include KeywordInit
60
+
61
+ attr_accessor :attrib
62
+ attr_writer :writeonly
63
+ attr_reader :readonly
64
+
65
+ def my_data
66
+ {attrib: attrib, writeonly: writeonly, readonly: readonly}
67
+ end
68
+ end
69
+
70
+ good = TestKlass.new attrib: 1, writeonly: 2
71
+ good.attrib # => 1
72
+ good.my_data # => {attrib: 1, writeonly: 2, readonly: nil}
73
+
74
+ bad = TestKlass.new attrib: 1, writeonly: 2, readonly: 4
75
+ # => raises KeywordInit::KeyError
76
+ #
77
+ bad2 = TestKlass.new attrib: 1, writeonly: 2, unknown: 4
78
+ # => raises KeywordInit::KeyError
79
+ ```
80
+
81
+
82
+ ## Changelog
83
+
84
+ ### v1.5.0
85
+ supports **strict** mode.
86
+
87
+ ### v1.4.0 (renamed from v1.3.1)
88
+ supports passing `nil` to both initializer and `_set_properties`
89
+
90
+ ### v1.3.0
91
+ the work is done by a private method `_set_properties` that expects a hash of attributes. This way the work can be performed on an existing instance by calling that private method.
92
+
93
+ ### 1.2.0
94
+ now works with private setters
95
+
65
96
  ## TODO
66
97
 
67
- 1. "strict" to raise an error if an unrecognised option is called on method creation (keyword without a setter)
68
- 2. "direct" integration with `fluent_accessors` ?
98
+ 1. "direct" integration with `fluent_accessors` ?
69
99
 
70
100
  ## Contributing
71
101
 
@@ -4,27 +4,27 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'keyword_init/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "keyword_init"
7
+ spec.name = 'keyword_init'
8
8
  spec.version = KeywordInit::VERSION
9
- spec.authors = ["Eduardo Turiño"]
10
- spec.email = ["eturino@eturino.com"]
9
+ spec.authors = ['Eduardo Turiño']
10
+ spec.email = ['eturino@eturino.com']
11
11
  spec.summary = %q{Gem that provides a keyword argument based initialize method to a class, executing the setter of all the recognised keywords.}
12
12
  # spec.description = %q{TODO: Write a longer description. Optional.}
13
- spec.homepage = ""
14
- spec.license = "MIT"
13
+ spec.homepage = ''
14
+ spec.license = 'MIT'
15
15
  spec.files = `git ls-files -z`.split("\x0")
16
16
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
- spec.require_paths = ["lib"]
18
+ spec.require_paths = ['lib']
19
19
 
20
- spec.add_development_dependency "bundler", "~> 1.6"
21
- spec.add_development_dependency "rake"
22
- spec.add_development_dependency "rspec"
23
- spec.add_development_dependency "rspec-nc"
24
- spec.add_development_dependency "pry"
25
- spec.add_development_dependency "pry-nav"
26
- spec.add_development_dependency "pry-rescue"
27
- spec.add_development_dependency "pry-stack_explorer"
28
- spec.add_development_dependency "pry-doc"
20
+ spec.add_development_dependency 'bundler', '~> 1.6'
21
+ spec.add_development_dependency 'rake'
22
+ spec.add_development_dependency 'rspec'
23
+ spec.add_development_dependency 'rspec-nc'
24
+ spec.add_development_dependency 'pry'
25
+ spec.add_development_dependency 'pry-nav'
26
+ spec.add_development_dependency 'pry-rescue'
27
+ spec.add_development_dependency 'pry-stack_explorer'
28
+ spec.add_development_dependency 'pry-doc'
29
29
 
30
30
  end
@@ -1,16 +1,52 @@
1
1
  require "keyword_init/version"
2
2
 
3
3
  module KeywordInit
4
- def initialize(properties = {})
5
- _set_properties(properties || {})
4
+ def self.included(mod)
5
+ # if using the general KeywordInit module, use the Relaxed
6
+ mod.send(:include, Relaxed)
6
7
  end
7
8
 
8
- private
9
- def _set_properties(properties)
10
- return unless properties
11
- properties.each do |k, v|
12
- normal_setter = "#{k}="
13
- send normal_setter, v if respond_to? normal_setter, true
9
+ module Common
10
+ def initialize(properties = {})
11
+ _set_properties(properties || {})
14
12
  end
13
+
14
+ def self.normal_setter(k)
15
+ "#{k}="
16
+ end
17
+ end
18
+
19
+ module Relaxed
20
+ def self.included(mod)
21
+ mod.send(:include, Common)
22
+ end
23
+
24
+ private
25
+ def _set_properties(properties)
26
+ return unless properties
27
+ properties.each do |k, v|
28
+ normal_setter = Common.normal_setter(k)
29
+ send normal_setter, v if respond_to? normal_setter, true
30
+ end
31
+ end
32
+ end
33
+
34
+ module Strict
35
+ def self.included(mod)
36
+ mod.send(:include, Common)
37
+ end
38
+
39
+ private
40
+ def _set_properties(properties)
41
+ return unless properties
42
+ properties.each do |k, v|
43
+ normal_setter = Common.normal_setter(k)
44
+ raise KeyError.new("no setter recognised for #{k}") unless respond_to? normal_setter, true
45
+ send normal_setter, v
46
+ end
47
+ end
48
+ end
49
+
50
+ class KeyError < ::KeyError
15
51
  end
16
52
  end
@@ -1,3 +1,3 @@
1
1
  module KeywordInit
2
- VERSION = '1.4.0'
2
+ VERSION = '1.5.0'
3
3
  end
@@ -1,11 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
- RSpec.shared_examples "works" do
4
- let(:expected_data) { {:attrib => 1, :writeonly => 2, :readonly => nil} }
5
- let(:empty_data) { {:attrib => nil, :writeonly => nil, :readonly => nil} }
3
+ RSpec.shared_examples "works in relaxed mode" do
4
+ let(:expected_data) { { :attrib => 1, :writeonly => 2, :readonly => nil } }
5
+ let(:empty_data) { { :attrib => nil, :writeonly => nil, :readonly => nil } }
6
6
 
7
7
  context '#initialize method' do
8
- it 'accepts keyword parameters' do
8
+ it 'accepts keyword parameters (ignores read-only attributes or any given attribute with no setter)' do
9
9
  expect { described_class.new :attrib => 1, :writeonly => 2, :readonly => 3 }.not_to raise_error
10
10
  end
11
11
 
@@ -41,21 +41,104 @@ RSpec.shared_examples "works" do
41
41
  end
42
42
  end
43
43
 
44
-
45
44
  RSpec.describe KeywordInit do
46
- class TestKlassWithPublicSetters
47
- include KeywordInit
45
+ context 'normal behaviour (including KeywordInit)' do
46
+ class TestKlassWithPublicSetters
47
+ include KeywordInit
48
+
49
+ attr_accessor :attrib
50
+ attr_writer :writeonly
51
+ attr_reader :readonly
48
52
 
49
- attr_accessor :attrib
50
- attr_writer :writeonly
51
- attr_reader :readonly
53
+ def my_data
54
+ { :attrib => @attrib, :writeonly => @writeonly, :readonly => @readonly }
55
+ end
56
+ end
52
57
 
53
- def my_data
54
- {:attrib => @attrib, :writeonly => @writeonly, :readonly => @readonly}
58
+ describe TestKlassWithPublicSetters do
59
+ it_behaves_like "works in relaxed mode"
55
60
  end
56
61
  end
57
62
 
58
- describe TestKlassWithPublicSetters do
59
- it_behaves_like "works"
63
+ context 'normal behaviour (including KeywordInit::Relaxed)' do
64
+ describe KeywordInit::Relaxed do
65
+ class TestKlassWithPublicSetters
66
+ include KeywordInit::Relaxed
67
+
68
+ attr_accessor :attrib
69
+ attr_writer :writeonly
70
+ attr_reader :readonly
71
+
72
+ def my_data
73
+ { :attrib => @attrib, :writeonly => @writeonly, :readonly => @readonly }
74
+ end
75
+ end
76
+
77
+ describe TestKlassWithPublicSetters do
78
+ it_behaves_like "works in relaxed mode"
79
+ end
80
+ end
81
+ end
82
+
83
+ context 'strict behaviour (KeywordInit::Strict)' do
84
+ describe KeywordInit::Strict do
85
+ class TestStrictKlassWithPublicSetters
86
+ include KeywordInit::Strict
87
+
88
+ attr_accessor :attrib
89
+ attr_writer :writeonly
90
+ attr_reader :readonly
91
+
92
+ def my_data
93
+ { :attrib => @attrib, :writeonly => @writeonly, :readonly => @readonly }
94
+ end
95
+ end
96
+
97
+ describe TestStrictKlassWithPublicSetters do
98
+ let(:expected_data) { { :attrib => 1, :writeonly => 2, :readonly => nil } }
99
+ let(:empty_data) { { :attrib => nil, :writeonly => nil, :readonly => nil } }
100
+
101
+ context '#initialize method' do
102
+ it 'accepts keyword parameters (ignores read-only attributes or any given attribute with no setter)' do
103
+ expect { described_class.new :attrib => 1, :writeonly => 2 }.not_to raise_error
104
+ end
105
+
106
+ it 'accepts keyword parameters (raises KeywordInit::KeyError if it receives read-only attributes or any given attribute with no setter)' do
107
+ expect { described_class.new :attrib => 1, :writeonly => 2, :readonly => 3 }.to raise_exception(KeywordInit::KeyError)
108
+ expect { described_class.new :attrib => 1, :writeonly => 2, :blaaah => 3 }.to raise_exception(KeywordInit::KeyError)
109
+ end
110
+
111
+ it 'executes the setter of each recognised keyword' do
112
+ expect_any_instance_of(described_class).to receive(:attrib=).with(1)
113
+ expect_any_instance_of(described_class).to receive(:writeonly=).with(2)
114
+ described_class.new :attrib => 1, :writeonly => 2
115
+ end
116
+
117
+ it 'sets the correct values' do
118
+ a = described_class.new :attrib => 1, :writeonly => 2
119
+ expect(a.my_data).to eq expected_data
120
+ end
121
+
122
+ it 'does nothing if nil passed' do
123
+ a = described_class.new nil
124
+ expect(a.my_data).to eq empty_data
125
+ end
126
+ end
127
+
128
+ context '#_set_properties method (private)' do
129
+ subject { described_class.new }
130
+
131
+ it 'sets the correct values (after creation) in the subject, in the same way of the initialize method' do
132
+ subject.send :_set_properties, :attrib => 1, :writeonly => 2
133
+ expect(subject.my_data).to eq expected_data
134
+ end
135
+
136
+ it 'does nothing if nil passed' do
137
+ subject.send :_set_properties, nil
138
+ expect(subject.my_data).to eq empty_data
139
+ end
140
+ end
141
+ end
142
+ end
60
143
  end
61
144
  end
@@ -1,8 +1,8 @@
1
1
  require 'bundler/setup'
2
2
  Bundler.setup
3
3
 
4
- require 'codeclimate-test-reporter'
5
- CodeClimate::TestReporter.start
4
+ require 'simplecov'
5
+ SimpleCov.start
6
6
 
7
7
  require 'pry'
8
8
  require 'keyword_init'
metadata CHANGED
@@ -1,158 +1,139 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keyword_init
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
5
- prerelease:
4
+ version: 1.5.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Eduardo Turiño
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2016-03-05 00:00:00.000000000 Z
11
+ date: 2018-01-30 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: bundler
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
19
  version: '1.6'
22
20
  type: :development
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
26
  version: '1.6'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rake
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
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'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rspec
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: rspec-nc
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - ">="
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - ">="
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: pry
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - ">="
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - ">="
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: pry-nav
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - ">="
100
88
  - !ruby/object:Gem::Version
101
89
  version: '0'
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - ">="
108
95
  - !ruby/object:Gem::Version
109
96
  version: '0'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: pry-rescue
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - ">="
116
102
  - !ruby/object:Gem::Version
117
103
  version: '0'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ! '>='
108
+ - - ">="
124
109
  - !ruby/object:Gem::Version
125
110
  version: '0'
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: pry-stack_explorer
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
- - - ! '>='
115
+ - - ">="
132
116
  - !ruby/object:Gem::Version
133
117
  version: '0'
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
- - - ! '>='
122
+ - - ">="
140
123
  - !ruby/object:Gem::Version
141
124
  version: '0'
142
125
  - !ruby/object:Gem::Dependency
143
126
  name: pry-doc
144
127
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
128
  requirements:
147
- - - ! '>='
129
+ - - ">="
148
130
  - !ruby/object:Gem::Version
149
131
  version: '0'
150
132
  type: :development
151
133
  prerelease: false
152
134
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
135
  requirements:
155
- - - ! '>='
136
+ - - ">="
156
137
  - !ruby/object:Gem::Version
157
138
  version: '0'
158
139
  description:
@@ -162,9 +143,9 @@ executables: []
162
143
  extensions: []
163
144
  extra_rdoc_files: []
164
145
  files:
165
- - .gitignore
166
- - .rspec
167
- - .travis.yml
146
+ - ".gitignore"
147
+ - ".rspec"
148
+ - ".travis.yml"
168
149
  - Gemfile
169
150
  - LICENSE.txt
170
151
  - README.md
@@ -177,36 +158,28 @@ files:
177
158
  homepage: ''
178
159
  licenses:
179
160
  - MIT
161
+ metadata: {}
180
162
  post_install_message:
181
163
  rdoc_options: []
182
164
  require_paths:
183
165
  - lib
184
166
  required_ruby_version: !ruby/object:Gem::Requirement
185
- none: false
186
167
  requirements:
187
- - - ! '>='
168
+ - - ">="
188
169
  - !ruby/object:Gem::Version
189
170
  version: '0'
190
- segments:
191
- - 0
192
- hash: -3451831627487267256
193
171
  required_rubygems_version: !ruby/object:Gem::Requirement
194
- none: false
195
172
  requirements:
196
- - - ! '>='
173
+ - - ">="
197
174
  - !ruby/object:Gem::Version
198
175
  version: '0'
199
- segments:
200
- - 0
201
- hash: -3451831627487267256
202
176
  requirements: []
203
177
  rubyforge_project:
204
- rubygems_version: 1.8.23
178
+ rubygems_version: 2.6.14
205
179
  signing_key:
206
- specification_version: 3
180
+ specification_version: 4
207
181
  summary: Gem that provides a keyword argument based initialize method to a class,
208
182
  executing the setter of all the recognised keywords.
209
183
  test_files:
210
184
  - spec/keyword_init_spec.rb
211
185
  - spec/spec_helper.rb
212
- has_rdoc: