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.
@@ -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
@@ -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
@@ -0,0 +1,3 @@
1
+ module Nice
2
+ VERSION = "1.0.0"
3
+ 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: []