nice-diff 1.0.0
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 +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: []
|