yahm 0.0.1 → 0.0.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 +4 -4
- data/.rspec +2 -0
- data/Rakefile +5 -0
- data/lib/yahm.rb +3 -2
- data/lib/yahm/hash_mapper.rb +19 -0
- data/lib/yahm/mapping.rb +54 -0
- data/lib/yahm/version.rb +2 -2
- data/spec/spec_helper.rb +15 -0
- data/spec/yahm/hash_mapper_spec.rb +48 -0
- data/spec/yahm/mapping_spec.rb +52 -0
- data/spec/yahm_spec.rb +8 -0
- metadata +13 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0522d4946a438ae61d4e9fdc77d59b6b249363b8
|
4
|
+
data.tar.gz: 19fc48e5d52f76931497cab5a2e319e20e907039
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 085c44754437976e7109044724eb5f71006c130e82d0643296b88446f6377f84ffa248a31a00edf575072c8bbf91b62c72fe98e9f4c9e3a7353f54aad2771b79
|
7
|
+
data.tar.gz: 047fd6fc33b4d5f65258ee0467b52d9696b7de83130072784bcb062ace83611bd9c2401aaf73141373607987be6a7da72d035af7e059b9510b847483ba89d911
|
data/.rspec
ADDED
data/Rakefile
CHANGED
data/lib/yahm.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
module Yahm::HashMapper
|
2
|
+
def define_mapper(mapper_method_name, options = {}, &block)
|
3
|
+
mapping = Yahm::Mapping.new
|
4
|
+
|
5
|
+
# evaluate the given block in mappings context
|
6
|
+
mapping = mapping.instance_eval(&block) || mapping
|
7
|
+
|
8
|
+
define_method mapper_method_name do |hash|
|
9
|
+
translated_hash = mapping.translate_hash(hash)
|
10
|
+
unless (setter_name = options[:call_setter]).nil?
|
11
|
+
self.send(setter_name, translated_hash)
|
12
|
+
end
|
13
|
+
|
14
|
+
translated_hash
|
15
|
+
end
|
16
|
+
|
17
|
+
self
|
18
|
+
end
|
19
|
+
end
|
data/lib/yahm/mapping.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
class Yahm::Mapping
|
2
|
+
def initialize
|
3
|
+
@rules = []
|
4
|
+
@translated_hash = nil
|
5
|
+
end
|
6
|
+
|
7
|
+
def map(str, options = {})
|
8
|
+
@rules.push [str, options]
|
9
|
+
self
|
10
|
+
end
|
11
|
+
|
12
|
+
def translate_hash(input_hash)
|
13
|
+
@break = true if @rules.length == 5
|
14
|
+
@translated_hash = {}
|
15
|
+
|
16
|
+
@rules.each do |rule|
|
17
|
+
process_rule(input_hash, rule)
|
18
|
+
end
|
19
|
+
|
20
|
+
@translated_hash
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def process_rule(input_hash, rule)
|
26
|
+
sanitized_source_path = rule.first
|
27
|
+
.sub(/^\//, "")
|
28
|
+
.gsub(/\[(\d+)\]/, "/\\1")
|
29
|
+
.split("/")
|
30
|
+
.map do |element|
|
31
|
+
if element[/\A\d+\Z/]
|
32
|
+
element.to_i
|
33
|
+
else
|
34
|
+
element.to_sym
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
sanitized_target_path = rule.last[:to].sub(/^\//, "").split("/").map(&:to_sym)
|
39
|
+
target_parent_path = sanitized_target_path.slice(0, sanitized_target_path.length - 1)
|
40
|
+
|
41
|
+
source_value = sanitized_source_path.inject(input_hash) { |hash, key| hash[key] }
|
42
|
+
|
43
|
+
unless (processed_by_method_name = rule.last[:processed_by]).nil?
|
44
|
+
source_value = if source_value.is_a?(Array)
|
45
|
+
source_value.map(&processed_by_method_name)
|
46
|
+
else
|
47
|
+
source_value.send(processed_by_method_name)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
target_hash_parent_element = target_parent_path.inject(@translated_hash) { |hash, key| hash[key.to_sym] ||= {} }
|
52
|
+
target_hash_parent_element.merge!({ sanitized_target_path.last => source_value })
|
53
|
+
end
|
54
|
+
end
|
data/lib/yahm/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
VERSION = "0.0.
|
1
|
+
class Yahm
|
2
|
+
VERSION = "0.0.2"
|
3
3
|
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require "yahm"
|
2
|
+
require "pry"
|
3
|
+
|
4
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
5
|
+
RSpec.configure do |config|
|
6
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
7
|
+
config.run_all_when_everything_filtered = true
|
8
|
+
config.filter_run :focus
|
9
|
+
|
10
|
+
# Run specs in random order to surface order dependencies. If you find an
|
11
|
+
# order dependency and want to debug it, you can fix the order by providing
|
12
|
+
# the seed, which is printed after each run.
|
13
|
+
# --seed 1234
|
14
|
+
config.order = "random"
|
15
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require_relative "../spec_helper"
|
2
|
+
|
3
|
+
describe Yahm::HashMapper do
|
4
|
+
context "when extending a class" do
|
5
|
+
let(:class_extended_with_hash_mapper) do
|
6
|
+
class MyClass
|
7
|
+
extend Yahm::HashMapper
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
it "adds a class method called #define_mapper" do
|
12
|
+
expect(class_extended_with_hash_mapper.methods).to include(:define_mapper)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#define_mapper" do
|
17
|
+
let(:class_extended_with_hash_mapper) do
|
18
|
+
class ClassExtendedWithHashMapper
|
19
|
+
extend Yahm::HashMapper
|
20
|
+
|
21
|
+
define_mapper :my_mapper do
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "adds a named mapper method to the instances of the extended class" do
|
27
|
+
expect(class_extended_with_hash_mapper.new).to respond_to(:my_mapper)
|
28
|
+
end
|
29
|
+
|
30
|
+
context "when called with an option called 'call_setter'" do
|
31
|
+
let(:class_extended_with_hash_mapper) do
|
32
|
+
class ClassExtendedWithHashMapper
|
33
|
+
extend Yahm::HashMapper
|
34
|
+
|
35
|
+
attr_accessor :my_result
|
36
|
+
|
37
|
+
define_mapper :my_mapper, call_setter: :my_result= do
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
it "calls a method with the given name with the result of the mapping" do
|
43
|
+
(instance = class_extended_with_hash_mapper.new).my_mapper({})
|
44
|
+
expect(instance.my_result).not_to be_nil
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require_relative "../spec_helper"
|
2
|
+
|
3
|
+
describe Yahm::Mapping do
|
4
|
+
it "is a class used internally by Yahm::HashMapper#define_mapper" do
|
5
|
+
end
|
6
|
+
|
7
|
+
describe ".map" do
|
8
|
+
let(:mapping) { Yahm::Mapping.new }
|
9
|
+
|
10
|
+
it "adds a mapping rule to a mapping" do
|
11
|
+
mapping.map("/foo", to: "bar")
|
12
|
+
expect(mapping.instance_variable_get :@rules).not_to be_nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe ".translate_hash" do
|
17
|
+
let(:mapping) do
|
18
|
+
_mapping = Yahm::Mapping.new
|
19
|
+
_mapping.map "/record_id", to: "/id"
|
20
|
+
_mapping.map "/record/title", to: "/tile"
|
21
|
+
_mapping.map "/record/isbns", to: "/my_data/isbns"
|
22
|
+
_mapping.map "/record/isbns[1]", to: "/main_isbn" # when an array, one can specifiy which element to choose
|
23
|
+
_mapping.map "/record/count", to: "/count", :processed_by => :to_i # processed_by specifies a method which post_processes to value
|
24
|
+
_mapping
|
25
|
+
end
|
26
|
+
|
27
|
+
let(:input_hash) do
|
28
|
+
{
|
29
|
+
record_id: "some_id123",
|
30
|
+
record: {
|
31
|
+
title: "some title",
|
32
|
+
isbns: [
|
33
|
+
"3-86680-192-0",
|
34
|
+
"3-680-08783-7"
|
35
|
+
],
|
36
|
+
count: "3"
|
37
|
+
}
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
it "translates a given hash according to @rules" do
|
42
|
+
expect(mapping.translate_hash(input_hash)).to eq({
|
43
|
+
:id=>"some_id123",
|
44
|
+
:tile=>"some title",
|
45
|
+
:my_data=>{:isbns=>["3-86680-192-0", "3-680-08783-7"]},
|
46
|
+
:main_isbn=>"3-680-08783-7",
|
47
|
+
:count=>3
|
48
|
+
})
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
data/spec/yahm_spec.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yahm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Sievers
|
@@ -116,12 +116,19 @@ extensions: []
|
|
116
116
|
extra_rdoc_files: []
|
117
117
|
files:
|
118
118
|
- ".gitignore"
|
119
|
+
- ".rspec"
|
119
120
|
- Gemfile
|
120
121
|
- LICENSE.txt
|
121
122
|
- README.md
|
122
123
|
- Rakefile
|
123
124
|
- lib/yahm.rb
|
125
|
+
- lib/yahm/hash_mapper.rb
|
126
|
+
- lib/yahm/mapping.rb
|
124
127
|
- lib/yahm/version.rb
|
128
|
+
- spec/spec_helper.rb
|
129
|
+
- spec/yahm/hash_mapper_spec.rb
|
130
|
+
- spec/yahm/mapping_spec.rb
|
131
|
+
- spec/yahm_spec.rb
|
125
132
|
- yahm.gemspec
|
126
133
|
homepage: https://github.com/ubpb/yahm
|
127
134
|
licenses:
|
@@ -147,4 +154,8 @@ rubygems_version: 2.2.0
|
|
147
154
|
signing_key:
|
148
155
|
specification_version: 4
|
149
156
|
summary: Yet another ruby hash mapper
|
150
|
-
test_files:
|
157
|
+
test_files:
|
158
|
+
- spec/spec_helper.rb
|
159
|
+
- spec/yahm/hash_mapper_spec.rb
|
160
|
+
- spec/yahm/mapping_spec.rb
|
161
|
+
- spec/yahm_spec.rb
|