nice-diff 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/nice/diff.rb +88 -0
- data/lib/nice/diff/parser.rb +27 -0
- data/lib/nice/diff/version.rb +3 -0
- metadata +119 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8b97b15c5d586a0815b6cba40b01eaba53e58dbf
|
4
|
+
data.tar.gz: 2cf8b59e6c78fcf4accc624ed89d1a9afa697516
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a88b74e722d046267299ec1e0ec49767a5e8c85db811f461cff824c908662dba25aa7650502790eae0da3e512f2a0f157ab189413f2f3e93ee12704c98e618c0
|
7
|
+
data.tar.gz: 828f6ca135fe5abb7b661cded35d6e2bfb12a49820bdf311bf7d1afe97b8515ef0e5d4a3155554bee42d9434affe8f8bdc630e58b55b8b1170aa7d96f521d709
|
data/lib/nice/diff.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
require "nice/diff/version"
|
2
|
+
require "nice/diff/parser"
|
3
|
+
|
4
|
+
module Nice
|
5
|
+
class Diff
|
6
|
+
# Error raised if the specified file cannot be found.
|
7
|
+
class FileDoesNotExist < RuntimeError; end
|
8
|
+
|
9
|
+
# Error raised if the format is not specified.
|
10
|
+
class FormatNotSpecified < RuntimeError; end
|
11
|
+
|
12
|
+
attr_accessor :format, :expected_file, :actual_file
|
13
|
+
|
14
|
+
@@hash_print = nil
|
15
|
+
@@key = nil
|
16
|
+
|
17
|
+
def initialize(format, expected_file, actual_file)
|
18
|
+
raise Nice::Diff::FileDoesNotExist unless File.exists?(expected_file)
|
19
|
+
raise Nice::Diff::FileDoesNotExist unless File.exists?(actual_file)
|
20
|
+
raise Nice::Diff::FormatNotSpecified if format.nil?
|
21
|
+
|
22
|
+
@expected_file = File.read expected_file
|
23
|
+
@actual_file = File.read actual_file
|
24
|
+
@format = format.upcase
|
25
|
+
end
|
26
|
+
|
27
|
+
def parse_to_array
|
28
|
+
parser = eval("#{@format}Parser").new
|
29
|
+
parser.parse_to_array(self) #passing reference to itself to the parsing strategy
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.hash_print
|
33
|
+
@@hash_print
|
34
|
+
end
|
35
|
+
|
36
|
+
def key=(key)
|
37
|
+
@@key = key
|
38
|
+
end
|
39
|
+
|
40
|
+
def print
|
41
|
+
expected_arr, actual_arr = parse_to_array
|
42
|
+
headers = Array.new
|
43
|
+
|
44
|
+
expected_arr.each_with_index { |expected_hash_of_obj, i|
|
45
|
+
expected_arr[0].each_with_index { |(k,v), i| headers[i] = k}
|
46
|
+
actual_hash_of_obj = actual_arr[i]
|
47
|
+
|
48
|
+
expected_keys = expected_hash_of_obj.keys.to_set
|
49
|
+
actual_keys = actual_hash_of_obj.keys.to_set
|
50
|
+
|
51
|
+
unless expected_keys == actual_keys
|
52
|
+
unwanted = actual_keys - expected_keys
|
53
|
+
missing = expected_keys - actual_keys
|
54
|
+
|
55
|
+
STDOUT.puts "\Actual #{@format} file contain #{unwanted.size} unwanted #{@@key}(s): #{actual_hash_of_obj.keys - expected_hash_of_obj.keys}" unless unwanted.empty?
|
56
|
+
STDOUT.puts "\Actual #{@format} file is missing #{missing.size} #{@@key}(s): #{expected_hash_of_obj.keys - actual_hash_of_obj.keys}" unless missing.empty?
|
57
|
+
return
|
58
|
+
end
|
59
|
+
|
60
|
+
unless expected_hash_of_obj.eql?(actual_hash_of_obj)
|
61
|
+
STDOUT.puts "\nDiff for object\##{i}:\n"
|
62
|
+
self.class.print_hash_diff(expected_hash: expected_hash_of_obj, actual_hash: actual_hash_of_obj, headers: headers)
|
63
|
+
end
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
def self.print_hash_diff(expected_hash: nil, actual_hash: nil, headers: nil)
|
69
|
+
@@hash_print = Hash.new
|
70
|
+
|
71
|
+
expected_hash.each_with_index { |(k,v), i|
|
72
|
+
unless v.eql?(actual_hash[k])
|
73
|
+
@@hash_print["#{i}"] = actual_hash[k]
|
74
|
+
end
|
75
|
+
}
|
76
|
+
|
77
|
+
headers.keep_if { |i| @@hash_print.keys.include?(headers.index(i).to_s)}
|
78
|
+
offset1 = headers.max_by(&:length).length + 10
|
79
|
+
offset2 = expected_hash.values.compact.max_by(&:length).length + 10
|
80
|
+
offset3 = @@hash_print.values.compact.max_by(&:length).length + 10
|
81
|
+
|
82
|
+
STDOUT.puts "\t| #{@@key}:".ljust(offset1) + "| Expected:".ljust(offset2) + "| Actual:".ljust(offset3) + "|"
|
83
|
+
@@hash_print.each_with_index { |(k,v), i|
|
84
|
+
STDOUT.puts "\t| #{headers[i]}".ljust(offset1) + "| #{expected_hash[expected_hash.keys[k.to_i]]}".ljust(offset2) + "| #{@@hash_print[k]}".ljust(offset3) + "|"
|
85
|
+
}
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'nokogiri'
|
3
|
+
require 'active_support/all'
|
4
|
+
|
5
|
+
module Nice
|
6
|
+
class Parser
|
7
|
+
def parse_to_array(context)
|
8
|
+
raise 'Abstract method called: parse_to_array'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class JSONParser < Parser
|
13
|
+
def parse_to_array(context)
|
14
|
+
context.key = 'Key'
|
15
|
+
[JSON.parse(context.expected_file), JSON.parse(context.actual_file)]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class XMLParser < Parser
|
20
|
+
def parse_to_array(context)
|
21
|
+
context.key = 'Tag'
|
22
|
+
xml1 = Nokogiri::XML(context.expected_file).to_s
|
23
|
+
xml2 = Nokogiri::XML(context.actual_file).to_s
|
24
|
+
[Hash.from_xml(xml1).values, Hash.from_xml(xml2).values]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: nice-diff
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ravi Kandpal
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-08-12 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: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: nokogiri
|
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'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.6'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.6'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: active_support
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 3.0.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 3.0.0
|
83
|
+
description: Nice diff generates the tabular readable diff of two JSON or XML files.
|
84
|
+
A file object reference to corresponding JSON or XML files needs to be passed along
|
85
|
+
with the format type being expressed.
|
86
|
+
email:
|
87
|
+
- ravi.kandpal87@gmail.com
|
88
|
+
executables: []
|
89
|
+
extensions: []
|
90
|
+
extra_rdoc_files: []
|
91
|
+
files:
|
92
|
+
- lib/nice/diff.rb
|
93
|
+
- lib/nice/diff/parser.rb
|
94
|
+
- lib/nice/diff/version.rb
|
95
|
+
homepage: https://github.com/ravik87/nice-diff
|
96
|
+
licenses:
|
97
|
+
- MIT
|
98
|
+
metadata: {}
|
99
|
+
post_install_message:
|
100
|
+
rdoc_options: []
|
101
|
+
require_paths:
|
102
|
+
- lib
|
103
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - '>='
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - '>='
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
requirements: []
|
114
|
+
rubyforge_project:
|
115
|
+
rubygems_version: 2.2.2
|
116
|
+
signing_key:
|
117
|
+
specification_version: 4
|
118
|
+
summary: Nice diff gives nice readable diff view in tabular format.
|
119
|
+
test_files: []
|