shaman 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6129447825ba95c5b5a182269fb5ccf10fbd533f
4
- data.tar.gz: 2caed2e406353fc44d3d5d7b48879e94d71f61aa
3
+ metadata.gz: 7cd52348febf120902db58d4f50ea4e66c5211e8
4
+ data.tar.gz: 11b1a43720cc211d9b60d586e598d6469e7932c7
5
5
  SHA512:
6
- metadata.gz: e4033a914b6bbcfbfceea5514ba6b10a1fbe7eb82fb41dffd2753010f3640e300e8051692c3466e67d3180aa95f093b61b375bdc2bcb5ce07f2a2fc34d73e2ac
7
- data.tar.gz: 9514099d6e5a21516452226be3dae9462ea42aa11355df5a0b0a4ae2a00c69032b30b7777a34b8caf854ff421dd59ca4fe009ba3c612078b3a650bfab579bf30
6
+ metadata.gz: b45bb6d541bb36ecffa7ddaaeb65803933dd7920cf015dc219929af1b1d39d273ea9c555b273ed47b4af514dc2e80be0246a8d44158c72791c8ff557897964f5
7
+ data.tar.gz: 5ec1995754fcb71c413e5b556624d84474a87708bc2cc688b0f74985facacbdda6927913ab8d2ce9d55912cc49f158124b80612a8c109a78c8b580045e9b7696
data/lib/shaman.rb CHANGED
@@ -1,5 +1,7 @@
1
- require "shaman/version"
1
+ require 'shaman/version'
2
+ require 'digest'
2
3
  require 'oj'
4
+ require 'active_support/core_ext/hash/conversions'
3
5
 
4
6
  class Shaman
5
7
  attr_reader :body
@@ -12,24 +14,38 @@ class Shaman
12
14
  Digest::MD5.hexdigest(prepped_body.to_s)
13
15
  end
14
16
 
15
- def valid_json_body?
16
- parsed_body.class == Hash
17
+ def valid_json?
18
+ parsed_json.class == Hash
17
19
  end
20
+ alias valid_json_body? valid_json?
18
21
 
19
- private
20
-
21
- def prepped_body
22
- if valid_json_body?
23
- Hash[parsed_body.sort]
24
- else
25
- parsed_body
26
- end
22
+ def valid_xml?
23
+ parsed_xml.class == Hash
27
24
  end
28
25
 
29
- def parsed_body
30
- @parsed_body ||= Oj.load(body)
26
+ def parsed_json
27
+ @parsed_json ||= Oj.load(body)
31
28
  rescue Oj::ParseError
32
29
  body
33
30
  end
34
31
 
32
+ def parsed_xml
33
+ @parsed_xml ||= Hash.from_xml(body)
34
+ rescue REXML::ParseException
35
+ body
36
+ end
37
+
38
+ def prepped_body
39
+ sort_body = parsed_json or parsed_xml or body
40
+ sorted_hash(sort_body)
41
+ end
42
+
43
+ def sorted_hash(obj)
44
+ return obj unless obj.is_a?(Hash)
45
+ hash = Hash.new
46
+ obj.each { |k, v| hash[k] = sorted_hash(v) }
47
+ sorted = hash.sort { |a, b| a[0].to_s <=> b[0].to_s }
48
+ Hash[sorted]
49
+ end
50
+
35
51
  end
@@ -1,3 +1,3 @@
1
1
  class Shaman
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
data/shaman.gemspec CHANGED
@@ -19,8 +19,10 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency "oj"
22
+ spec.add_dependency "activesupport"
22
23
 
23
24
  spec.add_development_dependency "bundler", "~> 1.6"
24
25
  spec.add_development_dependency "rake"
25
26
  spec.add_development_dependency "rspec"
27
+ spec.add_development_dependency "pry"
26
28
  end
@@ -1,42 +1,77 @@
1
+ require 'oj'
1
2
  require 'shaman'
2
3
 
3
4
  describe Shaman do
4
5
 
5
- describe "#valid_json_body?" do
6
- subject { described_class.new(body) }
7
- context "when #body can be parsed to a Hash" do
8
- let(:body) { %q[{"foo":"bar"}] }
9
- it "returns true" do
10
- expect(subject.valid_json_body?).to be true
11
- end
6
+ subject do
7
+ described_class.new(body)
8
+ end
9
+
10
+ context "when #body can be parsed to a Hash" do
11
+ let(:body) { %q[{"foo":"bar"}] }
12
+ it "returns true" do
13
+ expect(subject.valid_json_body?).to be true
12
14
  end
13
- context "when #body can't be parsed to a Hash" do
14
- let(:body) { %q["{foo"] }
15
- it "returns false" do
16
- expect(subject.valid_json_body?).to be false
17
- end
15
+ end
16
+
17
+ context "when #body can't be parsed to a Hash" do
18
+ let(:body) { %q["{foo"] }
19
+ it "returns false" do
20
+ expect(subject.valid_json?).to be false
21
+ end
22
+ end
23
+
24
+ context "when #body cannot be parsed" do
25
+ let(:body) { %q[{foo] }
26
+ it "returns false" do
27
+ expect(subject.valid_json?).to be false
28
+ end
29
+ end
30
+
31
+ describe "#sha" do
32
+
33
+ subject do
34
+ described_class.new(body).sha
18
35
  end
19
- context "when #body cannot be parsed" do
20
- let(:body) { %q[{foo] }
21
- it "returns false" do
22
- expect(subject.valid_json_body?).to be false
36
+
37
+ context "when request is valid JSON" do
38
+ let(:body) { %q[{"foo":"bar"}] }
39
+ it "creates a sha of the parsed JSON" do
40
+ expect(subject).to eq('f59494512dabbab0cd0a421c43834271')
23
41
  end
24
42
  end
43
+ context "when request is not valid JSON"
44
+ let(:body) { %q[{foo] }
45
+ it "creates a sha of the body" do
46
+ expect(subject).to eq('594b979db0ddeee4bed8d10e9a2d21b1')
47
+ end
25
48
 
26
- describe "#sha" do
27
- subject { described_class.new(body).sha }
28
- context "when request is valid JSON" do
29
- let(:body) { %q[{"foo":"bar"}] }
30
- it "creates a sha of the parsed JSON" do
31
- expect(subject).to eq('f59494512dabbab0cd0a421c43834271')
32
- end
49
+ context "with nested valid JSON" do
50
+ let(:body) do
51
+ foo = {
52
+ z: {yar: "dar"},
53
+ a: {c: "baz"},
54
+ b: {
55
+ d: "mother",
56
+ a: "father"
57
+ }
58
+ }
59
+ Oj.dump(foo)
33
60
  end
34
- context "when request is not valid JSON"
35
- let(:body) { %q[{foo] }
36
- it "creates a sha of the body" do
37
- expect(subject).to eq('594b979db0ddeee4bed8d10e9a2d21b1')
61
+
62
+ it "creates a sha of the parsed sorted json" do
63
+ expect(subject).to eq("27bd24ec44f579a3a9d843121b9daaa8")
38
64
  end
39
65
  end
66
+ end
40
67
 
68
+ describe "valid xml body" do
69
+ context "when #body can be parsed to a Hash" do
70
+ let(:body) { %q[<xml><foo>bar></foo></xml>] }
71
+ it "returns true" do
72
+ expect(subject.valid_xml?).to be true
73
+ end
74
+ end
41
75
  end
76
+
42
77
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shaman
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Micah Cooper
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-01 00:00:00.000000000 Z
11
+ date: 2014-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oj
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +80,20 @@ dependencies:
66
80
  - - ">="
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
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'
69
97
  description: Convert a string into a MD5. If the string is Valid JSON, parse it, sort
70
98
  the keys, and then turn it into a MD5.
71
99
  email: