json_hash 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +22 -0
  3. data/README.md +47 -0
  4. data/lib/json_hash.rb +70 -0
  5. metadata +67 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4e6eb3ab0716e36abec34ef40bc1af6752373773
4
+ data.tar.gz: 06d8d190c23d6c32034c2353e4ef2b283247e4e1
5
+ SHA512:
6
+ metadata.gz: ec5cd1df497e0d1049f6c7035716c97c5fe3db7325e414669902e856ed4e0cb126b5ca4289ed2678d14ffd03a1101d1f539d91dfeda78f34a059507ea25dae3b
7
+ data.tar.gz: 9fe316a8c9918fb26c7c5b4239ba5138870b2577e525804c4e5bc8df19d5098e2fc0e4a8432e71d48e68b21890f279aa15d2bfd4294e25a8f37aa4074e1ff941
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Nathan Brazil
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
data/README.md ADDED
@@ -0,0 +1,47 @@
1
+ # json_hash
2
+
3
+ This is a simple gem that provides method-like syntatic sugar on top of a JSON object via the JSONHash class.
4
+
5
+ ## Installation
6
+
7
+ If you are using Bundler, simply add the following line to your Gemfile:
8
+
9
+ gem "json_hash"
10
+
11
+ Otherwise, just type:
12
+
13
+ gem install json_hash
14
+
15
+ ## Usage
16
+
17
+ The canonical usage is to obtain some JSON text from a remote endpoint, and parse it. For example:
18
+
19
+ ```ruby
20
+ require "json_hash"
21
+ => true
22
+ user = JSONHash.parse("http://example.org/users/1.json")
23
+ => #<JSONHash:0x007fe0d320fd30 @json={"id"=>1, ...}
24
+ user.id
25
+ => 1
26
+ users = JSONHash.parse("http://cumulus.local/identity-manager/users.json")
27
+ => [#<JSONHash:0x007fe0d322c368 @json={"id"=>1, ...}, ...]
28
+ users.count
29
+ => 4
30
+ users[1].id
31
+ => 2
32
+ ```
33
+
34
+ ## Requirements
35
+
36
+ The json_hash gem relies on the following:
37
+
38
+ * The json gem
39
+ * The open-uri module
40
+ * The uri module
41
+
42
+ ## Credits
43
+
44
+ This was inspired by a similar class I wrote in Python to parse Jenkin's RESTful API output, which made use of the
45
+ setattr() method. I wanted to see if I can do something similar in Ruby.
46
+
47
+ Alas, since Ruby doesn't have something like setattr(), I've had to rely on method_missing() instead.
data/lib/json_hash.rb ADDED
@@ -0,0 +1,70 @@
1
+ require "json"
2
+ require "open-uri"
3
+ require "uri"
4
+
5
+ ##
6
+ # Provides syntactic sugar to a JSON structure.
7
+ # Given a Ruby hash h, instead of using h[key] to obtain its value, you can use the
8
+ # syntax of h.key, as if you are invoking a method.
9
+
10
+ class JSONHash
11
+
12
+ ##
13
+ # Initializer. The json parameter is a Ruby hash. Usually you would call JSON.parse to get such a hash.
14
+ # @param json [Hash] A Ruby hash, usually obtained by calling JSON.parse or HTTP GET on a .json endpoint.
15
+
16
+ def initialize(json)
17
+ @json = json
18
+ @json.each do |key,value|
19
+ if value.class == Hash
20
+ @json[key] = JSONHash.new(value)
21
+ elsif value.class == Array
22
+ values = value.collect { |v| v.class == Hash ? JSONHash.new(v) : v }
23
+ @json[key] = values
24
+ end
25
+ end
26
+ end
27
+
28
+ ##
29
+ # Whatever .method is invoked, it will convert that to a string and use it as the key to look it up in the hash.
30
+ # @param method [String, Symbol] The name of method to invoke.
31
+ # @param args The arguments supplied to the method.
32
+
33
+ def method_missing(method, *args)
34
+ @json[method.to_s] || super
35
+ end
36
+
37
+ ##
38
+ # Returns the underling JSON parsed hash structure.
39
+ # @return [JSON] Underlying JSON object.
40
+
41
+ def to_json
42
+ @json
43
+ end
44
+
45
+ ##
46
+ # Return a string representation of the JSON parsed hash structure.
47
+ # @return [String] String representation of the underlying JSON object.
48
+
49
+ def to_s
50
+ @json.to_s
51
+ end
52
+
53
+ ##
54
+ # Build an array of JSONHash objects if the argument is an array of Hash instances. If the argument is an URI,
55
+ # then parse the URI contents with JSON.parse, and then build it. If the argument is a string, then parse it
56
+ # using JSON.parse first, then try to parse it again. Otherwise, assume it's a single Hash object and build
57
+ # just a single JSONHash object.
58
+ # @param from [Array, Hash, String, URI] Object to build from.
59
+ # @return [Array, JSONHash] Either an array of JSONHash objects or a single JSONHash object.
60
+
61
+ def self.parse(from)
62
+ return JSONHash.new(from) if from.class == Hash
63
+ return from.collect { |item| parse(item) } if from.class == Array
64
+ return parse(JSON.parse(open(from) { |fp| fp.read })) if from.is_a? URI::Generic
65
+ # Assume from is String from here on
66
+ return parse(URI.parse(from)) if /^http[s]?:\/\/.+/ =~ from
67
+ return parse(JSON.parse(from))
68
+ end
69
+
70
+ end
metadata ADDED
@@ -0,0 +1,67 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: json_hash
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Nathan Brazil
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.8'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.8.2
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.8'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.8.2
33
+ description: A simple gem that adds method-like syntactic sugar to a JSON hash.
34
+ email: nb@bitaxis.com
35
+ executables: []
36
+ extensions: []
37
+ extra_rdoc_files: []
38
+ files:
39
+ - LICENSE
40
+ - README.md
41
+ - lib/json_hash.rb
42
+ homepage: https://github.com/bitaxis/json_hash.git
43
+ licenses:
44
+ - MIT
45
+ metadata: {}
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ requirements: []
61
+ rubyforge_project:
62
+ rubygems_version: 2.4.5
63
+ signing_key:
64
+ specification_version: 4
65
+ summary: Hola!
66
+ test_files: []
67
+ has_rdoc: