eigindir 0.0.1

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a04b87646bc1711b3906a320357ff5c3a0ac6329
4
+ data.tar.gz: e1e65a6867902d0a8b6ad1a6a1c80bd53a1e9db9
5
+ SHA512:
6
+ metadata.gz: 0a815b9c785c79e92b18add69df7bccd7f323391daf508b0e5ffdb24678256e1fb16b3ca426b2e289713660f41874bee71f88f788137f0a4da04ea7d2c0f549a
7
+ data.tar.gz: b519e53fcab8f5375bd9f508400af912b63ba5f534cd838ef67c49c258cb73e06ebea0a2ee4e59ba4e6e1aaa82db4bb718b0f144303f7356cc6e18d68700f0a5
data/.coveralls.yml ADDED
@@ -0,0 +1,2 @@
1
+ ---
2
+ service_name: travis-ci
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ *.gem
2
+ *.lock
3
+ .bundle/
4
+ .yardoc/
5
+ coverage/
6
+ doc/
7
+ log/
8
+ pkg/
9
+ tmp/
data/.metrics ADDED
@@ -0,0 +1,9 @@
1
+ # Settings for metric_fu and its packages are collected in the `config/metrics`
2
+ # and loaded by the Hexx::Suit::Metrics::MetricFu.
3
+
4
+ begin
5
+ require "hexx-suit"
6
+ Hexx::Suit::Metrics::MetricFu.load
7
+ rescue LoadError
8
+ puts "The 'hexx-suit' gem is not installed"
9
+ end
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --require spec_helper
2
+ --color
data/.rubocop.yml ADDED
@@ -0,0 +1,2 @@
1
+ ---
2
+ inherit_from: "./config/metrics/rubocop.yml"
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ ---
2
+ language: ruby
3
+ bundler_args: --without metrics
4
+ cache: bundler
5
+ script: rake test:coverage:run
6
+ rvm:
7
+ - '2.1'
8
+ - '2.2'
9
+ - ruby-head
data/.yardopts ADDED
@@ -0,0 +1,3 @@
1
+ --asset LICENSE
2
+ --exclude lib/eigindir/version.rb
3
+ --output doc/api
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ group :metrics do
6
+ gem "hexx-suit", "~> 2.2" if RUBY_ENGINE == "ruby"
7
+ end
data/Guardfile ADDED
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+
3
+ guard :rspec, cmd: "bundle exec rspec" do
4
+
5
+ watch(%r{^spec/tests/.+_spec\.rb$})
6
+
7
+ watch(%r{^lib/(.+)\.rb$}) do |m|
8
+ "spec/tests/#{ m[1] }_spec.rb"
9
+ end
10
+
11
+ watch(%r{^lib/\w+\.rb$}) { "spec" }
12
+ watch("spec/spec_helper.rb") { "spec" }
13
+
14
+ end # guard :rspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2015 Andrew Kozin (nepalez), andrew.kozin@gmail.com
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,342 @@
1
+ Eigindir
2
+ ========
3
+
4
+ [![Gem Version](https://img.shields.io/gem/v/eigindir.svg?style=flat)][gem]
5
+ [![Build Status](https://img.shields.io/travis/nepalez/eigindir/master.svg?style=flat)][travis]
6
+ [![Dependency Status](https://img.shields.io/gemnasium/nepalez/eigindir.svg?style=flat)][gemnasium]
7
+ [![Code Climate](https://img.shields.io/codeclimate/github/nepalez/eigindir.svg?style=flat)][codeclimate]
8
+ [![Coverage](https://img.shields.io/coveralls/nepalez/eigindir.svg?style=flat)][coveralls]
9
+ [![Inline docs](http://inch-ci.org/github/nepalez/eigindir.svg)][inch]
10
+
11
+ [codeclimate]: https://codeclimate.com/github/nepalez/eigindir
12
+ [coveralls]: https://coveralls.io/r/nepalez/eigindir
13
+ [gem]: https://rubygems.org/gems/eigindir
14
+ [gemnasium]: https://gemnasium.com/nepalez/eigindir
15
+ [travis]: https://travis-ci.org/nepalez/eigindir
16
+ [inch]: https://inch-ci.org/github/nepalez/eigindir
17
+
18
+ Coercible PORO attributes.
19
+
20
+ Synopsis
21
+ --------
22
+
23
+ This is a tiny [virtus]-inspired library
24
+ for PORO attributes' definition and coersion.
25
+
26
+ Like [virtus] it declares attributes, and coerces their values.
27
+ Unlike [virtus] it uses different coersion mechanism, and does nothing else.
28
+
29
+ [virtus]: https://github.com/solnic/virtus
30
+
31
+ ```ruby
32
+ class Foo
33
+ include Eigindir
34
+
35
+ attribute(
36
+ :bar,
37
+ writer: ->(v) { v.to_i + 1 },
38
+ reader: ->(v) { v.to_s }
39
+ )
40
+ end
41
+
42
+ foo = Foo.new
43
+
44
+ # the setter coerced given value:
45
+ foo.bar = "10"
46
+ foo.instance_eval "@bar" # => 11
47
+ # the getter coerced stored value:
48
+ foo.instance_eval # => "11"
49
+
50
+ # attributes getter and setter are defined as well:
51
+ foo.attributes = { "bar" => 5 }
52
+ foo.attributes # => { bar: "6" }
53
+ ```
54
+
55
+ The module doesn't define the initializer.
56
+ You're free to define in a following way:
57
+
58
+ ```ruby
59
+ class Foo
60
+ include Eigindir
61
+
62
+ def initializer(**options)
63
+ self.attributes = options
64
+ end
65
+ end
66
+ ```
67
+
68
+ Details
69
+ -------
70
+
71
+ ### Base Use
72
+
73
+ `attribute`, `attribute_reader` and `attribute_writer` are like
74
+ `attr_accessor`, `attr_reader` and `attr_writer`:
75
+
76
+ ```ruby
77
+ class Foo
78
+ include Eigindir
79
+
80
+ attribute :bar
81
+ attribute_reader :baz
82
+ attribute_writer :qux
83
+ end
84
+
85
+ foo = Foo.new
86
+
87
+ foo.bar = 1
88
+ foo.bar # => 1
89
+
90
+ foo.baz = 1 # <NoMethodError>
91
+ foo.baz # => nil
92
+
93
+ foo.qux = 1
94
+ foo.instance_eval "@qux" # => 1
95
+ foo.qux # <NoMethodError>
96
+ ```
97
+
98
+ ### Attributes Declaration
99
+
100
+ The `attributes` and `attributes=` ignore all keys not declared as `attribute`.
101
+
102
+ ```ruby
103
+ class Foo
104
+ include Eigindir
105
+
106
+ attribute :bar
107
+ attr_accessor :baz
108
+ end
109
+
110
+ foo = Foo.new
111
+ foo.attributes = { bar: 1, baz: 2 }
112
+ foo.bar # => 1
113
+ foo.baz # => nil
114
+
115
+ foo.baz = 2
116
+ foo.baz # => 2
117
+ foo.attributes # => { bar: 1 }
118
+ ```
119
+
120
+ The methods ignore attributes that has no getters or setters correspondingly:
121
+
122
+ ```ruby
123
+ class Foo
124
+ include Eigindir
125
+
126
+ attribute_reader :bar
127
+ attribute_writer :baz
128
+ end
129
+
130
+ foo = Foo.new
131
+ foo.attributes = { bar: 1, baz: 1 }
132
+
133
+ # baz has no getter,
134
+ # bar value is not assigned because it has no setter:
135
+ foo.attributes = { bar: nil }
136
+ ```
137
+
138
+ The `attributes=` accepts hash with any stringified keys and symbolizes them:
139
+
140
+ ```ruby
141
+ class Foo
142
+ include Eigindir
143
+
144
+ attribute :bar
145
+ attribute :baz
146
+ end
147
+
148
+ foo = Foo.new
149
+ foo.attributes = { bar: "1", "bar" => 2 }
150
+ # The setter symbolizes keys to :bar and uses last value:
151
+ foo.attributes # => { bar: 2 }
152
+ ```
153
+
154
+ ### Base Coersion
155
+
156
+ All class methods: `attribute`, `attribute_reader` and `attribute_writer`
157
+ accepts the `:coerce` key:
158
+
159
+ ```ruby
160
+ class Foo
161
+ include Eigindir
162
+
163
+ attribute :bar, coerce: ->(val) { val.to_i + 1 }
164
+ end
165
+ ```
166
+
167
+ The setter coerces given value:
168
+
169
+ ```ruby
170
+ foo = Foo.new
171
+
172
+ foo.bar = "1"
173
+ foo.instance_eval "@bar" # => 2
174
+ ```
175
+
176
+ The getter coerces stored variable:
177
+
178
+ ```ruby
179
+ foo.instance_eval "@bar" # => 2
180
+ foo.bar # => 3
181
+ ```
182
+
183
+ A coercer can be set either as proc or lambda, or by instance method name.
184
+ The following declarations are equivalent:
185
+
186
+ ```ruby
187
+ class Foo
188
+ include Eigindir
189
+
190
+ attribute :bar, coerce: ->(value) { value.to_s }
191
+ attribute :bar, coerce: lambda { |value| value.to_s }
192
+ attribute :bar, coerce: proc { |value| value.to_s }
193
+ attribute :bar, coerce: :coercer
194
+ attribute :bar, coerce: "coercer"
195
+
196
+ private
197
+
198
+ def coercer(value)
199
+ value.to_s
200
+ end
201
+ end
202
+ ```
203
+
204
+ ### Separate Coersion
205
+
206
+ The `attribute` class method also takes `:reader` and `:writer`.
207
+ Every option sets its own coersion for the corresponding direction:
208
+
209
+ ```ruby
210
+ class Foo
211
+ include Eigindir
212
+
213
+ attribute(
214
+ :bar,
215
+ writer: ->(val) { val.to_i + 1 }
216
+ reader: ->(val) { val.to_s }
217
+ )
218
+ end
219
+
220
+ foo = Foo.new
221
+
222
+ # The setter uses the :writer coercer:
223
+ foo.bar = "10"
224
+ foo.instance_eval "@bar" # => 11
225
+
226
+ # The getter uses the :reader coercer:
227
+ foo.bar # => "11"
228
+ ```
229
+
230
+ ### Coersion of nil
231
+
232
+ Because +nil+ stands for pure nothing, it is not coerced by default:
233
+
234
+ ```ruby
235
+ class Foo
236
+ include Eigindir
237
+
238
+ attribute :bar, coerce: &:to_s
239
+ end
240
+
241
+ foo = Foo.new
242
+ foo.bar = nil
243
+ foo.instance_eval "@bar" # => nil
244
+ foo.bar # => nil
245
+ ```
246
+
247
+ Use `strict: true` option to coerce `nil` as well:
248
+
249
+ ```ruby
250
+ class Foo
251
+ include Eigindir
252
+
253
+ attribute :baz, coerce: &:to_s, strict: true
254
+ end
255
+
256
+ foo = Foo.new
257
+ foo.bar = nil
258
+ foo.instance_eval "@bar" # => ""
259
+ foo.bar # => ""
260
+ ```
261
+
262
+ This can be used to set default values explicitly either by getter or setter:
263
+
264
+ ```ruby
265
+ class Foo
266
+ include Eigindir
267
+
268
+ attribute :bar, reader: proc { |val| val || 1 }, strict: true
269
+ attribute :baz, writer: proc { |val| val || 1 }, strict: true
270
+ end
271
+
272
+ foo = Foo.new
273
+
274
+ # The getter's default is pretty virtual:
275
+ foo.bar = nil
276
+ foo.instance_eval "@bar" # => nil
277
+ foo.bar # => 1
278
+
279
+ # While the setter's is persistent:
280
+ foo.baz = nil
281
+ foo.instance_eval "@baz" # => 1
282
+ foo.baz # => 1
283
+ ```
284
+
285
+ Credits
286
+ -------
287
+
288
+ Many thanks to Icelandic for
289
+ [the name of the module](https://translate.google.ru/?hl=en#is/en/eigindir).
290
+
291
+ Installation
292
+ ------------
293
+
294
+ Add this line to your application's Gemfile:
295
+
296
+ ```ruby
297
+ # Gemfile
298
+ gem "eigindir"
299
+ ```
300
+
301
+ Then execute:
302
+
303
+ ```
304
+ bundle
305
+ ```
306
+
307
+ Or add it manually:
308
+
309
+ ```
310
+ gem install eigindir
311
+ ```
312
+
313
+ Compatibility
314
+ -------------
315
+
316
+ Tested under [MRI rubies 2.1+](.travis.yml) only.
317
+
318
+ It uses [Ruby 2.1+ refinements] that aren't yet supported by Rubinius and JRuby.
319
+
320
+ Uses [RSpec] 3.0+ for testing and [hexx-suit] for dev/test tools collection.
321
+
322
+ [Ruby 2.1+ refinements]: http://ruby-doc.org/core-2.1.1/doc/syntax/refinements_rdoc.html
323
+ [RSpec]: http://rspec.org
324
+ [hexx-suit]: https://github.com/nepalez/hexx-suit
325
+
326
+ Contributing
327
+ ------------
328
+
329
+ * Fork the project.
330
+ * Read the [STYLEGUIDE](config/metrics/STYLEGUIDE).
331
+ * Make your feature addition or bug fix.
332
+ * Add tests for it. This is important so I don't break it in a
333
+ future version unintentionally.
334
+ * Commit, do not mess with Rakefile or version
335
+ (if you want to have your own version, that is fine but bump version
336
+ in a commit by itself I can ignore when I pull)
337
+ * Send me a pull request. Bonus points for topic branches.
338
+
339
+ License
340
+ -------
341
+
342
+ See the [MIT LICENSE](LICENSE).