blueprinter 0.14.0 → 0.15.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1df67b25b05137cc97ddd5e8c0db7430086d3ea9dddd7ab2164944dba191fddc
4
- data.tar.gz: d1e9a05b61be95ef8a4d627fb6908db38975d6f321cf325a13bb93a7402a03b8
3
+ metadata.gz: a3d1968ce7648f29d301d61dd92a016b0a6ca65a515ad7ee196a4b6958634d3d
4
+ data.tar.gz: b8abfa3db3801439ff6405ec695863913081cdb0c339f983279cfad75812d867
5
5
  SHA512:
6
- metadata.gz: 4f2c771da50005f7a8d886bf1318f5d00069b76d1c96b78dc3ef14162272278ecddec09e6735d73a8946be7c8229ae2bc96f158a1978e53b1f99d1763b04509b
7
- data.tar.gz: ed2a05555940425a7847028f85084f0a4fe3a2c063ea480d9e179931f792900ababe0f0d0230050441da87c9bcb3137b1151f9c393838123e80365873ff86dc8
6
+ metadata.gz: 41f969a27e181dd1a6e7534223eb5419e7a5c279c97a4f2da4e775c0ec05b4cfac30aa2a102891331b29ef4b644424fefece493abf90b743cca9b9ebbaff1390
7
+ data.tar.gz: 187e6c5af1f43aab7b5043cb86dc3bea9dd705397eaae0888747a429ea7a4d903a6631eb35940a43960c7070b9a8297ecf236795ddaad4ecacae09b59c1735d4
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 0.15.0 - 2019/04/1
2
+ * 🚀 [FEATURE] Add ability to pass in `datetime_format` field option as either a string representing the strptime format, or a Proc which takes in the Date or DateTime object and returns the formatted date. [#145](https://github.com/procore/blueprinter/pull/145). Thanks to [@mcclayton](https://github.com/mcclayton).
3
+
1
4
  ## 0.14.0 - 2019/04/01
2
5
  * 🚀 [FEATURE] Added a global `datetime_format` option. [#135](https://github.com/procore/blueprinter/pull/143). Thanks to [@ritikesh](https://github.com/ritikesh).
3
6
 
data/README.md CHANGED
@@ -148,7 +148,7 @@ puts UserBlueprint.render(user, view: :normal, root: :user)
148
148
 
149
149
  Output:
150
150
  ```json
151
- {
151
+ {
152
152
  "user": {
153
153
  "uuid": "733f0758-8f21-4719-875f-262c3ec743af",
154
154
  "first_name": "John",
@@ -182,7 +182,7 @@ puts json
182
182
 
183
183
  Output:
184
184
  ```json
185
- {
185
+ {
186
186
  "user": {
187
187
  "uuid": "733f0758-8f21-4719-875f-262c3ec743af",
188
188
  "first_name": "John",
@@ -197,7 +197,7 @@ Output:
197
197
  }
198
198
  }
199
199
  ```
200
- Note: For meta attributes, a [root](#root) is mandatory.
200
+ _NOTE:_ For meta attributes, a [root](#root) is mandatory.
201
201
 
202
202
  ### Exclude fields
203
203
  You can specifically choose to exclude certain fields for specific views
@@ -324,7 +324,7 @@ class TaskBlueprint < Blueprinter::Base
324
324
  end
325
325
  end
326
326
  ```
327
- Note: `taskable.blueprint` should return a valid Blueprint class. Currently, `has_many` is not supported because of the very nature of polymorphic associations.
327
+ _NOTE:_ `taskable.blueprint` should return a valid Blueprint class. Currently, `has_many` is not supported because of the very nature of polymorphic associations.
328
328
 
329
329
  ### Defining a field directly in the Blueprint
330
330
 
@@ -503,12 +503,26 @@ class UserBlueprint < Blueprinter::Base
503
503
  end
504
504
  ```
505
505
 
506
- The field-level setting overrides the global config setting (for the field) if both are set.
506
+ _NOTE:_ The field-level setting overrides the global config setting (for the field) if both are set.
507
507
 
508
508
  ### Custom formatting for dates and times
509
- To define a custom format for a Date or DateTime field, include the option `datetime_format` with the associated `strptime` format.
509
+ To define a custom format for a Date or DateTime field, include the option `datetime_format`.
510
+ This global or field-level option can be either a string representing the associated `strptime` format,
511
+ or a Proc which receives the original Date/DateTime object and returns the formatted value.
512
+ When using a Proc, it is the Proc's responsibility to handle any errors in formatting.
510
513
 
511
- Usage:
514
+
515
+ #### Global Config Setting
516
+ If a global datetime_format is set (either as a string format or a Proc), this option will be
517
+ invoked and used to format all fields that respond to `strptime`.
518
+ ```ruby
519
+ Blueprinter.configure do |config|
520
+ config.datetime_format = ->(datetime) { datetime.nil? ? datetime : datetime.strftime("%s").to_i }
521
+ end
522
+ ```
523
+
524
+ #### Field-level Setting
525
+ Usage (String Option):
512
526
  ```ruby
513
527
  class UserBlueprint < Blueprinter::Base
514
528
  identifier :name
@@ -524,6 +538,24 @@ Output:
524
538
  }
525
539
  ```
526
540
 
541
+ Usage (Proc Option):
542
+ ```ruby
543
+ class UserBlueprint < Blueprinter::Base
544
+ identifier :name
545
+ field :birthday, datetime_format: ->(datetime) { datetime.nil? ? datetime : datetime.strftime("%s").to_i }
546
+ end
547
+ ```
548
+
549
+ Output:
550
+ ```json
551
+ {
552
+ "name": "John Doe",
553
+ "birthday": 762739200
554
+ }
555
+ ```
556
+
557
+ _NOTE:_ The field-level setting overrides the global config setting (for the field) if both are set.
558
+
527
559
  ## Installation
528
560
  Add this line to your application's Gemfile:
529
561
 
@@ -603,7 +635,7 @@ Blueprinter.configure do |config|
603
635
  end
604
636
  ```
605
637
 
606
- Note: You should be doing this only if you aren't using `yajl-ruby` through the JSON API by requiring `yajl/json_gem`. More details [here](https://github.com/brianmario/yajl-ruby#json-gem-compatibility-api). In this case, `JSON.generate` is patched to use `Yajl::Encoder.encode` internally.
638
+ _NOTE:_ You should be doing this only if you aren't using `yajl-ruby` through the JSON API by requiring `yajl/json_gem`. More details [here](https://github.com/brianmario/yajl-ruby#json-gem-compatibility-api). In this case, `JSON.generate` is patched to use `Yajl::Encoder.encode` internally.
607
639
 
608
640
  ## How to Document
609
641
 
@@ -71,8 +71,11 @@ module Blueprinter
71
71
  # @option options [Symbol] :name Use this to rename the method. Useful if
72
72
  # if you want your JSON key named differently in the output than your
73
73
  # object's field or method name.
74
- # @option options [String] :datetime_format Format Date or DateTime object
75
- # with given strftime formatting
74
+ # @option options [String,Proc] :datetime_format Format Date or DateTime object
75
+ # If the option provided is a String, the object will be formatted with given strftime
76
+ # formatting.
77
+ # If this option is a Proc, the object will be formatted by calling the provided Proc
78
+ # on the Date/DateTime object.
76
79
  # @option options [Symbol,Proc] :if Specifies a method, proc or string to
77
80
  # call to determine if the field should be included (e.g.
78
81
  # `if: :include_first_name?, or if: Proc.new { |user, options| options[:current_user] == user }).
@@ -171,7 +174,7 @@ module Blueprinter
171
174
  # @option options [Symbol|String] :root Defaults to nil.
172
175
  # Render the json/hash with a root key if provided.
173
176
  # @option options [Any] :meta Defaults to nil.
174
- # Render the json/hash with a meta attribute with provided value
177
+ # Render the json/hash with a meta attribute with provided value
175
178
  # if both root and meta keys are provided in the options hash.
176
179
  #
177
180
  # @example Generating JSON with an extended view
@@ -196,7 +199,7 @@ module Blueprinter
196
199
  # @option options [Symbol|String] :root Defaults to nil.
197
200
  # Render the json/hash with a root key if provided.
198
201
  # @option options [Any] :meta Defaults to nil.
199
- # Render the json/hash with a meta attribute with provided value
202
+ # Render the json/hash with a meta attribute with provided value
200
203
  # if both root and meta keys are provided in the options hash.
201
204
  #
202
205
  # @example Generating a hash with an extended view
@@ -221,7 +224,7 @@ module Blueprinter
221
224
  # @option options [Symbol|String] :root Defaults to nil.
222
225
  # Render the json/hash with a root key if provided.
223
226
  # @option options [Any] :meta Defaults to nil.
224
- # Render the json/hash with a meta attribute with provided value
227
+ # Render the json/hash with a meta attribute with provided value
225
228
  # if both root and meta keys are provided in the options hash.
226
229
  #
227
230
  # @example Generating a hash with an extended view
@@ -9,7 +9,6 @@ module Blueprinter
9
9
 
10
10
  def extract(field_name, object, local_options, options = {})
11
11
  extraction = extractor(object, options).extract(field_name, object, local_options, options)
12
-
13
12
  value = @datetime_formatter.format(extraction, options)
14
13
  value.nil? ? default_value(options) : value
15
14
  end
@@ -1,13 +1,15 @@
1
1
  module Blueprinter
2
2
  class DateTimeFormatter
3
+ InvalidDateTimeFormatterError = Class.new(BlueprinterError)
4
+
3
5
  def format(value, options)
4
6
  return value if value.nil?
5
-
7
+
6
8
  field_format = options[:datetime_format]
7
9
  if value.respond_to?(:strftime)
8
10
  value = format_datetime(value, field_format)
9
11
  elsif field_format
10
- raise BlueprinterError, 'Cannot format invalid DateTime object'
12
+ raise InvalidDateTimeFormatterError, 'Cannot format invalid DateTime object'
11
13
  end
12
14
  value
13
15
  end
@@ -16,7 +18,14 @@ module Blueprinter
16
18
 
17
19
  def format_datetime(value, field_format)
18
20
  format = field_format || Blueprinter.configuration.datetime_format
19
- format.nil? ? value : value.strftime(format)
21
+
22
+ case format
23
+ when NilClass then value
24
+ when Proc then format.call(value)
25
+ when String then value.strftime(format)
26
+ else
27
+ raise InvalidDateTimeFormatterError, 'Cannot format DateTime object with invalid formatter: #{format.class}'
28
+ end
20
29
  end
21
30
  end
22
31
  end
@@ -1,3 +1,3 @@
1
1
  module Blueprinter
2
- VERSION = '0.14.0'
2
+ VERSION = '0.15.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blueprinter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Hess
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-04-01 00:00:00.000000000 Z
12
+ date: 2019-04-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: factory_bot