keyword_init 1.4.0 → 1.5.0

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: 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: