rice_bubble 0.1.0 → 0.1.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4e81d5917da322d30c15b8def2c989d5b725daae03a2b843cb88534f273b6f49
4
- data.tar.gz: acf5daa7c14f1a059db017ffa3a2dddf91d674b6b5694a5b0b6506e3abe8159e
3
+ metadata.gz: 5ff1a10fe0388c60a178246ee4c45a005292355ec741b9f175b56c8ba393b060
4
+ data.tar.gz: 35c94ec3a32ea7187b031eaf4341c59ad4a55649510bece671a52b480a10c2c5
5
5
  SHA512:
6
- metadata.gz: c6311322cd18622ebf65dc0dc0e78cf9e89844e5cd3cc9f3564165400a3d9af70d447073025093532cdbdfeadbcc84008756a61d628c239f0de2756710f6dea2
7
- data.tar.gz: 5c025fa2266a0ba755d946a6fc259164609f6549d5f5720fcb36c09790ca86f2c8ebd0a1c27e6dd37d01b3c08c6858c32866f644c67eacbb03c39fb709c97081
6
+ metadata.gz: 1eb7c799044b2d70f6f13a2066d175b4ff09965b19b11d91c36493509d579e6e9ea6ebbeb4cfe1d897faf5aded93bc74ea5e955db81fc396bda9a292689537c3
7
+ data.tar.gz: 9bd2f3aa7f5c6c70ebb5c8afc1d2ca2d4ee95e2978c5491c5a6a1e225ce31c4f3ea5e908a933fa48d74e1cea4d437e131f1718c5e0c496df7c7bf0f99196699b
data/CHANGELOG.md CHANGED
@@ -1,4 +1,6 @@
1
- ## [Unreleased]
1
+ ## [0.1.2] - 2023-05-23
2
+
3
+ - Add DateTime attribute type
2
4
 
3
5
  ## [0.1.0] - 2023-05-04
4
6
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rice_bubble (0.1.0)
4
+ rice_bubble (0.1.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -37,9 +37,11 @@ end
37
37
  Then you can use the new serializer to convert your data to a JSON-friendly representation:
38
38
 
39
39
  ```ruby
40
- json = CharacterSerializer.call(my_character) # => { name: "...", ... }
40
+ json = CharacterSerializer.new(my_character).call # => { name: "...", ... }
41
41
  ```
42
42
 
43
+ **Note:** you can also use `CharacterSerializer.call(my_character)`.
44
+
43
45
  ### Attribute types
44
46
 
45
47
  | Name | Expects | Options | Example |
@@ -100,12 +102,25 @@ WrappingSerializer.call({ name: 'Spicy Beef' }) # => { name: '{Spicy Beef}' }
100
102
  ### Fetching values from an object
101
103
 
102
104
  By default, attributes know how to fetch their values from the object being serialized
103
- by either:
105
+ by either (in this order):
106
+
107
+ - invoking an instance method with the same name on the serializer; or
108
+ - invoking an instance method with the same name on the object; or
109
+ - looking up a hash key on the object
110
+
111
+ ```ruby
112
+ class FullNameSerializer
113
+ attributes(
114
+ full_name: string
115
+ )
104
116
 
105
- - invoking an instance method (on an object); or
106
- - looking up a hash key (on a hash)
117
+ def full_name
118
+ [object.first_name, object.last_name].join(' ')
119
+ end
120
+ end
121
+ ```
107
122
 
108
- You can change how a value is retrieved by passing a block to the attribute:
123
+ You can also change how a value is retrieved by passing a block to the attribute:
109
124
 
110
125
  ```ruby
111
126
  class FullNameSerializer
@@ -134,4 +149,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
134
149
 
135
150
  ## Code of Conduct
136
151
 
137
- Everyone interacting in the RiceBubble project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/rice_bubble/blob/main/CODE_OF_CONDUCT.md).
152
+ Everyone interacting in the RiceBubble project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://gitlab.com/fauxparse/rice_bubble/blob/main/CODE_OF_CONDUCT.md).
@@ -0,0 +1,28 @@
1
+ module RiceBubble
2
+ class Attributes
3
+ class Datetime < Base
4
+ def valid?(value)
5
+ return false unless valid_datetime?(value)
6
+
7
+ value.respond_to?(:to_datetime)
8
+ end
9
+
10
+ def coerce(value)
11
+ return nil unless valid_datetime?(value)
12
+
13
+ value.respond_to?(:to_datetime) ? value.to_datetime : value
14
+ end
15
+
16
+ private
17
+
18
+ def valid_datetime?(value)
19
+ case value
20
+ when ::Time then true
21
+ when ::DateTime then true
22
+ when ::Date then false
23
+ else value.respond_to?(:to_datetime)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,17 +1,33 @@
1
1
  module RiceBubble
2
2
  class Serializer
3
- def call(object, path: nil)
4
- attributes.map do |name, attr|
5
- attr.call(attr.fetch(object, name), path: path || self.class.name)
3
+ attr_reader :object
4
+
5
+ def initialize(object = nil)
6
+ @object = object
7
+ end
8
+
9
+ def call(object_to_serialize = nil, path: nil)
10
+ if object_to_serialize
11
+ self.class.new(object_to_serialize).call(path:)
12
+ elsif object
13
+ self.class.attributes.map do |name, attr|
14
+ attr.call(fetch(name), path: path || self.class.name)
15
+ end
16
+ else
17
+ raise ArgumentError, 'no object to serialize'
6
18
  end
7
19
  end
8
20
 
9
- def attributes
10
- self.class.attributes
21
+ def fetch(name)
22
+ if respond_to?(name)
23
+ public_send(name)
24
+ else
25
+ self.class.attributes[name].fetch(object, name)
26
+ end
11
27
  end
12
28
 
13
29
  def valid?(object)
14
- attributes.all? do |name, attr|
30
+ self.class.attributes.all? do |name, attr|
15
31
  attr.valid?(attr.fetch(object, name))
16
32
  end
17
33
  end
@@ -19,7 +35,7 @@ module RiceBubble
19
35
  def validate!(object, path: '', **)
20
36
  path = self.class.name if path.empty?
21
37
 
22
- attributes.each do |name, attr|
38
+ self.class.attributes.each do |name, attr|
23
39
  value = attr.fetch(object, name)
24
40
  attr.validate!(
25
41
  value,
@@ -34,8 +50,8 @@ module RiceBubble
34
50
  end
35
51
 
36
52
  class << self
37
- def call(...)
38
- new.call(...)
53
+ def call(object = nil, ...)
54
+ new(object).call(...)
39
55
  end
40
56
 
41
57
  def attributes(attrs = nil, &)
@@ -1,3 +1,3 @@
1
1
  module RiceBubble
2
- VERSION = '0.1.0'.freeze
2
+ VERSION = '0.1.2'.freeze
3
3
  end
data/lib/rice_bubble.rb CHANGED
@@ -5,6 +5,7 @@ require_relative 'rice_bubble/attributes/any'
5
5
  require_relative 'rice_bubble/attributes/array'
6
6
  require_relative 'rice_bubble/attributes/boolean'
7
7
  require_relative 'rice_bubble/attributes/date'
8
+ require_relative 'rice_bubble/attributes/datetime'
8
9
  require_relative 'rice_bubble/attributes/enum'
9
10
  require_relative 'rice_bubble/attributes/number'
10
11
  require_relative 'rice_bubble/attributes/integer'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rice_bubble
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Powell
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-05-12 00:00:00.000000000 Z
11
+ date: 2023-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -146,6 +146,7 @@ files:
146
146
  - lib/rice_bubble/attributes/base.rb
147
147
  - lib/rice_bubble/attributes/boolean.rb
148
148
  - lib/rice_bubble/attributes/date.rb
149
+ - lib/rice_bubble/attributes/datetime.rb
149
150
  - lib/rice_bubble/attributes/enum.rb
150
151
  - lib/rice_bubble/attributes/integer.rb
151
152
  - lib/rice_bubble/attributes/literal.rb