schemad 1.1.0 → 1.2.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
  SHA1:
3
- metadata.gz: 22dcfa91d419a8bdb46c62d976fe058d56d570ad
4
- data.tar.gz: a7f0d85297f614c3e8c36e979cea5f3b76fb3739
3
+ metadata.gz: a89ab9d861274a3049d986b4eda13df1bb57235c
4
+ data.tar.gz: e42c0dc667171bfe6310cbe7d53f48b5215830ec
5
5
  SHA512:
6
- metadata.gz: 8cfd1025e821061912028591b4fb83fe0927f0ddbf1344c31b346abc5e35ae822f251e12f319ddab64c6b291966f75b91ff9ec7c70b5ee07af457eacf2f040e9
7
- data.tar.gz: 5c0bbfcabf696977922b6aafaac7ac663acda55635191093c4de6b83f844b35664d47252853e367158af73e154c8c72964aae775fc2ad948e03c7270151be8a2
6
+ metadata.gz: b7f01994442b648edf178dd18f059a9f1d95194f7c1cb61697a555620ace6bdcd8a7eb8e944f583f7e56da5d0ec197e25f5911408d24d06eee320879d3305943
7
+ data.tar.gz: a9a164dda791b2f616463af32e02491bfdadac91eb050cab555d45aca38ee1258f4ee03a124b980c27e89724b0720e72ffa0846aadfc8f99bf6565c25802397d
data/README.md CHANGED
@@ -140,14 +140,17 @@ In step the Normalizers. For this example ee'd create two separate normalizers f
140
140
  ```ruby
141
141
  class GitHubNormalizer < Schemad::Normalizer
142
142
  normalize :id, key: :sha
143
- normalize :url, key: :url
144
143
  normalize :committer, key: "committer/name"
145
144
  normalize :created_date, key: "committer/date"
146
145
  normalize :comment, key: :message
146
+
147
+ include_fields :url
147
148
  end
148
149
  ```
149
150
 
150
- We could obviously also include additional data if we wanted. Notice you can use either symbols or strings as keys. If you want to do a deep traversal (more than one level), you will need to use strings with a "/" delimited path.
151
+ We could obviously also include additional data if we wanted. Notice you can use either symbols or strings as keys. If you want to do a deep traversal (more than one level), you will need to use strings with a "/" delimited path.
152
+
153
+ Also notice that if you want fields to be included 'as is', using the same key as the dataset provided, you can use the `include_fields` method. Normalizers _only return_ data that you specify.
151
154
 
152
155
  Now for BitBucket:
153
156
 
@@ -36,4 +36,4 @@ module Schemad
36
36
  ActiveSupport::HashWithIndifferentAccess.new hash
37
37
  end
38
38
  end
39
- end
39
+ end
@@ -48,6 +48,18 @@ module Schemad
48
48
  normalized
49
49
  end
50
50
 
51
+ def reverse(data)
52
+ normalized = {}
53
+
54
+ allowed_attributes.each do |key|
55
+ from_key = normalizers[key]
56
+
57
+ normalized.deep_merge! nested_hash_from_path(key, data[from_key])
58
+ end
59
+
60
+ normalized
61
+ end
62
+
51
63
  def normalizers
52
64
  self.class.instance_variable_get(:@normalizers)
53
65
  end
@@ -57,6 +69,7 @@ module Schemad
57
69
  end
58
70
 
59
71
  private
72
+
60
73
  def path_steps(key)
61
74
  key.to_s.split(DELIMITER)
62
75
  end
@@ -74,6 +87,16 @@ module Schemad
74
87
  end
75
88
  end
76
89
 
90
+ def nested_hash_from_path(path, value)
91
+ build_hash path_steps(path), value, {}
92
+ end
93
+
94
+ def build_hash(steps, value, accum)
95
+ step = steps.shift
96
+ accum[step] = steps.empty? ? value : build_hash(steps, value, {})
97
+ accum
98
+ end
99
+
77
100
  def search_data(steps, data)
78
101
  step = steps.shift
79
102
  return data unless step
@@ -1,3 +1,3 @@
1
1
  module Schemad
2
- VERSION = "1.1.0"
2
+ VERSION = "1.2.0"
3
3
  end
@@ -34,6 +34,21 @@ describe Schemad::Normalizer do
34
34
  end
35
35
  end
36
36
 
37
+ context "reverse normalization" do
38
+ Given(:normalized) { normalizer.normalize(data) }
39
+ Given(:expected) { { "Middle Earth" => "COORDINATES", "roads" => 50 } }
40
+
41
+ context "for given keys" do
42
+ When(:reversed) { normalizer.reverse(normalized) }
43
+ Then { reversed.should == expected }
44
+ end
45
+
46
+ context "ignores extra keys" do
47
+ When(:reversed) { normalizer.reverse(normalized.merge({ billy: "joel" })) }
48
+ Then { reversed.should == expected }
49
+ end
50
+ end
51
+
37
52
  context "additional fields" do
38
53
  Given { normalizer.class.include_fields :beasts, :cool }
39
54
  When(:normalized) { normalizer.normalize(data) }
@@ -106,5 +121,12 @@ describe Schemad::Normalizer do
106
121
  Then { results[:display_name].should == "Joseph Walton" }
107
122
  end
108
123
 
124
+ context "can reverse into nested key" do
125
+ Given(:normalizer) { BucketNormalizer.new }
126
+ Given(:normalized) { normalizer.normalize(data) }
127
+ When(:reversed) { normalizer.reverse(normalized) }
128
+ Then { reversed['author']['user']['username'].should == "jwalton" }
129
+ And { reversed['author']['user']['links']['avatar']['href'] == "funk_blue.png" }
130
+ end
109
131
  end
110
132
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: schemad
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luke van der Hoeven
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-21 00:00:00.000000000 Z
11
+ date: 2015-01-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport