pathy 0.0.3 → 0.0.4

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.
@@ -1,37 +1,50 @@
1
1
  require 'json'
2
2
 
3
3
  module Pathy
4
+
4
5
  InvalidPathError = Class.new(NoMethodError)
5
6
 
6
7
  module InstanceMethods
8
+
9
+ # returns the value parsed from JSON at a given path.
10
+ # Example:
11
+ # {:some_key => {:nested_key => 'awesome'}}.at_json_path('some_key.nested_key')
12
+ # returns 'awesome'
7
13
  def at_json_path path
8
14
  method_chain = path.split('.')
9
- method_chain.inject(self.reparsed_as_json) do |obj,m|
10
- key = (obj.respond_to?(:push) ? m.to_i : m)
11
- new_object = obj.send('[]', key)
12
-
13
- raise InvalidPathError, "Could not resolve #{path} at #{key}" if obj[key].nil?
14
- new_object
15
- end
16
- rescue
17
- raise InvalidPathError, "Could not resolve #{path}"
15
+ method_chain.inject(self.reparsed_as_json) do |obj,method|
16
+
17
+ is_array_like = obj.respond_to?(:push)
18
+ key_or_index = is_array_like ? method.to_i : method
19
+ has_key_or_index = is_array_like ? !obj.slice(key_or_index).nil? : obj.keys.include?(key_or_index)
20
+
21
+ raise InvalidPathError, "Could not resolve #{path} at #{key_or_index}" unless has_key_or_index
22
+
23
+ obj.send('[]', key_or_index)
24
+ end
18
25
  end
19
26
 
27
+ # returns true if the path is found. Provides usage in Rspec
28
+ # Example in rspec:
29
+ # {:some_key => {:nested_key => 'awesome'}}.should have_json_path('some_key.nested_key')
20
30
  def has_json_path? path
21
31
  begin
22
- value = self.at_json_path(path)
23
- return true if value == false
24
- return true
32
+ at_json_path(path)
33
+ true
25
34
  rescue InvalidPathError
26
35
  false
27
36
  end
28
37
  end
29
38
 
39
+ # returns the parsed JSON representation of an instance.
40
+ # If the current instance is a string we assume it's JSON
30
41
  def reparsed_as_json
31
42
  self.is_a?(String) ? JSON.parse(self) : JSON.parse(self.to_json)
32
43
  end
33
44
  end
34
45
  module ClassMethods
46
+
47
+ # adds pathy methods to a Class
35
48
  def pathy!
36
49
  self.send :include, InstanceMethods
37
50
  end
@@ -1,3 +1,3 @@
1
1
  module Pathy
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -1,9 +1,33 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Pathy do
4
- before :all do
5
4
 
6
- Object.pathy!
5
+ describe "pathy scope" do
6
+
7
+ describe "Object.new" do
8
+ it "should not respond to :has_json_path?" do
9
+ Object.new.should_not respond_to(:has_json_path?)
10
+ end
11
+ end
12
+
13
+ describe "SampleClass" do
14
+ before :all do
15
+ SampleClass.pathy!
16
+ end
17
+
18
+ it "should not respond to :has_json_path?" do
19
+ Object.new.should_not respond_to(:has_json_path?)
20
+ end
21
+
22
+ it "should respond to :has_json_path?" do
23
+ SampleClass.new.should respond_to(:has_json_path?)
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+
30
+ before :all do
7
31
 
8
32
  @json = %[
9
33
  {
@@ -11,7 +35,8 @@ describe Pathy do
11
35
  "number" : 1,
12
36
  "array" : [1,2,3],
13
37
  "hash" : {"one":{"two" : 2}},
14
- "bool" : false
38
+ "bool" : false,
39
+ "nullval" : null
15
40
  }
16
41
  ]
17
42
 
@@ -29,6 +54,8 @@ describe Pathy do
29
54
 
30
55
  describe "for hashes" do
31
56
  before :all do
57
+ Object.pathy!
58
+
32
59
  @obj = JSON.parse(@json)
33
60
  @array = JSON.parse(@json_array)
34
61
  end
@@ -64,6 +91,10 @@ describe Pathy do
64
91
  it "should have 'bool'" do
65
92
  @obj.should have_json_path 'bool'
66
93
  end
94
+
95
+ it "should have 'nullval'" do
96
+ @obj.should have_json_path 'nullval'
97
+ end
67
98
 
68
99
  it "should be false for invalid paths" do
69
100
  @obj.has_json_path?('hash.one.does_not_exist').should be_false
@@ -2,3 +2,7 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
3
  require 'pathy'
4
4
  require 'json'
5
+
6
+ class SampleClass
7
+
8
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pathy
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 3
10
- version: 0.0.3
9
+ - 4
10
+ version: 0.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Christopher Burnett