u-attributes 0.9.0 → 0.10.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.
- checksums.yaml +4 -4
- data/.travis.yml +10 -2
- data/Gemfile.lock +1 -1
- data/README.md +97 -4
- data/lib/micro/attributes.rb +18 -9
- data/lib/micro/attributes/features.rb +31 -0
- data/lib/micro/attributes/features/diff.rb +55 -0
- data/lib/micro/attributes/{to_initialize.rb → features/initialize.rb} +3 -5
- data/lib/micro/attributes/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e37bcd7fa7880973930c3a455850708bf22962266c5d2b09f69885dc0c7b9a8d
|
|
4
|
+
data.tar.gz: ed08290e3bca0a590a88a7720deb3c6e94eae93d64a12884eb108806ce2a13ce
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 031f5deb4ece3c5be0004290675a4bbd72e90a8b1436068054dc1acf8d949e7b4957e6b20d4f53112136cd35d15ede29d648576e7b3fe52fe0216e73012afad7
|
|
7
|
+
data.tar.gz: 6191e30d97bdf5cdeb06a5ece5db65877ca14304af432dc8f69077cb691fc0458a4adb1124ebf1acdbdeae4eae2682944770cb1268708680ebafd0062165a38c
|
data/.travis.yml
CHANGED
|
@@ -3,5 +3,13 @@ sudo: false
|
|
|
3
3
|
language: ruby
|
|
4
4
|
cache: bundler
|
|
5
5
|
rvm:
|
|
6
|
-
- 2.
|
|
7
|
-
|
|
6
|
+
- 2.2.0
|
|
7
|
+
- 2.3.0
|
|
8
|
+
- 2.4.0
|
|
9
|
+
- 2.5.0
|
|
10
|
+
- 2.6.0
|
|
11
|
+
before_install:
|
|
12
|
+
- gem uninstall -v '>= 2' -i $(rvm gemdir)@global -ax bundler || true
|
|
13
|
+
- gem install bundler -v '< 2'
|
|
14
|
+
env:
|
|
15
|
+
- DISABLE_SIMPLECOV=true
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# μ-attributes (Micro::Attributes)
|
|
1
|
+
# μ-attributes (Micro::Attributes) [](https://travis-ci.com/serradura/u-attributes)
|
|
2
2
|
|
|
3
3
|
This gem allows defining read-only attributes, that is, your objects will have only getters to access their attributes data.
|
|
4
4
|
|
|
@@ -98,9 +98,9 @@ person.attribute(:name) { |value| puts value } # John Doe
|
|
|
98
98
|
person.attribute('age') { |value| puts value } # 20
|
|
99
99
|
person.attribute('foo') { |value| puts value } # !! Nothing happened, because of the attribute not exists.
|
|
100
100
|
|
|
101
|
-
|
|
102
|
-
# #attribute() #
|
|
103
|
-
|
|
101
|
+
#---------------#
|
|
102
|
+
# #attribute!() #
|
|
103
|
+
#---------------#
|
|
104
104
|
#
|
|
105
105
|
# Works like the #attribute() method, but will raise an exception when the attribute not exist.
|
|
106
106
|
|
|
@@ -264,6 +264,99 @@ p person.attributes # {"age"=>20, "name"=>"John Doe"}
|
|
|
264
264
|
p Person.new(name: 'John').attributes # {"age"=>nil, "name"=>"John"}
|
|
265
265
|
```
|
|
266
266
|
|
|
267
|
+
## Built-in extensions
|
|
268
|
+
|
|
269
|
+
You can use the method `Micro::Attributes.features()` to combine and require only the features that better fit your needs.
|
|
270
|
+
|
|
271
|
+
Note: The method `Micro::Attributes.with()` is an alias for `Micro::Attributes.features()`.
|
|
272
|
+
|
|
273
|
+
### Diff extension
|
|
274
|
+
|
|
275
|
+
Provides a way to track changes in your object attributes.
|
|
276
|
+
|
|
277
|
+
#### How to enable?
|
|
278
|
+
|
|
279
|
+
```ruby
|
|
280
|
+
#----------------------------------#
|
|
281
|
+
# Via Micro::Attributes.features() #
|
|
282
|
+
#----------------------------------#
|
|
283
|
+
class Job
|
|
284
|
+
include Micro::Attributes.features(:diff)
|
|
285
|
+
|
|
286
|
+
attributes :id, state: 'sleeping'
|
|
287
|
+
|
|
288
|
+
def initialize(options)
|
|
289
|
+
self.options = options
|
|
290
|
+
end
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
# --------------------------------------------------------------------#
|
|
294
|
+
# Using the .with() method alias and adding the initialize extension. #
|
|
295
|
+
# --------------------------------------------------------------------#
|
|
296
|
+
|
|
297
|
+
class Job
|
|
298
|
+
include Micro::Attributes.with(:initialize, :diff)
|
|
299
|
+
|
|
300
|
+
attributes :id, state: 'sleeping'
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
#---------------------------------------#
|
|
304
|
+
# Via Micro::Attributes.to_initialize() #
|
|
305
|
+
#---------------------------------------#
|
|
306
|
+
class Job
|
|
307
|
+
include Micro::Attributes.to_initialize(diff: true)
|
|
308
|
+
|
|
309
|
+
attribute :id
|
|
310
|
+
attribute :state, 'sleeping'
|
|
311
|
+
end
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
#### Usage
|
|
315
|
+
|
|
316
|
+
```ruby
|
|
317
|
+
require 'securerandom'
|
|
318
|
+
|
|
319
|
+
class Job
|
|
320
|
+
include Micro::Attributes.features(:initialize, :diff)
|
|
321
|
+
|
|
322
|
+
attributes :id, state: 'sleeping'
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
job = Job.new(id: SecureRandom.uuid())
|
|
326
|
+
|
|
327
|
+
p job.id # A random UUID generated from SecureRandom.uuid(). e.g: "e68bcc74-b91c-45c2-a904-12f1298cc60e"
|
|
328
|
+
p job.state # "sleeping"
|
|
329
|
+
|
|
330
|
+
job_running = job.with_attribute(:state, 'running')
|
|
331
|
+
|
|
332
|
+
p job_running.state # "running"
|
|
333
|
+
|
|
334
|
+
job_changes = job.diff_attributes(job_running)
|
|
335
|
+
|
|
336
|
+
#-----------------------------#
|
|
337
|
+
# #present?, #blank?, #empty? #
|
|
338
|
+
#-----------------------------#
|
|
339
|
+
|
|
340
|
+
p job_changes.present? # true
|
|
341
|
+
p job_changes.blank? # false
|
|
342
|
+
p job_changes.empty? # false
|
|
343
|
+
|
|
344
|
+
#-----------#
|
|
345
|
+
# #changed? #
|
|
346
|
+
#-----------#
|
|
347
|
+
p job_changes.changed? # true
|
|
348
|
+
|
|
349
|
+
p job_changes.changed?(:id) # false
|
|
350
|
+
|
|
351
|
+
p job_changes.changed?(:state) # true
|
|
352
|
+
p job_changes.changed?(:state, from: 'sleeping', to: 'running') # true
|
|
353
|
+
|
|
354
|
+
#----------------#
|
|
355
|
+
# #differences() #
|
|
356
|
+
#----------------#
|
|
357
|
+
p job_changes.differences # {"state"=>"running"}
|
|
358
|
+
```
|
|
359
|
+
|
|
267
360
|
## Development
|
|
268
361
|
|
|
269
362
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/micro/attributes.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
require "micro/attributes/version"
|
|
4
4
|
require "micro/attributes/attributes_utils"
|
|
5
5
|
require "micro/attributes/macros"
|
|
6
|
-
require "micro/attributes/
|
|
6
|
+
require "micro/attributes/features"
|
|
7
7
|
|
|
8
8
|
module Micro
|
|
9
9
|
module Attributes
|
|
@@ -22,23 +22,32 @@ module Micro
|
|
|
22
22
|
end
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
def self.to_initialize
|
|
26
|
-
|
|
25
|
+
def self.to_initialize(diff: false)
|
|
26
|
+
options = [:initialize]
|
|
27
|
+
options << :diff if diff
|
|
28
|
+
features(*options)
|
|
27
29
|
end
|
|
28
30
|
|
|
31
|
+
def self.features(*names)
|
|
32
|
+
Features.fetch(names)
|
|
33
|
+
end
|
|
34
|
+
singleton_class.send(:alias_method, :with, :features)
|
|
35
|
+
|
|
29
36
|
def attributes=(arg)
|
|
30
37
|
self.class.attributes_data(AttributesUtils.hash_argument!(arg)).each do |name, value|
|
|
31
|
-
instance_variable_set("@#{name}", value) if attribute?(name)
|
|
38
|
+
__attributes[name] = instance_variable_set("@#{name}", value) if attribute?(name)
|
|
32
39
|
end
|
|
40
|
+
__attributes.freeze
|
|
33
41
|
end
|
|
34
42
|
protected :attributes=
|
|
35
43
|
|
|
36
|
-
def
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
44
|
+
def __attributes
|
|
45
|
+
@__attributes ||= {}
|
|
46
|
+
end
|
|
47
|
+
private :__attributes
|
|
40
48
|
|
|
41
|
-
|
|
49
|
+
def attributes
|
|
50
|
+
__attributes
|
|
42
51
|
end
|
|
43
52
|
|
|
44
53
|
def attribute?(name)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "micro/attributes/features/diff"
|
|
4
|
+
require "micro/attributes/features/initialize"
|
|
5
|
+
|
|
6
|
+
module Micro
|
|
7
|
+
module Attributes
|
|
8
|
+
module Features
|
|
9
|
+
module InitializeAndDiff
|
|
10
|
+
def self.included(base)
|
|
11
|
+
base.send(:include, ::Micro::Attributes::Features::Initialize)
|
|
12
|
+
base.send(:include, ::Micro::Attributes::Features::Diff)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
OPTIONS = {
|
|
17
|
+
'diff' => Diff,
|
|
18
|
+
'initialize' => Initialize,
|
|
19
|
+
'diff:initialize' => InitializeAndDiff
|
|
20
|
+
}.freeze
|
|
21
|
+
|
|
22
|
+
private_constant :OPTIONS
|
|
23
|
+
|
|
24
|
+
def self.fetch(names)
|
|
25
|
+
option = OPTIONS[names.map { |name| name.to_s.downcase }.sort.join(':')]
|
|
26
|
+
return option if option
|
|
27
|
+
raise ArgumentError, 'Invalid feature name! Available options: diff, initialize'
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Micro::Attributes
|
|
4
|
+
module Features
|
|
5
|
+
module Diff
|
|
6
|
+
class Changes
|
|
7
|
+
attr_reader :from, :to, :differences
|
|
8
|
+
|
|
9
|
+
def initialize(from:, to:)
|
|
10
|
+
raise ArgumentError, "expected an instance of #{from.class}" unless to.is_a?(from.class)
|
|
11
|
+
@from, @to = from, to
|
|
12
|
+
@differences = diff(from.attributes, to.attributes).freeze
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def empty?
|
|
16
|
+
@differences.empty?
|
|
17
|
+
end
|
|
18
|
+
alias_method :blank?, :empty?
|
|
19
|
+
|
|
20
|
+
def present?
|
|
21
|
+
!empty?
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def changed?(name = nil, from: nil, to: nil)
|
|
25
|
+
if name.nil?
|
|
26
|
+
return present? if from.nil? && to.nil?
|
|
27
|
+
raise ArgumentError, 'pass the attribute name with the :from and :to values'
|
|
28
|
+
elsif from.nil? && to.nil?
|
|
29
|
+
differences.has_key?(name.to_s)
|
|
30
|
+
else
|
|
31
|
+
key = name.to_s
|
|
32
|
+
@from_attributes[key] == from && @to_attributes[key] == to
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def diff(from_attributes, to_attributes)
|
|
39
|
+
@to_attributes = to_attributes
|
|
40
|
+
@from_attributes = from_attributes
|
|
41
|
+
@from_attributes.each_with_object({}) do |(from_key, from_val), acc|
|
|
42
|
+
to_value = @to_attributes[from_key]
|
|
43
|
+
acc[from_key] = to_value if from_val != to_value
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
private_constant :Changes
|
|
48
|
+
|
|
49
|
+
def diff_attributes(to)
|
|
50
|
+
return Changes.new(from: self, to: to) if to.is_a?(::Micro::Attributes)
|
|
51
|
+
raise ArgumentError, "#{to.inspect} must implement Micro::Attributes"
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
module Micro
|
|
4
|
-
module
|
|
5
|
-
module
|
|
3
|
+
module Micro::Attributes
|
|
4
|
+
module Features
|
|
5
|
+
module Initialize
|
|
6
6
|
def self.included(base)
|
|
7
7
|
base.send(:include, ::Micro::Attributes)
|
|
8
8
|
end
|
|
@@ -19,7 +19,5 @@ module Micro
|
|
|
19
19
|
self.class.new(attributes.merge(arg))
|
|
20
20
|
end
|
|
21
21
|
end
|
|
22
|
-
|
|
23
|
-
private_constant :ToInitialize
|
|
24
22
|
end
|
|
25
23
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: u-attributes
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.10.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Rodrigo Serradura
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2019-07-
|
|
11
|
+
date: 2019-07-10 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rake
|
|
@@ -58,8 +58,10 @@ files:
|
|
|
58
58
|
- bin/setup
|
|
59
59
|
- lib/micro/attributes.rb
|
|
60
60
|
- lib/micro/attributes/attributes_utils.rb
|
|
61
|
+
- lib/micro/attributes/features.rb
|
|
62
|
+
- lib/micro/attributes/features/diff.rb
|
|
63
|
+
- lib/micro/attributes/features/initialize.rb
|
|
61
64
|
- lib/micro/attributes/macros.rb
|
|
62
|
-
- lib/micro/attributes/to_initialize.rb
|
|
63
65
|
- lib/micro/attributes/version.rb
|
|
64
66
|
- lib/u-attributes.rb
|
|
65
67
|
- u-attributes.gemspec
|