hash19 0.0.7 → 0.0.8

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: 4724f0d19cf83a8c0f6b220195ea126152b4f09e
4
- data.tar.gz: a85c570dc019daf1f0cfb487cd62e5ab72569a5a
3
+ metadata.gz: 04b9042abb5650e9ee4e247e0c3539b6c5acf2f2
4
+ data.tar.gz: dbf0b31e2185441e35994eb2635dc3283e301edb
5
5
  SHA512:
6
- metadata.gz: cb8d181a696c67a437691df48030c4c203487d396c3be66ae119ea960191f8d29d6e68cc5135a67d4943e3f836ca181f625e7678dc716e37e9c500bf2b61f022
7
- data.tar.gz: 80bcb0601b44bfcfefa314f4eeac3577620123828d29187c344795ca67678e94e8bd1543b36626b3d0464662d08eebdcfd826cce466164314a6ca69b646bf992
6
+ metadata.gz: 1baa6df02fbd4ad2e90ae39ebc36cfdf9db31f4302a0664864275b24d975c46bd9056ed9137d91fed65430a5a4e9148733dbf2e9e1aa8326653fd76e1523a2ba
7
+ data.tar.gz: 902ca441b549ff9a037fd80dbf755acbf0e8309d3d198632f086d2e6cf32732244c99bdb59d098e4f65d8a31427da8505de38420ddcda9927d3a4b2e39b6292b
data/.gitignore CHANGED
File without changes
data/.ruby-gemset CHANGED
File without changes
data/.ruby-version CHANGED
File without changes
data/.travis.yml CHANGED
@@ -2,4 +2,4 @@ language: ruby
2
2
  rvm:
3
3
  - ruby-2.1.1
4
4
  - ruby-2.1.2
5
- - ruby-2.1.3
5
+ - ruby-2.1.3
data/Gemfile CHANGED
File without changes
data/LICENSE.txt CHANGED
File without changes
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Hash19
2
2
  [![Build Status](https://travis-ci.org/rcdexta/hash19.svg)](https://travis-ci.org/rcdexta/hash19)
3
+ [![Gem Version](https://badge.fury.io/rb/hash19.svg)](http://badge.fury.io/rb/hash19)
4
+ [![Coverage Status](https://img.shields.io/coveralls/rcdexta/hash19.svg)](https://coveralls.io/r/rcdexta/hash19)
3
5
 
4
6
  ![Hash-19](https://s3-us-west-1.amazonaws.com/rcdexta/hash-19-droid.png)
5
7
 
@@ -7,6 +9,8 @@
7
9
 
8
10
  Ahem.. Ahem.. So about this gem itself.. When I was writing an aggregation API that had to talk to multiple services each with their own REST end-points and JSON schema, when mashing up multiple hashes and transforming it to a structure acceptable to the consumer, I ended up writing lot of boiler plate code. I could see patterns and there was clearly scope for optimisation.
9
11
 
12
+ A [detailed writeup](https://medium.com/@rcdexta/hash19-a-json-aggregation-library-f2ef43d64a86) explaining the need is available for reading.
13
+
10
14
  Hash19 is an attempt at offering a DSL to tame the JSON manipulation and help in dealing with common use-cases. The features include
11
15
 
12
16
  * whitelisting attributes
@@ -150,9 +154,17 @@ end
150
154
  ```
151
155
  If you notice the trigger, the `using` parameter denotes the attribute to use to fetch the association and the lambda passed to `trigger` will be invoked to fetch the association. This is lazy loaded, in the sense when a call is made to `.doctor` or `.to_h`, the trigger is fired.
152
156
 
157
+ Associations also support alternate keys and aliasing... The below code snippet illustrates use of a different key in source json, the class to use to construct the object and the alias key in the target.
158
+
159
+ ```ruby
160
+ has_one :child, key: :offspring, alias: :junior
161
+ {offspring: {name: 'Luke Skywalker'}} # will be parsed as {'junior' => {'name' => 'Luke Skywalker'}}
162
+ ```
163
+
164
+
153
165
  ###4. Bulk Injections
154
166
 
155
- Left to itself with associations, when the root JSON is a large collection with none of the associations populated in the first place, there will several triggers fired for each item in the collection. This is the HTTP equivalent of `N+1` in the ORM world. To avoid this, Hash19 supports association injections. Let's dive into an example:
167
+ Left to itself with associations, when the root JSON is a large collection with none of the associations populated in the first place, there will be several triggers fired for each item in the collection. This is the HTTP equivalent of `N+1` in the ORM world. To avoid this, Hash19 supports association injections. Let's dive into an example:
156
168
 
157
169
  ```ruby
158
170
  class SuperHeroes < Hashable
@@ -170,13 +182,13 @@ class SuperHeroes < Hashable
170
182
  def find_all(ids)..end #calls bulk API across wire. Implementation hidden
171
183
  end
172
184
  ```
173
- If you notice, `SuperHeroes` is a wrapper class around `SuperHero`. This is the object equivalent of a JSON collection. The `inject` method will extract `weapon_id` from all items in the collection and call the `trigger` and put back the resultant entities joining `superhero.weapon_id` and `weapon.id`
185
+ If you notice, `SuperHeroes` is a wrapper class around `SuperHero`. This is the object equivalent of a JSON collection. The `inject` method will extract `weapon_id` from all items in the collection based on the json-path specified by `at` and call the `trigger` and put back the resultant entities joining `superhero.weapon_id` and `weapon.id`
174
186
 
175
187
  So, a json like below
176
- ```json
177
- super_heroes = SuperHeroes.new([{name: 'iron man', power: 'none', weapon_id: 1},
178
- {name: 'thor', power: 'class 100', weapon_id: 2},
179
- {name: 'hulk', power: 'bulk', weapon_id: 3}])
188
+ ```ruby
189
+ super_heros = SuperHeroes.new([{name: 'iron man', power: 'none', weapon_id: 1},
190
+ {name: 'thor', power: 'class 100', weapon_id: 2},
191
+ {name: 'hulk', power: 'bulk', weapon_id: 3}])
180
192
  ```
181
193
 
182
194
  will lead to one call to `Weapon#find_all` with params `[1,2,3]` to fetch all weapon details. And the final collection will be of the form:
@@ -186,7 +198,7 @@ super_heroes.to_h #[{'name' => 'iron man', 'power' => 'none', 'weapon' => {'name
186
198
  #{'name' => 'hulk', 'power' => 'bulk', 'weapon' => {'name' => 'hands', 'id' => 3}}
187
199
  ```
188
200
 
189
- Note that `injection` always overrides the association trigger sinces the former is eager loaded and latter is lazy loaded thus avoiding the `N+1` calls.
201
+ Note that `injection` always overrides the association trigger since the former is eager loaded and latter is lazy loaded thus avoiding the `N+1` calls.
190
202
 
191
203
  One other important thing to remember is that all the injections will happen in parallel. Hash19 uses [eldritch](https://github.com/beraboris/eldritch) gem to trigger multiple injections concurrently.
192
204
 
data/Rakefile CHANGED
File without changes
data/hash19.gemspec CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency 'rspec'
24
24
  spec.add_development_dependency 'pry'
25
25
  spec.add_development_dependency 'rake'
26
+ spec.add_development_dependency 'coveralls'
26
27
 
27
28
  spec.add_runtime_dependency 'jsonpath', '~> 0.5.6'
28
29
  spec.add_runtime_dependency 'eldritch'
data/lib/hash19/core.rb CHANGED
@@ -14,7 +14,7 @@ module Hash19
14
14
  if payload.is_a? Array
15
15
  @hash19 = payload.map do |el|
16
16
  klass = resolve_class(self.class.contains_klass.to_s.camelize.singularize)
17
- klass.send(:new, el).to_h(lazy: true)
17
+ klass.send(:new, el).to_h(true)
18
18
  end
19
19
  else
20
20
  hash = payload.with_indifferent_access
@@ -39,7 +39,7 @@ module Hash19
39
39
  end
40
40
  end
41
41
 
42
- def to_h(lazy:false)
42
+ def to_h(lazy=false)
43
43
  return @hash19 if lazy
44
44
  if @hash19.is_a? Array
45
45
  @hash19.map { |hash| traverse_hash(hash) }
File without changes
File without changes
@@ -16,13 +16,13 @@ module Hash19
16
16
  if association.present?
17
17
  klass = resolve_class(class_name.singularize)
18
18
  @hash19[opts[:alias] || name] = if type == :one
19
- klass.send(:new, association).to_h(lazy: true)
19
+ klass.send(:new, association).to_h(true)
20
20
  elsif type == :many
21
- association.map { |hash| klass.send(:new, hash).to_h(lazy: true) }
21
+ association.map { |hash| klass.send(:new, hash).to_h(true) }
22
22
  end
23
23
  else
24
24
  unless opts[:trigger]
25
- puts "warning: Association:<#{name}> is not present in #{self.class.name}. Possible specify a trigger"
25
+ # puts "warning: Association:<#{name}> is not present in #{self.class.name}. Probably a trigger is missing!"
26
26
  next
27
27
  end
28
28
  puts "warning: Key:<#{opts[:using]}> not present in #{self.class.name}. Cannot map association:<#{name}>" unless @hash19.has_key? opts[:using]
@@ -1,3 +1,3 @@
1
1
  module Hash19
2
- VERSION = '0.0.7'
2
+ VERSION = '0.0.8'
3
3
  end
data/lib/hash19.rb CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  require 'active_support/all'
2
2
  require 'pry'
3
3
  require 'hash19'
4
+ require 'coveralls'
4
5
 
6
+ Coveralls.wear!
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hash19
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - RC
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-20 00:00:00.000000000 Z
11
+ date: 2015-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: coveralls
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'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: jsonpath
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -158,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
172
  version: '0'
159
173
  requirements: []
160
174
  rubyforge_project:
161
- rubygems_version: 2.2.2
175
+ rubygems_version: 2.4.5
162
176
  signing_key:
163
177
  specification_version: 4
164
178
  summary: Hash helpers to map complex JSON to ruby objects. Handles associations and