bronze 0.0.1.alpha → 0.1.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 +5 -5
- data/CHANGELOG.md +31 -0
- data/DEVELOPMENT.md +78 -0
- data/README.md +801 -14
- data/lib/bronze.rb +2 -11
- data/lib/bronze/entities.rb +10 -0
- data/lib/bronze/entities/attributes.rb +241 -0
- data/lib/bronze/entities/attributes/builder.rb +249 -0
- data/lib/bronze/entities/attributes/metadata.rb +87 -0
- data/lib/bronze/entities/normalization.rb +69 -0
- data/lib/bronze/entities/primary_key.rb +70 -0
- data/lib/bronze/entities/primary_keys.rb +8 -0
- data/lib/bronze/entities/primary_keys/uuid.rb +44 -0
- data/lib/bronze/entity.rb +14 -0
- data/lib/bronze/not_implemented_error.rb +18 -0
- data/lib/bronze/transform.rb +29 -0
- data/lib/bronze/transforms.rb +9 -0
- data/lib/bronze/transforms/attributes.rb +9 -0
- data/lib/bronze/transforms/attributes/big_decimal_transform.rb +40 -0
- data/lib/bronze/transforms/attributes/date_time_transform.rb +60 -0
- data/lib/bronze/transforms/attributes/date_transform.rb +58 -0
- data/lib/bronze/transforms/attributes/symbol_transform.rb +36 -0
- data/lib/bronze/transforms/attributes/time_transform.rb +38 -0
- data/lib/bronze/transforms/entities.rb +9 -0
- data/lib/bronze/transforms/entities/normalize_transform.rb +52 -0
- data/lib/bronze/transforms/identity_transform.rb +31 -0
- data/lib/bronze/version.rb +12 -11
- metadata +70 -41
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
require 'bronze/transform'
|
6
|
+
require 'bronze/transforms/attributes'
|
7
|
+
|
8
|
+
module Bronze::Transforms::Attributes
|
9
|
+
# Transform class that normalizes a Date to a formatted string representation.
|
10
|
+
class DateTransform < Bronze::Transform
|
11
|
+
# Format string for ISO 8601 date format. Equivalent to YYYY-MM-DD.
|
12
|
+
ISO_8601 = '%F'
|
13
|
+
|
14
|
+
# @return [DateTransform] a memoized instance of DateTransform.
|
15
|
+
def self.instance
|
16
|
+
@instance ||= new
|
17
|
+
end
|
18
|
+
|
19
|
+
# @param format [String] The format string used to normalize and denormalize
|
20
|
+
# dates. The default is ISO 8601 format.
|
21
|
+
def initialize(format = ISO_8601)
|
22
|
+
@format = format
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [String] the format string.
|
26
|
+
attr_reader :format
|
27
|
+
|
28
|
+
# Converts a formatted Date string to a Date instance.
|
29
|
+
#
|
30
|
+
# @param value [String] The normalized string.
|
31
|
+
#
|
32
|
+
# @return [Date] the parsed date.
|
33
|
+
def denormalize(value)
|
34
|
+
return value if value.is_a?(Date)
|
35
|
+
|
36
|
+
return nil if value.nil? || value.empty?
|
37
|
+
|
38
|
+
Date.strptime(value, read_format)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Converts a Date to a formatted string.
|
42
|
+
#
|
43
|
+
# @param value [Date] The Date to format.
|
44
|
+
#
|
45
|
+
# @return [String] the formatted string.
|
46
|
+
def normalize(value)
|
47
|
+
return nil if value.nil?
|
48
|
+
|
49
|
+
value.strftime(format)
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def read_format
|
55
|
+
@read_format ||= format.gsub('%-', '%')
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bronze/transform'
|
4
|
+
require 'bronze/transforms/attributes'
|
5
|
+
|
6
|
+
module Bronze::Transforms::Attributes
|
7
|
+
# Transform class that converts a Symbol to a string.
|
8
|
+
class SymbolTransform < Bronze::Transform
|
9
|
+
# @return [SymbolTransform] a memoized instance of SymbolTransform.
|
10
|
+
def self.instance
|
11
|
+
@instance ||= new
|
12
|
+
end
|
13
|
+
|
14
|
+
# Converts a normalized String to a Symbol.
|
15
|
+
#
|
16
|
+
# @param value [String] The normalized string.
|
17
|
+
#
|
18
|
+
# @return [Symbol] the denormalized symbol.
|
19
|
+
def denormalize(value)
|
20
|
+
return nil if value.nil?
|
21
|
+
|
22
|
+
value.intern
|
23
|
+
end
|
24
|
+
|
25
|
+
# Converts a Symbol to a string.
|
26
|
+
#
|
27
|
+
# @param value [Symbol] The Symbol to normalize.
|
28
|
+
#
|
29
|
+
# @return [String] the string representation.
|
30
|
+
def normalize(value)
|
31
|
+
return nil if value.nil?
|
32
|
+
|
33
|
+
value.to_s
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
require 'bronze/transform'
|
6
|
+
require 'bronze/transforms/attributes'
|
7
|
+
|
8
|
+
module Bronze::Transforms::Attributes
|
9
|
+
# Transform class that converts a Time to an integer timestamp.
|
10
|
+
class TimeTransform < Bronze::Transform
|
11
|
+
# @return [TimeTransform] a memoized instance of TimeTransform.
|
12
|
+
def self.instance
|
13
|
+
@instance ||= new
|
14
|
+
end
|
15
|
+
|
16
|
+
# Converts an integer timestamp to a Time.
|
17
|
+
#
|
18
|
+
# @param value [Integer] The integer timestamp.
|
19
|
+
#
|
20
|
+
# @return [Time] the Time corresponding to the timestamp.
|
21
|
+
def denormalize(value)
|
22
|
+
return nil if value.nil?
|
23
|
+
|
24
|
+
Time.at(value).utc
|
25
|
+
end
|
26
|
+
|
27
|
+
# Converts a Time to an integer timestamp.
|
28
|
+
#
|
29
|
+
# @param value [Time] The Time to normalize.
|
30
|
+
#
|
31
|
+
# @return [Integer] the integer timestamp.
|
32
|
+
def normalize(value)
|
33
|
+
return nil if value.nil?
|
34
|
+
|
35
|
+
value.to_i
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bronze/transform'
|
4
|
+
require 'bronze/transforms/entities'
|
5
|
+
|
6
|
+
module Bronze::Transforms::Entities
|
7
|
+
# Transform class that maps an entity to a normal representation.
|
8
|
+
class NormalizeTransform < Bronze::Transform
|
9
|
+
# @param [Class] entity_class The entity class to normalize.
|
10
|
+
# @param [Array<Class>] permit An optional array of types to normalize
|
11
|
+
# as-is, rather than applying a transform. Only default transforms can be
|
12
|
+
# permitted, i.e. the built-in default transforms for BigDecimal, Date,
|
13
|
+
# DateTime, Symbol, and Time, or for an attribute with the
|
14
|
+
# :default_transform flag set to true.
|
15
|
+
def initialize(entity_class, permit: [])
|
16
|
+
@entity_class = entity_class
|
17
|
+
@permitted_types = permit
|
18
|
+
end
|
19
|
+
|
20
|
+
# @return [Class] the entity class to normalize.
|
21
|
+
attr_reader :entity_class
|
22
|
+
|
23
|
+
# @return [Array<Class>] array of types to normalize as-is.
|
24
|
+
attr_reader :permitted_types
|
25
|
+
|
26
|
+
# Returns an entity instance.
|
27
|
+
#
|
28
|
+
# @param attributes [Hash] The normal representation of an entity.
|
29
|
+
#
|
30
|
+
# @return [Bronze::Entity] the entity instance.
|
31
|
+
#
|
32
|
+
# @see [Bronze::Entities::Normalization::denormalize]
|
33
|
+
def denormalize(attributes)
|
34
|
+
return nil if attributes.nil?
|
35
|
+
|
36
|
+
entity_class.denormalize(attributes)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Returns a normalized representation of the entity.
|
40
|
+
#
|
41
|
+
# @param entity [Bronze::Entity] The entity to normalize.
|
42
|
+
#
|
43
|
+
# @return [Hash] the normal representation.
|
44
|
+
#
|
45
|
+
# @see [Bronze::Entities::Normalization#normalize]
|
46
|
+
def normalize(entity)
|
47
|
+
return nil if entity.nil?
|
48
|
+
|
49
|
+
entity.normalize(permit: permitted_types)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bronze/transform'
|
4
|
+
|
5
|
+
module Bronze::Transforms
|
6
|
+
# Transform class that maps an object to itself.
|
7
|
+
class IdentityTransform < Bronze::Transform
|
8
|
+
# @return [IdentityTransform] a memoized instance of IdentityTransform.
|
9
|
+
def self.instance
|
10
|
+
@instance ||= new
|
11
|
+
end
|
12
|
+
|
13
|
+
# Returns the object that was passed in to the method.
|
14
|
+
#
|
15
|
+
# @param object [Object] The object to denormalize.
|
16
|
+
#
|
17
|
+
# @return [Object] the object passed in.
|
18
|
+
def denormalize(object)
|
19
|
+
object
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns the object that was passed in to the method.
|
23
|
+
#
|
24
|
+
# @param object [Object] The object to normalize.
|
25
|
+
#
|
26
|
+
# @return [Object] the object passed in.
|
27
|
+
def normalize(object)
|
28
|
+
object
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/bronze/version.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Bronze
|
4
4
|
# @api private
|
@@ -10,11 +10,11 @@ module Bronze
|
|
10
10
|
# Major version.
|
11
11
|
MAJOR = 0
|
12
12
|
# Minor version.
|
13
|
-
MINOR =
|
13
|
+
MINOR = 1
|
14
14
|
# Patch version.
|
15
|
-
PATCH =
|
15
|
+
PATCH = 0
|
16
16
|
# Prerelease version.
|
17
|
-
PRERELEASE =
|
17
|
+
PRERELEASE = nil
|
18
18
|
# Build metadata.
|
19
19
|
BUILD = nil
|
20
20
|
|
@@ -27,7 +27,7 @@ module Bronze
|
|
27
27
|
#
|
28
28
|
# @see SleepingKingStudios::Tools::SemanticVersion#to_gem_version
|
29
29
|
def to_gem_version
|
30
|
-
str = "#{MAJOR}.#{MINOR}.#{PATCH}"
|
30
|
+
str = +"#{MAJOR}.#{MINOR}.#{PATCH}"
|
31
31
|
|
32
32
|
prerelease = value_of(:PRERELEASE)
|
33
33
|
str << ".#{prerelease}" if prerelease
|
@@ -36,11 +36,11 @@ module Bronze
|
|
36
36
|
str << ".#{build}" if build
|
37
37
|
|
38
38
|
str
|
39
|
-
end
|
39
|
+
end
|
40
40
|
|
41
41
|
private
|
42
42
|
|
43
|
-
def value_of
|
43
|
+
def value_of(constant)
|
44
44
|
return nil unless const_defined?(constant)
|
45
45
|
|
46
46
|
value = const_get(constant)
|
@@ -48,9 +48,10 @@ module Bronze
|
|
48
48
|
return nil if value.respond_to?(:empty?) && value.empty?
|
49
49
|
|
50
50
|
value
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
54
|
|
55
|
+
# The current version of the gem.
|
55
56
|
VERSION = Version.to_gem_version
|
56
|
-
end
|
57
|
+
end
|
metadata
CHANGED
@@ -1,144 +1,174 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bronze
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rob "Merlin" Smith
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-02-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: sleeping_king_studios-tools
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: '0.7'
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
22
|
+
version: 0.7.1
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - "~>"
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
29
|
+
version: '0.7'
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
32
|
+
version: 0.7.1
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
|
-
name:
|
34
|
+
name: rspec
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
37
|
- - "~>"
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version:
|
40
|
-
type: :
|
39
|
+
version: '3.8'
|
40
|
+
type: :development
|
41
41
|
prerelease: false
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
44
|
- - "~>"
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
46
|
+
version: '3.8'
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
48
|
+
name: rspec-sleeping_king_studios
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
50
50
|
requirements:
|
51
51
|
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
54
|
-
- - ">="
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version: 0.19.1
|
53
|
+
version: '2.5'
|
57
54
|
type: :development
|
58
55
|
prerelease: false
|
59
56
|
version_requirements: !ruby/object:Gem::Requirement
|
60
57
|
requirements:
|
61
58
|
- - "~>"
|
62
59
|
- !ruby/object:Gem::Version
|
63
|
-
version: '
|
64
|
-
- - ">="
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version: 0.19.1
|
60
|
+
version: '2.5'
|
67
61
|
- !ruby/object:Gem::Dependency
|
68
|
-
name:
|
62
|
+
name: rubocop
|
69
63
|
requirement: !ruby/object:Gem::Requirement
|
70
64
|
requirements:
|
71
65
|
- - "~>"
|
72
66
|
- !ruby/object:Gem::Version
|
73
|
-
version:
|
67
|
+
version: 0.63.0
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 0.63.1
|
74
71
|
type: :development
|
75
72
|
prerelease: false
|
76
73
|
version_requirements: !ruby/object:Gem::Requirement
|
77
74
|
requirements:
|
78
75
|
- - "~>"
|
79
76
|
- !ruby/object:Gem::Version
|
80
|
-
version:
|
77
|
+
version: 0.63.0
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: 0.63.1
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
|
-
name: rubocop
|
82
|
+
name: rubocop-rspec
|
83
83
|
requirement: !ruby/object:Gem::Requirement
|
84
84
|
requirements:
|
85
85
|
- - "~>"
|
86
86
|
- !ruby/object:Gem::Version
|
87
|
-
version:
|
87
|
+
version: 1.32.0
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
90
|
version_requirements: !ruby/object:Gem::Requirement
|
91
91
|
requirements:
|
92
92
|
- - "~>"
|
93
93
|
- !ruby/object:Gem::Version
|
94
|
-
version:
|
94
|
+
version: 1.32.0
|
95
95
|
- !ruby/object:Gem::Dependency
|
96
96
|
name: simplecov
|
97
97
|
requirement: !ruby/object:Gem::Requirement
|
98
98
|
requirements:
|
99
99
|
- - "~>"
|
100
100
|
- !ruby/object:Gem::Version
|
101
|
-
version: '0.
|
101
|
+
version: '0.16'
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: 0.16.1
|
102
105
|
type: :development
|
103
106
|
prerelease: false
|
104
107
|
version_requirements: !ruby/object:Gem::Requirement
|
105
108
|
requirements:
|
106
109
|
- - "~>"
|
107
110
|
- !ruby/object:Gem::Version
|
108
|
-
version: '0.
|
111
|
+
version: '0.16'
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: 0.16.1
|
109
115
|
- !ruby/object:Gem::Dependency
|
110
|
-
name:
|
116
|
+
name: thor
|
111
117
|
requirement: !ruby/object:Gem::Requirement
|
112
118
|
requirements:
|
113
119
|
- - "~>"
|
114
120
|
- !ruby/object:Gem::Version
|
115
|
-
version: '
|
121
|
+
version: '0.20'
|
116
122
|
- - ">="
|
117
123
|
- !ruby/object:Gem::Version
|
118
|
-
version:
|
124
|
+
version: 0.20.3
|
119
125
|
type: :development
|
120
126
|
prerelease: false
|
121
127
|
version_requirements: !ruby/object:Gem::Requirement
|
122
128
|
requirements:
|
123
129
|
- - "~>"
|
124
130
|
- !ruby/object:Gem::Version
|
125
|
-
version: '
|
131
|
+
version: '0.20'
|
126
132
|
- - ">="
|
127
133
|
- !ruby/object:Gem::Version
|
128
|
-
version:
|
129
|
-
description:
|
130
|
-
|
131
|
-
|
132
|
-
|
134
|
+
version: 0.20.3
|
135
|
+
description: |-
|
136
|
+
A composable application toolkit, providing data entities and collections,
|
137
|
+
transforms, contract-based validations and pre-built operations.
|
138
|
+
Architecture agnostic for easy integration with other toolkits or
|
139
|
+
frameworks.
|
133
140
|
email:
|
134
141
|
- merlin@sleepingkingstudios.com
|
135
142
|
executables: []
|
136
143
|
extensions: []
|
137
144
|
extra_rdoc_files: []
|
138
145
|
files:
|
146
|
+
- CHANGELOG.md
|
147
|
+
- DEVELOPMENT.md
|
139
148
|
- LICENSE
|
140
149
|
- README.md
|
141
150
|
- lib/bronze.rb
|
151
|
+
- lib/bronze/entities.rb
|
152
|
+
- lib/bronze/entities/attributes.rb
|
153
|
+
- lib/bronze/entities/attributes/builder.rb
|
154
|
+
- lib/bronze/entities/attributes/metadata.rb
|
155
|
+
- lib/bronze/entities/normalization.rb
|
156
|
+
- lib/bronze/entities/primary_key.rb
|
157
|
+
- lib/bronze/entities/primary_keys.rb
|
158
|
+
- lib/bronze/entities/primary_keys/uuid.rb
|
159
|
+
- lib/bronze/entity.rb
|
160
|
+
- lib/bronze/not_implemented_error.rb
|
161
|
+
- lib/bronze/transform.rb
|
162
|
+
- lib/bronze/transforms.rb
|
163
|
+
- lib/bronze/transforms/attributes.rb
|
164
|
+
- lib/bronze/transforms/attributes/big_decimal_transform.rb
|
165
|
+
- lib/bronze/transforms/attributes/date_time_transform.rb
|
166
|
+
- lib/bronze/transforms/attributes/date_transform.rb
|
167
|
+
- lib/bronze/transforms/attributes/symbol_transform.rb
|
168
|
+
- lib/bronze/transforms/attributes/time_transform.rb
|
169
|
+
- lib/bronze/transforms/entities.rb
|
170
|
+
- lib/bronze/transforms/entities/normalize_transform.rb
|
171
|
+
- lib/bronze/transforms/identity_transform.rb
|
142
172
|
- lib/bronze/version.rb
|
143
173
|
homepage: http://sleepingkingstudios.com
|
144
174
|
licenses:
|
@@ -155,12 +185,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
155
185
|
version: '0'
|
156
186
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
157
187
|
requirements:
|
158
|
-
- - "
|
188
|
+
- - ">="
|
159
189
|
- !ruby/object:Gem::Version
|
160
|
-
version:
|
190
|
+
version: '0'
|
161
191
|
requirements: []
|
162
|
-
|
163
|
-
rubygems_version: 2.5.1
|
192
|
+
rubygems_version: 3.0.1
|
164
193
|
signing_key:
|
165
194
|
specification_version: 4
|
166
195
|
summary: A composable application framework.
|