hashes_equal 0.2.3 → 0.3.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3c3f58541f24e3ec2f1a3310fd0e448c3fe2a47be3d2daf91dc3e9c5a0a5f40d
4
- data.tar.gz: 4d5946c5a183bc8b3ae0e5e2ebb9fdf3a31c25c8323d29ae936c3508da66e80e
3
+ metadata.gz: 8447faaa13a7be85fdfb87288c12e005213add0fd43a1f0e9e9e29a037558b9e
4
+ data.tar.gz: c6a84ead82b663be2760573db2f392daf293e2167909a7adbc235b81706da484
5
5
  SHA512:
6
- metadata.gz: f6983a719e59f9ee723d9c947ea4c680ea2814a79fa8041beff585dacd8b00dc18a7b629ce12f1f98fdc7c647ae4321bc120b03708d59de400e3d049edd28a36
7
- data.tar.gz: 0a59126f5089b13d038bbf229a8dab8521650d5bfbe119d4c6ed6d8ec0c99f5c826944c1e205ddca64d8c862fff4bd6457a87f0b4425c773c41d3add0267935c
6
+ metadata.gz: 4798ab8bc1b7b3734d57e27c1c3977376da8626637a97c5c9325e7eab4bdea19853035af3d4c39ae2b9b657242998e97c5a1ff88fb9994f5be55af3bbb9b0f2a
7
+ data.tar.gz: 21cb0631f064810aa7f1023e15748d01bd6d27165c9314406d01c85eacf72cd0986b292701facc00b520581d82ac3fcf58e7238d320c2165f099f4a98787bf53
@@ -0,0 +1,54 @@
1
+ version: 2.1
2
+
3
+ executors:
4
+ ruby:
5
+ docker:
6
+ - image: cimg/ruby:3.4.6
7
+ working_directory: ~/project
8
+
9
+ commands:
10
+ bundle_install:
11
+ steps:
12
+ - restore_cache:
13
+ keys:
14
+ - v1-bundle-{{ checksum "Gemfile.lock" }}
15
+ - v1-bundle-
16
+ - run:
17
+ name: Bundle install
18
+ command: |
19
+ bundle config set path vendor/bundle
20
+ bundle install --jobs=4 --retry=3
21
+ - save_cache:
22
+ key: v1-bundle-{{ checksum "Gemfile.lock" }}
23
+ paths:
24
+ - vendor/bundle
25
+
26
+ jobs:
27
+ lint:
28
+ executor: ruby
29
+ steps:
30
+ - checkout
31
+ - bundle_install
32
+ - run:
33
+ name: Rubocop
34
+ command: make lint
35
+
36
+ test:
37
+ executor: ruby
38
+ steps:
39
+ - checkout
40
+ - bundle_install
41
+ - run:
42
+ name: Tests
43
+ command: make tests
44
+ - store_test_results:
45
+ path: tmp/tests/reports
46
+ - store_artifacts:
47
+ path: coverage/
48
+
49
+ workflows:
50
+ version: 2
51
+ build:
52
+ jobs:
53
+ - lint
54
+ - test
data/Dockerfile ADDED
@@ -0,0 +1,26 @@
1
+ FROM ruby:3.4.6-bookworm AS base
2
+
3
+ ENV LANG=C.UTF-8
4
+ ENV BUNDLE_PATH=/usr/local/bundle
5
+
6
+ WORKDIR /app
7
+
8
+ RUN apt-get update && apt-get install -y --no-install-recommends \
9
+ build-essential \
10
+ git \
11
+ libsodium23 \
12
+ && rm -rf /var/lib/apt/lists/*
13
+
14
+ RUN gem install bundler -v 2.7.2 --no-document
15
+ RUN bundler _2.7.2_ --version
16
+
17
+ COPY *.gemspec ./
18
+ COPY Gemfile Gemfile.lock* ./
19
+
20
+ RUN bundler _2.7.2_ install
21
+
22
+ RUN bundle install
23
+
24
+ COPY . .
25
+
26
+ CMD ["bash"]
data/Gemfile CHANGED
@@ -5,5 +5,16 @@ source 'https://rubygems.org'
5
5
  # Specify your gem's dependencies in hashes_equal.gemspec
6
6
  gemspec
7
7
 
8
- gem 'minitest', '~> 5.0'
9
- gem 'rake', '~> 12.0'
8
+ gem 'base64'
9
+ gem 'bundler', '~> 2.1', '>= 2.1.4'
10
+ gem 'byebug', '~> 11.1'
11
+ gem 'guard', '~> 2.16'
12
+ gem 'guard-minitest', '~> 2.4'
13
+ gem 'minitest', '~> 6.0'
14
+ gem 'minitest-reporters', '~> 1.7'
15
+ gem 'mocha', '~> 3.0'
16
+ gem 'pry', '~> 0.13'
17
+ gem 'rake', '~> 13.0'
18
+ gem 'rubocop', '~> 1.86'
19
+ gem 'rubocop-performance', '~> 1.5'
20
+ gem 'simplecov', '~> 0.19.0'
data/Makefile CHANGED
@@ -1,6 +1,12 @@
1
1
  build:
2
2
  gem build hashes_equal.gemspec
3
- echo ">> gem push hashes_equal-x.y.z.gem, to release this new version!"
3
+ echo ">> gem push_hashes_equal-x.y.z.gem, to release this new version!"
4
+
5
+ docker_bash:
6
+ docker compose run --rm hashes_equal_gem bash
7
+
8
+ docker_build:
9
+ docker compose up --build
4
10
 
5
11
  lint:
6
12
  bundle exec rubocop
@@ -0,0 +1,15 @@
1
+ services:
2
+ hashes_equal_gem:
3
+ build:
4
+ context: .
5
+ dockerfile: Dockerfile
6
+ working_dir: /app
7
+ volumes:
8
+ - .:/app
9
+ - bundle_cache:/usr/local/bundle
10
+ tty: true
11
+ stdin_open: true
12
+ command: echo 'ok'
13
+
14
+ volumes:
15
+ bundle_cache:
data/hashes_equal.gemspec CHANGED
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'lib/hashes_equal/version'
3
+ # require_relative 'lib/hashes_equal/version'
4
4
 
5
+ # rubocop:disable Gemspec/RequireMFA
5
6
  Gem::Specification.new do |spec|
6
7
  spec.name = 'hashes_equal'
7
- spec.version = HashesEqual::VERSION
8
+ spec.version = '0.3.1'
8
9
  spec.authors = ['Shippingbo']
9
10
  spec.email = ['tech@facilecomm.com']
10
11
 
@@ -20,6 +21,8 @@ Gem::Specification.new do |spec|
20
21
  # spec.metadata["source_code_uri"] = "Put your gem's public repo URL here."
21
22
  # spec.metadata["changelog_uri"] = "Put your gem's CHANGELOG.md URL here."
22
23
 
24
+ # spec.metadata['rubygems_mfa_required'] = 'true'
25
+
23
26
  # Specify which files should be added to the gem when it is released.
24
27
  # The `git ls-files -z` loads the files
25
28
  # in the RubyGem that have been added into git.
@@ -37,16 +40,17 @@ Gem::Specification.new do |spec|
37
40
 
38
41
  spec.add_dependency 'hashdiff', '~> 1.0', '>= 1.0.1'
39
42
 
40
- spec.add_development_dependency 'bundler', '~> 2.1', '>= 2.1.4'
41
- spec.add_development_dependency 'byebug', '~> 11.1'
42
- spec.add_development_dependency 'guard', '~> 2.16'
43
- spec.add_development_dependency 'guard-minitest', '~> 2.4'
44
- spec.add_development_dependency 'minitest', '~> 5.11'
45
- spec.add_development_dependency 'minitest-reporters', '~> 1.4'
46
- spec.add_development_dependency 'mocha', '~> 1.11'
47
- spec.add_development_dependency 'pry', '~> 0.13'
48
- spec.add_development_dependency 'rake', '~> 13.0'
49
- spec.add_development_dependency 'rubocop', '0.93.1'
50
- spec.add_development_dependency 'rubocop-performance', '~> 1.5'
51
- spec.add_development_dependency 'simplecov', '~> 0.18.5'
43
+ # spec.add_development_dependency 'bundler', '~> 2.1', '>= 2.1.4'
44
+ # spec.add_development_dependency 'byebug', '~> 11.1'
45
+ # spec.add_development_dependency 'guard', '~> 2.16'
46
+ # spec.add_development_dependency 'guard-minitest', '~> 2.4'
47
+ # spec.add_development_dependency 'minitest', '~> 6.0'
48
+ # spec.add_development_dependency 'minitest-reporters', '~> 1.7'
49
+ # spec.add_development_dependency 'mocha', '~> 3.0'
50
+ # spec.add_development_dependency 'pry', '~> 0.13'
51
+ # spec.add_development_dependency 'rake', '~> 13.0'
52
+ # spec.add_development_dependency 'rubocop', '1.86'
53
+ # spec.add_development_dependency 'rubocop-performance', '~> 1.5'
54
+ # spec.add_development_dependency 'simplecov', '~> 0.19.0'
52
55
  end
56
+ # rubocop:enable Gemspec/RequireMFA
@@ -10,35 +10,50 @@ module HashesEqual
10
10
 
11
11
  class UnprocessableHashdiff < ArgumentError; end
12
12
 
13
- def initialize(expected:, actual:)
13
+ def initialize(expected:, actual:, diff_options: {}, &comparison_block)
14
14
  @expected = expected
15
15
  @actual = actual
16
+ @diff_options = diff_options
17
+ @comparison_block = comparison_block
16
18
  assert_send :expected
17
19
  assert_send :actual
20
+ assert_send :diff_options
18
21
  check_args
19
22
  end
20
23
 
21
24
  def call
22
- compute_diff
25
+ diff # compute it
26
+
23
27
  ANSI.white do
24
28
  formatted_diff
25
29
  end
26
30
  end
27
31
 
32
+ def diff
33
+ @diff ||= compute_diff
34
+ end
35
+
28
36
  private
29
37
 
30
- attr_reader :expected, :actual, :diff
38
+ attr_reader(
39
+ :expected,
40
+ :actual,
41
+ :diff_options,
42
+ :comparison_block
43
+ )
31
44
 
32
45
  def check_args
33
46
  # Add specific checks if needed
34
47
  end
35
48
 
36
49
  def compute_diff
37
- @diff = perform_diff_computation
50
+ perform_diff_computation.tap do |res|
51
+ assert_kind_of Array, res
52
+ end
38
53
  end
39
54
 
40
55
  def perform_diff_computation
41
- Hashdiff.diff(expected, actual)
56
+ Hashdiff.diff(expected, actual, diff_options, &comparison_block)
42
57
  end
43
58
 
44
59
  def formatted_diff
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'hashes_equal/hash_diff_displayer'
4
+
5
+ module HashesEqual
6
+ class HashAlmostDiffDisplayer < HashDiffDisplayer
7
+ class ToleranceMustBeNonNegativeNumeric < ArgumentError; end
8
+
9
+ def initialize(expected:, actual:, tolerance:, strict: false)
10
+ @tolerance = tolerance
11
+ @strict = strict
12
+
13
+ super(
14
+ expected: expected,
15
+ actual: actual,
16
+ diff_options: {
17
+ numeric_tolerance: tolerance,
18
+ strict: strict
19
+ }
20
+ )
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :tolerance, :strict
26
+
27
+ def check_args
28
+ super
29
+ return if tolerance.is_a?(Numeric) && tolerance >= 0
30
+
31
+ raise(
32
+ ToleranceMustBeNonNegativeNumeric,
33
+ "tolerance was #{tolerance.inspect}"
34
+ )
35
+ end
36
+ end
37
+ end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'hashes_equal/hash_diff_displayer'
4
+ require 'hashes_equal/hash_almost_diff_displayer'
5
+ require 'hashes_equal/hash_rounded_diff_displayer'
4
6
 
5
7
  module HashesEqual
6
8
  module HashCompareHelper
@@ -15,5 +17,30 @@ module HashesEqual
15
17
  assert expected == actual, displayable_diff
16
18
  end
17
19
  end
20
+
21
+ def assert_hashes_almost_equal(expected, actual, tolerance:, strict: false)
22
+ displayer = HashAlmostDiffDisplayer.new(
23
+ expected: expected,
24
+ actual: actual,
25
+ tolerance: tolerance,
26
+ strict: strict
27
+ )
28
+
29
+ result = displayer.call
30
+
31
+ assert displayer.diff.empty?, result
32
+ end
33
+
34
+ def assert_rounded_hashes_equal(expected, actual, precision:)
35
+ displayer = HashRoundedDiffDisplayer.new(
36
+ expected: expected,
37
+ actual: actual,
38
+ precision: precision
39
+ )
40
+
41
+ result = displayer.call
42
+
43
+ assert displayer.diff.empty?, result
44
+ end
18
45
  end
19
46
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'hashes_equal/hash_diff_displayer'
4
+
5
+ module HashesEqual
6
+ class HashRoundedDiffDisplayer < HashDiffDisplayer
7
+ class PrecisionMustBeNonNegativeInteger < ArgumentError; end
8
+
9
+ def initialize(expected:, actual:, precision:)
10
+ @precision = precision
11
+
12
+ super(expected: expected, actual: actual) do |_path, left, right|
13
+ next unless left.is_a?(Numeric) && right.is_a?(Numeric)
14
+
15
+ left.round(precision) == right.round(precision)
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :precision
22
+
23
+ def check_args
24
+ super
25
+ return if precision.is_a?(Integer) && precision >= 0
26
+
27
+ raise(
28
+ PrecisionMustBeNonNegativeInteger,
29
+ "precision was #{precision.inspect}"
30
+ )
31
+ end
32
+ end
33
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HashesEqual
4
- VERSION = '0.2.3'
4
+ VERSION = '0.3.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hashes_equal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shippingbo
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2021-07-30 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: ansi
@@ -58,180 +57,6 @@ dependencies:
58
57
  - - ">="
59
58
  - !ruby/object:Gem::Version
60
59
  version: 1.0.1
61
- - !ruby/object:Gem::Dependency
62
- name: bundler
63
- requirement: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - "~>"
66
- - !ruby/object:Gem::Version
67
- version: '2.1'
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- version: 2.1.4
71
- type: :development
72
- prerelease: false
73
- version_requirements: !ruby/object:Gem::Requirement
74
- requirements:
75
- - - "~>"
76
- - !ruby/object:Gem::Version
77
- version: '2.1'
78
- - - ">="
79
- - !ruby/object:Gem::Version
80
- version: 2.1.4
81
- - !ruby/object:Gem::Dependency
82
- name: byebug
83
- requirement: !ruby/object:Gem::Requirement
84
- requirements:
85
- - - "~>"
86
- - !ruby/object:Gem::Version
87
- version: '11.1'
88
- type: :development
89
- prerelease: false
90
- version_requirements: !ruby/object:Gem::Requirement
91
- requirements:
92
- - - "~>"
93
- - !ruby/object:Gem::Version
94
- version: '11.1'
95
- - !ruby/object:Gem::Dependency
96
- name: guard
97
- requirement: !ruby/object:Gem::Requirement
98
- requirements:
99
- - - "~>"
100
- - !ruby/object:Gem::Version
101
- version: '2.16'
102
- type: :development
103
- prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
105
- requirements:
106
- - - "~>"
107
- - !ruby/object:Gem::Version
108
- version: '2.16'
109
- - !ruby/object:Gem::Dependency
110
- name: guard-minitest
111
- requirement: !ruby/object:Gem::Requirement
112
- requirements:
113
- - - "~>"
114
- - !ruby/object:Gem::Version
115
- version: '2.4'
116
- type: :development
117
- prerelease: false
118
- version_requirements: !ruby/object:Gem::Requirement
119
- requirements:
120
- - - "~>"
121
- - !ruby/object:Gem::Version
122
- version: '2.4'
123
- - !ruby/object:Gem::Dependency
124
- name: minitest
125
- requirement: !ruby/object:Gem::Requirement
126
- requirements:
127
- - - "~>"
128
- - !ruby/object:Gem::Version
129
- version: '5.11'
130
- type: :development
131
- prerelease: false
132
- version_requirements: !ruby/object:Gem::Requirement
133
- requirements:
134
- - - "~>"
135
- - !ruby/object:Gem::Version
136
- version: '5.11'
137
- - !ruby/object:Gem::Dependency
138
- name: minitest-reporters
139
- requirement: !ruby/object:Gem::Requirement
140
- requirements:
141
- - - "~>"
142
- - !ruby/object:Gem::Version
143
- version: '1.4'
144
- type: :development
145
- prerelease: false
146
- version_requirements: !ruby/object:Gem::Requirement
147
- requirements:
148
- - - "~>"
149
- - !ruby/object:Gem::Version
150
- version: '1.4'
151
- - !ruby/object:Gem::Dependency
152
- name: mocha
153
- requirement: !ruby/object:Gem::Requirement
154
- requirements:
155
- - - "~>"
156
- - !ruby/object:Gem::Version
157
- version: '1.11'
158
- type: :development
159
- prerelease: false
160
- version_requirements: !ruby/object:Gem::Requirement
161
- requirements:
162
- - - "~>"
163
- - !ruby/object:Gem::Version
164
- version: '1.11'
165
- - !ruby/object:Gem::Dependency
166
- name: pry
167
- requirement: !ruby/object:Gem::Requirement
168
- requirements:
169
- - - "~>"
170
- - !ruby/object:Gem::Version
171
- version: '0.13'
172
- type: :development
173
- prerelease: false
174
- version_requirements: !ruby/object:Gem::Requirement
175
- requirements:
176
- - - "~>"
177
- - !ruby/object:Gem::Version
178
- version: '0.13'
179
- - !ruby/object:Gem::Dependency
180
- name: rake
181
- requirement: !ruby/object:Gem::Requirement
182
- requirements:
183
- - - "~>"
184
- - !ruby/object:Gem::Version
185
- version: '13.0'
186
- type: :development
187
- prerelease: false
188
- version_requirements: !ruby/object:Gem::Requirement
189
- requirements:
190
- - - "~>"
191
- - !ruby/object:Gem::Version
192
- version: '13.0'
193
- - !ruby/object:Gem::Dependency
194
- name: rubocop
195
- requirement: !ruby/object:Gem::Requirement
196
- requirements:
197
- - - '='
198
- - !ruby/object:Gem::Version
199
- version: 0.93.1
200
- type: :development
201
- prerelease: false
202
- version_requirements: !ruby/object:Gem::Requirement
203
- requirements:
204
- - - '='
205
- - !ruby/object:Gem::Version
206
- version: 0.93.1
207
- - !ruby/object:Gem::Dependency
208
- name: rubocop-performance
209
- requirement: !ruby/object:Gem::Requirement
210
- requirements:
211
- - - "~>"
212
- - !ruby/object:Gem::Version
213
- version: '1.5'
214
- type: :development
215
- prerelease: false
216
- version_requirements: !ruby/object:Gem::Requirement
217
- requirements:
218
- - - "~>"
219
- - !ruby/object:Gem::Version
220
- version: '1.5'
221
- - !ruby/object:Gem::Dependency
222
- name: simplecov
223
- requirement: !ruby/object:Gem::Requirement
224
- requirements:
225
- - - "~>"
226
- - !ruby/object:Gem::Version
227
- version: 0.18.5
228
- type: :development
229
- prerelease: false
230
- version_requirements: !ruby/object:Gem::Requirement
231
- requirements:
232
- - - "~>"
233
- - !ruby/object:Gem::Version
234
- version: 0.18.5
235
60
  description: Provides an assertion to test for hashes equality.
236
61
  email:
237
62
  - tech@facilecomm.com
@@ -239,11 +64,13 @@ executables: []
239
64
  extensions: []
240
65
  extra_rdoc_files: []
241
66
  files:
67
+ - ".circleci/config.yml"
242
68
  - ".gitignore"
243
69
  - ".rubocop.yml"
244
70
  - ".ruby_version"
245
71
  - ".travis.yml"
246
72
  - CODE_OF_CONDUCT.md
73
+ - Dockerfile
247
74
  - Gemfile
248
75
  - Guardfile
249
76
  - LICENSE.txt
@@ -252,20 +79,22 @@ files:
252
79
  - Rakefile
253
80
  - bin/console
254
81
  - bin/setup
82
+ - docker-compose.yaml
255
83
  - hashes_equal.gemspec
256
84
  - lib/hashes_equal.rb
257
85
  - lib/hashes_equal/enumerable_compare_helper.rb
258
86
  - lib/hashes_equal/enumerable_diff_displayer.rb
259
87
  - lib/hashes_equal/generic_diff_displayer.rb
88
+ - lib/hashes_equal/hash_almost_diff_displayer.rb
260
89
  - lib/hashes_equal/hash_compare_helper.rb
261
90
  - lib/hashes_equal/hash_diff_displayer.rb
91
+ - lib/hashes_equal/hash_rounded_diff_displayer.rb
262
92
  - lib/hashes_equal/time_coarsener.rb
263
93
  - lib/hashes_equal/version.rb
264
94
  homepage: https://github.com/Facilecomm/hashes_equal
265
95
  licenses:
266
96
  - MIT
267
97
  metadata: {}
268
- post_install_message:
269
98
  rdoc_options: []
270
99
  require_paths:
271
100
  - lib
@@ -280,8 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
280
109
  - !ruby/object:Gem::Version
281
110
  version: '0'
282
111
  requirements: []
283
- rubygems_version: 3.0.3
284
- signing_key:
112
+ rubygems_version: 3.6.9
285
113
  specification_version: 4
286
114
  summary: MiniTest style assertion to compare hashes.
287
115
  test_files: []