hashcraft 1.0.0.pre.alpha.1
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 +7 -0
- data/.editorconfig +8 -0
- data/.gitignore +8 -0
- data/.rubocop.yml +31 -0
- data/.ruby-version +1 -0
- data/.travis.yml +24 -0
- data/CHANGELOG.md +7 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +5 -0
- data/Guardfile +16 -0
- data/LICENSE +7 -0
- data/README.md +305 -0
- data/Rakefile +17 -0
- data/bin/console +15 -0
- data/hashcraft.gemspec +38 -0
- data/lib/hashcraft.rb +22 -0
- data/lib/hashcraft/base.rb +70 -0
- data/lib/hashcraft/compiler.rb +80 -0
- data/lib/hashcraft/core_ext/hash.rb +21 -0
- data/lib/hashcraft/dsl.rb +49 -0
- data/lib/hashcraft/generic.rb +11 -0
- data/lib/hashcraft/generic/dictionary.rb +54 -0
- data/lib/hashcraft/generic/registry.rb +65 -0
- data/lib/hashcraft/mutator_registry.rb +26 -0
- data/lib/hashcraft/mutators/array.rb +25 -0
- data/lib/hashcraft/mutators/hash.rb +25 -0
- data/lib/hashcraft/mutators/property.rb +24 -0
- data/lib/hashcraft/option.rb +62 -0
- data/lib/hashcraft/transformer_registry.rb +26 -0
- data/lib/hashcraft/transformers/camel_case.rb +27 -0
- data/lib/hashcraft/transformers/pascal_case.rb +25 -0
- data/lib/hashcraft/transformers/pass_thru.rb +21 -0
- data/lib/hashcraft/version.rb +12 -0
- metadata +179 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2020-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
require_relative 'mutators/array'
|
11
|
+
require_relative 'mutators/hash'
|
12
|
+
require_relative 'mutators/property'
|
13
|
+
|
14
|
+
module Hashcraft
|
15
|
+
# Singleton that knows how to register and retrieve mutator instances.
|
16
|
+
class MutatorRegistry < Generic::Registry
|
17
|
+
def initialize
|
18
|
+
super(
|
19
|
+
'array' => Mutators::Array.instance,
|
20
|
+
'hash' => Mutators::Hash.instance,
|
21
|
+
'property' => Mutators::Property.instance,
|
22
|
+
'' => Mutators::Property.instance
|
23
|
+
)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2020-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
module Hashcraft
|
11
|
+
module Mutators
|
12
|
+
# When a hash's key is an arry then this mutator can be used to push a new value on the
|
13
|
+
# respective array.
|
14
|
+
class Array
|
15
|
+
include Singleton
|
16
|
+
|
17
|
+
def value!(data, key, value)
|
18
|
+
data[key] ||= []
|
19
|
+
data[key] << value
|
20
|
+
|
21
|
+
self
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2020-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
module Hashcraft
|
11
|
+
module Mutators
|
12
|
+
# When a hash's key a Hash then this mutator can be used to merge a new value on the
|
13
|
+
# respective hash.
|
14
|
+
class Hash
|
15
|
+
include Singleton
|
16
|
+
|
17
|
+
def value!(data, key, value)
|
18
|
+
data[key] ||= {}
|
19
|
+
data[key].merge!(value || {})
|
20
|
+
|
21
|
+
self
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2020-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
module Hashcraft
|
11
|
+
module Mutators
|
12
|
+
# When a hash key can be simply assigned to (like a property) then this mutator can be used to
|
13
|
+
# simply do the assignment.
|
14
|
+
class Property
|
15
|
+
include Singleton
|
16
|
+
|
17
|
+
def value!(data, key, value)
|
18
|
+
data[key] = value
|
19
|
+
|
20
|
+
self
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2020-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
module Hashcraft
|
11
|
+
# Defines a method and corresponding attribute for a craftable class.
|
12
|
+
class Option
|
13
|
+
attr_reader :craft,
|
14
|
+
:default,
|
15
|
+
:eager,
|
16
|
+
:key,
|
17
|
+
:mutator,
|
18
|
+
:name
|
19
|
+
|
20
|
+
def initialize(name, opts = {})
|
21
|
+
raise ArgumentError, 'name is required' if name.to_s.empty?
|
22
|
+
|
23
|
+
@craft = opts[:craft]
|
24
|
+
@default = opts[:default]
|
25
|
+
@eager = opts[:eager] || false
|
26
|
+
@internal_meta = (opts[:meta] || {}).symbolize_keys
|
27
|
+
@key = opts[:key].to_s
|
28
|
+
@mutator = MutatorRegistry.resolve(opts[:mutator])
|
29
|
+
@name = name.to_s
|
30
|
+
|
31
|
+
freeze
|
32
|
+
end
|
33
|
+
|
34
|
+
def meta(key)
|
35
|
+
internal_meta[key.to_s.to_sym]
|
36
|
+
end
|
37
|
+
|
38
|
+
def default!(data)
|
39
|
+
return self unless eager
|
40
|
+
|
41
|
+
data[name] = default
|
42
|
+
|
43
|
+
self
|
44
|
+
end
|
45
|
+
|
46
|
+
def value!(data, value, &block)
|
47
|
+
value = craft_value(value, &block)
|
48
|
+
|
49
|
+
mutator.value!(data, name, value)
|
50
|
+
|
51
|
+
self
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
attr_reader :internal_meta
|
57
|
+
|
58
|
+
def craft_value(value, &block)
|
59
|
+
craft ? craft.new(value, &block) : value
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2020-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
require_relative 'transformers/camel_case'
|
11
|
+
require_relative 'transformers/pascal_case'
|
12
|
+
require_relative 'transformers/pass_thru'
|
13
|
+
|
14
|
+
module Hashcraft
|
15
|
+
# Singleton that knows how to register and retrieve transformer instances.
|
16
|
+
class TransformerRegistry < Generic::Registry
|
17
|
+
def initialize
|
18
|
+
super(
|
19
|
+
'camel_case' => Transformers::CamelCase.instance,
|
20
|
+
'pascal_case' => Transformers::PascalCase.instance,
|
21
|
+
'pass_thru' => Transformers::PassThru.instance,
|
22
|
+
'' => Transformers::PassThru.instance
|
23
|
+
)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2020-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
module Hashcraft
|
11
|
+
module Transformers
|
12
|
+
# Transform snake-cased to camel-cased string. Example:
|
13
|
+
# date_of_birth => dateOfBirth
|
14
|
+
# DATE_OF_BIRTH => dateOfBirth
|
15
|
+
class CamelCase
|
16
|
+
include Singleton
|
17
|
+
|
18
|
+
def transform(value, _option)
|
19
|
+
return '' if value.to_s.empty?
|
20
|
+
|
21
|
+
name = value.to_s.split('_').collect(&:capitalize).join
|
22
|
+
|
23
|
+
name[0, 1].downcase + name[1..-1]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2020-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
module Hashcraft
|
11
|
+
module Transformers
|
12
|
+
# Transform snake-cased to pascal-cased string. Example:
|
13
|
+
# date_of_birth => DateOfBirth
|
14
|
+
# DATE_OF_BIRTH => DateOfBirth
|
15
|
+
class PascalCase
|
16
|
+
include Singleton
|
17
|
+
|
18
|
+
def transform(value, _option)
|
19
|
+
return '' if value.to_s.empty?
|
20
|
+
|
21
|
+
value.to_s.split('_').collect(&:capitalize).join
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2020-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
module Hashcraft
|
11
|
+
module Transformers
|
12
|
+
# Default transformer, simply returns the value passed in.
|
13
|
+
class PassThru
|
14
|
+
include Singleton
|
15
|
+
|
16
|
+
def transform(value, _option)
|
17
|
+
value
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2020-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
module Hashcraft
|
11
|
+
VERSION = '1.0.0-alpha.1'
|
12
|
+
end
|
metadata
ADDED
@@ -0,0 +1,179 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hashcraft
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0.pre.alpha.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Matthew Ruggio
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-07-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: guard-rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.7'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pry
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '13'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '13'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.79.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.79.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: simplecov
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.17.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.17.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: simplecov-console
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.6.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.6.0
|
111
|
+
description: " Provides a DSL for implementing classes which can then be consumed
|
112
|
+
to create pre-defined hashes.\n"
|
113
|
+
email:
|
114
|
+
- mruggio@bluemarblepayroll.com
|
115
|
+
executables: []
|
116
|
+
extensions: []
|
117
|
+
extra_rdoc_files: []
|
118
|
+
files:
|
119
|
+
- ".editorconfig"
|
120
|
+
- ".gitignore"
|
121
|
+
- ".rubocop.yml"
|
122
|
+
- ".ruby-version"
|
123
|
+
- ".travis.yml"
|
124
|
+
- CHANGELOG.md
|
125
|
+
- CODE_OF_CONDUCT.md
|
126
|
+
- Gemfile
|
127
|
+
- Guardfile
|
128
|
+
- LICENSE
|
129
|
+
- README.md
|
130
|
+
- Rakefile
|
131
|
+
- bin/console
|
132
|
+
- hashcraft.gemspec
|
133
|
+
- lib/hashcraft.rb
|
134
|
+
- lib/hashcraft/base.rb
|
135
|
+
- lib/hashcraft/compiler.rb
|
136
|
+
- lib/hashcraft/core_ext/hash.rb
|
137
|
+
- lib/hashcraft/dsl.rb
|
138
|
+
- lib/hashcraft/generic.rb
|
139
|
+
- lib/hashcraft/generic/dictionary.rb
|
140
|
+
- lib/hashcraft/generic/registry.rb
|
141
|
+
- lib/hashcraft/mutator_registry.rb
|
142
|
+
- lib/hashcraft/mutators/array.rb
|
143
|
+
- lib/hashcraft/mutators/hash.rb
|
144
|
+
- lib/hashcraft/mutators/property.rb
|
145
|
+
- lib/hashcraft/option.rb
|
146
|
+
- lib/hashcraft/transformer_registry.rb
|
147
|
+
- lib/hashcraft/transformers/camel_case.rb
|
148
|
+
- lib/hashcraft/transformers/pascal_case.rb
|
149
|
+
- lib/hashcraft/transformers/pass_thru.rb
|
150
|
+
- lib/hashcraft/version.rb
|
151
|
+
homepage: https://github.com/bluemarblepayroll/hashcraft
|
152
|
+
licenses:
|
153
|
+
- MIT
|
154
|
+
metadata:
|
155
|
+
bug_tracker_uri: https://github.com/bluemarblepayroll/hashcraft/issues
|
156
|
+
changelog_uri: https://github.com/bluemarblepayroll/hashcraft/blob/master/CHANGELOG.md
|
157
|
+
documentation_uri: https://www.rubydoc.info/gems/hashcraft
|
158
|
+
homepage_uri: https://github.com/bluemarblepayroll/hashcraft
|
159
|
+
source_code_uri: https://github.com/bluemarblepayroll/hashcraft
|
160
|
+
post_install_message:
|
161
|
+
rdoc_options: []
|
162
|
+
require_paths:
|
163
|
+
- lib
|
164
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
165
|
+
requirements:
|
166
|
+
- - ">="
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: '2.5'
|
169
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 1.3.1
|
174
|
+
requirements: []
|
175
|
+
rubygems_version: 3.0.3
|
176
|
+
signing_key:
|
177
|
+
specification_version: 4
|
178
|
+
summary: Hash-based Data Contracting Domain Specific Language
|
179
|
+
test_files: []
|