blueprinter 0.26.0 → 1.0.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/CHANGELOG.md +60 -50
- data/README.md +41 -52
- data/Rakefile +13 -1
- data/lib/blueprinter/base.rb +13 -15
- data/lib/blueprinter/blueprinter_error.rb +2 -0
- data/lib/blueprinter/configuration.rb +24 -2
- data/lib/blueprinter/deprecation.rb +5 -3
- data/lib/blueprinter/empty_types.rb +7 -9
- data/lib/blueprinter/extension.rb +22 -0
- data/lib/blueprinter/extensions.rb +37 -0
- data/lib/blueprinter/extractor.rb +6 -4
- data/lib/blueprinter/extractors/association_extractor.rb +8 -3
- data/lib/blueprinter/extractors/auto_extractor.rb +2 -0
- data/lib/blueprinter/extractors/block_extractor.rb +3 -1
- data/lib/blueprinter/extractors/hash_extractor.rb +2 -0
- data/lib/blueprinter/extractors/public_send_extractor.rb +3 -1
- data/lib/blueprinter/field.rb +44 -47
- data/lib/blueprinter/formatters/date_time_formatter.rb +3 -1
- data/lib/blueprinter/helpers/base_helpers.rb +17 -13
- data/lib/blueprinter/helpers/type_helpers.rb +5 -5
- data/lib/blueprinter/reflection.rb +71 -0
- data/lib/blueprinter/transformer.rb +4 -2
- data/lib/blueprinter/version.rb +3 -1
- data/lib/blueprinter/view.rb +7 -9
- data/lib/blueprinter/view_collection.rb +27 -11
- data/lib/blueprinter.rb +3 -0
- data/lib/generators/blueprinter/blueprint_generator.rb +37 -48
- data/lib/generators/blueprinter/templates/blueprint.rb +2 -0
- metadata +8 -173
- data/lib/tasks/blueprinter_tasks.rake +0 -4
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Blueprinter
|
4
|
+
#
|
5
|
+
# Public methods for reflecting on a Blueprint.
|
6
|
+
#
|
7
|
+
module Reflection
|
8
|
+
Field = Struct.new(:name, :display_name, :options)
|
9
|
+
Association = Struct.new(:name, :display_name, :blueprint, :view, :options)
|
10
|
+
|
11
|
+
#
|
12
|
+
# Returns a Hash of views keyed by name.
|
13
|
+
#
|
14
|
+
# Example:
|
15
|
+
#
|
16
|
+
# widget_view = WidgetBlueprint.reflections[:default]
|
17
|
+
# category = widget_view.associations[:category]
|
18
|
+
# category.blueprint
|
19
|
+
# => CategoryBlueprint
|
20
|
+
# category.view
|
21
|
+
# => :default
|
22
|
+
#
|
23
|
+
# @return [Hash<Symbol, Blueprinter::Reflection::View>]
|
24
|
+
#
|
25
|
+
def reflections
|
26
|
+
@reflections ||= view_collection.views.transform_values do |view|
|
27
|
+
View.new(view.name, view_collection)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
#
|
32
|
+
# Represents a view within a Blueprint.
|
33
|
+
#
|
34
|
+
class View
|
35
|
+
attr_reader :name
|
36
|
+
|
37
|
+
def initialize(name, view_collection)
|
38
|
+
@name = name
|
39
|
+
@view_collection = view_collection
|
40
|
+
end
|
41
|
+
|
42
|
+
#
|
43
|
+
# Returns a Hash of fields in this view (recursive) keyed by method name.
|
44
|
+
#
|
45
|
+
# @return [Hash<Symbol, Blueprinter::Reflection::Field>]
|
46
|
+
#
|
47
|
+
def fields
|
48
|
+
@fields ||= @view_collection.fields_for(name).each_with_object({}) do |field, obj|
|
49
|
+
next if field.options[:association]
|
50
|
+
|
51
|
+
obj[field.method] = Field.new(field.method, field.name, field.options)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
#
|
56
|
+
# Returns a Hash of associations in this view (recursive) keyed by method name.
|
57
|
+
#
|
58
|
+
# @return [Hash<Symbol, Blueprinter::Reflection::Association>]
|
59
|
+
#
|
60
|
+
def associations
|
61
|
+
@associations ||= @view_collection.fields_for(name).each_with_object({}) do |field, obj|
|
62
|
+
next unless field.options[:association]
|
63
|
+
|
64
|
+
blueprint = field.options.fetch(:blueprint)
|
65
|
+
view = field.options[:view] || :default
|
66
|
+
obj[field.method] = Association.new(field.method, field.name, blueprint, view, field.options)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -1,12 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Blueprinter
|
2
4
|
# @api private
|
3
5
|
class Transformer
|
4
6
|
def transform(_result_hash, _primary_obj, _options = {})
|
5
|
-
|
7
|
+
raise NotImplementedError, 'A Transformer must implement #transform'
|
6
8
|
end
|
7
9
|
|
8
10
|
def self.transform(result_hash, primary_obj, options = {})
|
9
|
-
|
11
|
+
new.transform(result_hash, primary_obj, options)
|
10
12
|
end
|
11
13
|
end
|
12
14
|
end
|
data/lib/blueprinter/version.rb
CHANGED
data/lib/blueprinter/view.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Blueprinter
|
2
4
|
# @api private
|
3
5
|
DefinitionPlaceholder = Struct.new :name, :view?
|
@@ -14,18 +16,14 @@ module Blueprinter
|
|
14
16
|
@sort_by_definition = Blueprinter.configuration.sort_fields_by.eql?(:definition)
|
15
17
|
end
|
16
18
|
|
17
|
-
def
|
18
|
-
|
19
|
-
end
|
19
|
+
def track_definition_order(method, viewable: true)
|
20
|
+
return unless @sort_by_definition
|
20
21
|
|
21
|
-
|
22
|
-
if @sort_by_definition
|
23
|
-
@definition_order << DefinitionPlaceholder.new(method, is_view)
|
24
|
-
end
|
22
|
+
@definition_order << DefinitionPlaceholder.new(method, viewable)
|
25
23
|
end
|
26
24
|
|
27
25
|
def inherit(view)
|
28
|
-
view.fields.
|
26
|
+
view.fields.each_value do |field|
|
29
27
|
self << field
|
30
28
|
end
|
31
29
|
|
@@ -69,7 +67,7 @@ module Blueprinter
|
|
69
67
|
end
|
70
68
|
|
71
69
|
def <<(field)
|
72
|
-
track_definition_order(field.name,false)
|
70
|
+
track_definition_order(field.name, viewable: false)
|
73
71
|
fields[field.name] = field
|
74
72
|
end
|
75
73
|
end
|
@@ -1,7 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Blueprinter
|
2
4
|
# @api private
|
3
5
|
class ViewCollection
|
4
6
|
attr_reader :views, :sort_by_definition
|
7
|
+
|
5
8
|
def initialize
|
6
9
|
@views = {
|
7
10
|
identifier: View.new(:identifier),
|
@@ -16,8 +19,8 @@ module Blueprinter
|
|
16
19
|
end
|
17
20
|
end
|
18
21
|
|
19
|
-
def
|
20
|
-
views.
|
22
|
+
def view?(view_name)
|
23
|
+
views.key? view_name
|
21
24
|
end
|
22
25
|
|
23
26
|
def fields_for(view_name)
|
@@ -26,11 +29,15 @@ module Blueprinter
|
|
26
29
|
fields, excluded_fields = sortable_fields(view_name)
|
27
30
|
sorted_fields = sort_by_definition ? sort_by_def(view_name, fields) : fields.values.sort_by(&:name)
|
28
31
|
|
29
|
-
(identifier_fields + sorted_fields).
|
32
|
+
(identifier_fields + sorted_fields).tap do |fields_array|
|
33
|
+
fields_array.reject! { |field| excluded_fields.include?(field.name) }
|
34
|
+
end
|
30
35
|
end
|
31
36
|
|
32
37
|
def transformers(view_name)
|
33
|
-
|
38
|
+
included_transformers = gather_transformers_from_included_views(view_name).reverse
|
39
|
+
all_transformers = views[:default].view_transformers.concat(included_transformers).uniq
|
40
|
+
all_transformers.empty? ? Blueprinter.configuration.default_transformers : all_transformers
|
34
41
|
end
|
35
42
|
|
36
43
|
def [](view_name)
|
@@ -47,15 +54,15 @@ module Blueprinter
|
|
47
54
|
# @return [Array<(Hash, Hash<String, NilClass>)>] fields, excluded_fields
|
48
55
|
def sortable_fields(view_name)
|
49
56
|
excluded_fields = {}
|
50
|
-
fields = views[:default].fields
|
57
|
+
fields = views[:default].fields.clone
|
51
58
|
views[view_name].included_view_names.each do |included_view_name|
|
52
59
|
next if view_name == included_view_name
|
53
60
|
|
54
61
|
view_fields, view_excluded_fields = sortable_fields(included_view_name)
|
55
|
-
fields
|
62
|
+
fields.merge!(view_fields)
|
56
63
|
excluded_fields.merge!(view_excluded_fields)
|
57
64
|
end
|
58
|
-
fields
|
65
|
+
fields.merge!(views[view_name].fields) unless view_name == :default
|
59
66
|
|
60
67
|
views[view_name].excluded_field_names.each { |name| excluded_fields[name] = nil }
|
61
68
|
|
@@ -65,7 +72,9 @@ module Blueprinter
|
|
65
72
|
# select and order members of fields according to traversal of the definition_orders
|
66
73
|
def sort_by_def(view_name, fields)
|
67
74
|
ordered_fields = {}
|
68
|
-
views[:default].definition_order.each
|
75
|
+
views[:default].definition_order.each do |definition|
|
76
|
+
add_to_ordered_fields(ordered_fields, definition, fields, view_name)
|
77
|
+
end
|
69
78
|
ordered_fields.values
|
70
79
|
end
|
71
80
|
|
@@ -74,15 +83,22 @@ module Blueprinter
|
|
74
83
|
def add_to_ordered_fields(ordered_fields, definition, fields, view_name_filter = nil)
|
75
84
|
if definition.view?
|
76
85
|
if view_name_filter.nil? || view_name_filter == definition.name
|
77
|
-
views[definition.name].definition_order.each
|
86
|
+
views[definition.name].definition_order.each do |defined|
|
87
|
+
add_to_ordered_fields(ordered_fields, defined, fields)
|
88
|
+
end
|
78
89
|
end
|
79
90
|
else
|
80
91
|
ordered_fields[definition.name] = fields[definition.name]
|
81
92
|
end
|
82
93
|
end
|
83
94
|
|
84
|
-
def
|
85
|
-
|
95
|
+
def gather_transformers_from_included_views(view_name)
|
96
|
+
current_view = views[view_name]
|
97
|
+
current_view.included_view_names.flat_map do |included_view_name|
|
98
|
+
next [] if view_name == included_view_name
|
99
|
+
|
100
|
+
gather_transformers_from_included_views(included_view_name)
|
101
|
+
end.concat(current_view.view_transformers)
|
86
102
|
end
|
87
103
|
end
|
88
104
|
end
|
data/lib/blueprinter.rb
CHANGED
@@ -1,39 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Blueprinter
|
2
4
|
module Generators
|
3
5
|
class BlueprintGenerator < ::Rails::Generators::NamedBase
|
4
|
-
desc
|
6
|
+
desc 'Generates blueprint for ActiveRecord model with the given NAME.'
|
5
7
|
|
6
8
|
attr_accessor :options
|
7
9
|
|
8
|
-
source_root File.expand_path(
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
class_option :blueprints_dir, default: "app/blueprints", desc: "path to new blueprint", aliases: "-d"
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
class_option :identifier, default: nil, desc: "Add an identifer to the generated blueprint, either uses :id or your specified value", aliases: "-i", banner: "id"
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
class_option :fields, type: :array, default: [], desc: "Manually add specified fields"
|
10
|
+
source_root File.expand_path('templates', __dir__)
|
21
11
|
|
22
|
-
class_option :
|
12
|
+
class_option :blueprints_dir, default: 'app/blueprints', desc: 'path to new blueprint', aliases: '-d'
|
23
13
|
|
14
|
+
class_option :identifier, default: nil,
|
15
|
+
desc: 'Add an identifer to the generated blueprint, either uses :id or your specified value', aliases: '-i', banner: 'id'
|
24
16
|
|
17
|
+
class_option :fields, type: :array, default: [], desc: 'Manually add specified fields'
|
25
18
|
|
26
|
-
class_option :
|
19
|
+
class_option :detect_fields, type: :boolean, default: false,
|
20
|
+
desc: 'Introspect on the model to set fields in the generated blueprint. Will be merged with any manually specified'
|
27
21
|
|
28
|
-
class_option :
|
22
|
+
class_option :associations, type: :array, default: [], desc: 'Manually add specified associations', aliases: '-a'
|
29
23
|
|
24
|
+
class_option :detect_associations, type: :boolean, default: false,
|
25
|
+
desc: 'Introspect on the model to set associations in the generated blueprint. Will be merged with any manually specified'
|
30
26
|
|
27
|
+
class_option :wrap_at, type: :numeric, default: 80, desc: 'Maximum length of generated fields line', aliases: '-w'
|
31
28
|
|
32
|
-
class_option :
|
33
|
-
|
34
|
-
class_option :indentation, type: :string, default: "two", desc: "Indentation of generated file", banner: "two|four|tab"
|
35
|
-
|
36
|
-
|
29
|
+
class_option :indentation, type: :string, default: 'two', desc: 'Indentation of generated file',
|
30
|
+
banner: 'two|four|tab'
|
37
31
|
|
38
32
|
remove_class_option :skip_namespace
|
39
33
|
|
@@ -42,30 +36,28 @@ module Blueprinter
|
|
42
36
|
end
|
43
37
|
|
44
38
|
def create_blueprint
|
45
|
-
template
|
39
|
+
template 'blueprint.rb', File.join(path, "#{file_path}_blueprint.rb")
|
46
40
|
end
|
47
41
|
|
48
|
-
|
49
|
-
|
50
42
|
private
|
51
43
|
|
52
44
|
def path
|
53
|
-
options[
|
45
|
+
options['blueprints_dir']
|
54
46
|
end
|
55
47
|
|
56
48
|
def identifier_symbol
|
57
|
-
|
58
|
-
|
59
|
-
|
49
|
+
return unless options['identifier']
|
50
|
+
|
51
|
+
options['identifier'] == 'identifier' ? :id : options['identifier']
|
60
52
|
end
|
61
53
|
|
62
54
|
def fields
|
63
|
-
fs = if options[
|
64
|
-
Array.new(options[
|
55
|
+
fs = if options['detect_fields']
|
56
|
+
Array.new(options['fields']).concat(introspected_fields)
|
65
57
|
else
|
66
|
-
options[
|
58
|
+
options['fields']
|
67
59
|
end
|
68
|
-
fs.reject
|
60
|
+
fs.reject(&:blank?).uniq
|
69
61
|
end
|
70
62
|
|
71
63
|
def introspected_fields
|
@@ -75,30 +67,29 @@ module Blueprinter
|
|
75
67
|
# split at wrap_at chars, two indentations
|
76
68
|
def formatted_fields
|
77
69
|
two_indents = indent * 2
|
78
|
-
fields_string = fields.
|
79
|
-
if
|
70
|
+
fields_string = fields.each_with_object([]) do |f, memo|
|
71
|
+
if memo.last.nil?
|
72
|
+
memo << " :#{f},"
|
73
|
+
else
|
80
74
|
now = "#{memo.last} :#{f},"
|
81
|
-
if now.length > options[
|
75
|
+
if now.length > options['wrap_at'].to_i
|
82
76
|
memo << ":#{f},"
|
83
77
|
else
|
84
78
|
memo[memo.length - 1] = now
|
85
79
|
end
|
86
|
-
else
|
87
|
-
memo << " :#{f},"
|
88
80
|
end
|
89
|
-
memo
|
90
81
|
end.join("\n#{two_indents}")
|
91
82
|
|
92
|
-
fields_string[0,fields_string.length - 1]
|
83
|
+
fields_string[0, fields_string.length - 1]
|
93
84
|
end
|
94
85
|
|
95
86
|
def associations
|
96
|
-
as = if options[
|
97
|
-
Array.new(options[
|
87
|
+
as = if options['detect_associations']
|
88
|
+
Array.new(options['associations']).concat(introspected_associations.keys)
|
98
89
|
else
|
99
|
-
options[
|
90
|
+
options['associations']
|
100
91
|
end
|
101
|
-
as.reject
|
92
|
+
as.reject(&:blank?).uniq
|
102
93
|
end
|
103
94
|
|
104
95
|
def introspected_associations
|
@@ -112,15 +103,13 @@ module Blueprinter
|
|
112
103
|
def association_class(association_name)
|
113
104
|
introspected_name = if introspected_associations[association_name].respond_to?(:klass)
|
114
105
|
introspected_associations[association_name].klass.to_s
|
115
|
-
else
|
116
|
-
nil
|
117
106
|
end
|
118
107
|
"#{introspected_name || association_name.camelcase}Blueprint"
|
119
108
|
end
|
120
109
|
|
121
110
|
def indent
|
122
|
-
user_intended = {two:
|
123
|
-
user_intended.nil? ?
|
111
|
+
user_intended = { two: ' ', four: ' ', tab: "\t" }[options['indentation'].intern]
|
112
|
+
user_intended.nil? ? ' ' : user_intended
|
124
113
|
end
|
125
114
|
end
|
126
115
|
end
|
metadata
CHANGED
@@ -1,183 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blueprinter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Procore Technologies, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: activerecord
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 6.1.7
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 6.1.7
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: ammeter
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 1.1.4
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 1.1.4
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: factory_bot
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: nokogiri
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 1.8.2
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: 1.8.2
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: oj
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '3.0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '3.0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: pry
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: rake
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: rspec
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - "~>"
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '3.7'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - "~>"
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '3.7'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: rspec-rails
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - "~>"
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '6.0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - "~>"
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '6.0'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: sqlite3
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - "~>"
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: 1.4.2
|
146
|
-
type: :development
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - "~>"
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: 1.4.2
|
153
|
-
- !ruby/object:Gem::Dependency
|
154
|
-
name: yajl-ruby
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
- - "~>"
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: 1.4.1
|
160
|
-
type: :development
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - "~>"
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: 1.4.1
|
167
|
-
- !ruby/object:Gem::Dependency
|
168
|
-
name: yard
|
169
|
-
requirement: !ruby/object:Gem::Requirement
|
170
|
-
requirements:
|
171
|
-
- - "~>"
|
172
|
-
- !ruby/object:Gem::Version
|
173
|
-
version: 0.9.11
|
174
|
-
type: :development
|
175
|
-
prerelease: false
|
176
|
-
version_requirements: !ruby/object:Gem::Requirement
|
177
|
-
requirements:
|
178
|
-
- - "~>"
|
179
|
-
- !ruby/object:Gem::Version
|
180
|
-
version: 0.9.11
|
11
|
+
date: 2024-01-18 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
181
13
|
description: Blueprinter is a JSON Object Presenter for Ruby that takes business objects
|
182
14
|
and breaks them down into simple hashes and serializes them to JSON. It can be used
|
183
15
|
in Rails in place of other serializers (like JBuilder or ActiveModelSerializers).
|
@@ -198,6 +30,8 @@ files:
|
|
198
30
|
- lib/blueprinter/configuration.rb
|
199
31
|
- lib/blueprinter/deprecation.rb
|
200
32
|
- lib/blueprinter/empty_types.rb
|
33
|
+
- lib/blueprinter/extension.rb
|
34
|
+
- lib/blueprinter/extensions.rb
|
201
35
|
- lib/blueprinter/extractor.rb
|
202
36
|
- lib/blueprinter/extractors/association_extractor.rb
|
203
37
|
- lib/blueprinter/extractors/auto_extractor.rb
|
@@ -208,18 +42,19 @@ files:
|
|
208
42
|
- lib/blueprinter/formatters/date_time_formatter.rb
|
209
43
|
- lib/blueprinter/helpers/base_helpers.rb
|
210
44
|
- lib/blueprinter/helpers/type_helpers.rb
|
45
|
+
- lib/blueprinter/reflection.rb
|
211
46
|
- lib/blueprinter/transformer.rb
|
212
47
|
- lib/blueprinter/version.rb
|
213
48
|
- lib/blueprinter/view.rb
|
214
49
|
- lib/blueprinter/view_collection.rb
|
215
50
|
- lib/generators/blueprinter/blueprint_generator.rb
|
216
51
|
- lib/generators/blueprinter/templates/blueprint.rb
|
217
|
-
- lib/tasks/blueprinter_tasks.rake
|
218
52
|
homepage: https://github.com/procore-oss/blueprinter
|
219
53
|
licenses:
|
220
54
|
- MIT
|
221
55
|
metadata:
|
222
56
|
allowed_push_host: https://rubygems.org
|
57
|
+
rubygems_mfa_required: 'true'
|
223
58
|
post_install_message:
|
224
59
|
rdoc_options: []
|
225
60
|
require_paths:
|