hashes_equal 0.1.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 +4 -4
- data/.circleci/config.yml +54 -0
- data/.rubocop.yml +4 -0
- data/.travis.yml +0 -1
- data/Dockerfile +26 -0
- data/Gemfile +13 -2
- data/Makefile +7 -0
- data/docker-compose.yaml +15 -0
- data/hashes_equal.gemspec +18 -14
- data/lib/hashes_equal/enumerable_compare_helper.rb +18 -0
- data/lib/hashes_equal/generic_diff_displayer.rb +20 -5
- data/lib/hashes_equal/hash_almost_diff_displayer.rb +37 -0
- data/lib/hashes_equal/hash_compare_helper.rb +27 -0
- data/lib/hashes_equal/hash_rounded_diff_displayer.rb +33 -0
- data/lib/hashes_equal/time_coarsener.rb +88 -0
- data/lib/hashes_equal/version.rb +1 -1
- metadata +9 -180
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8447faaa13a7be85fdfb87288c12e005213add0fd43a1f0e9e9e29a037558b9e
|
|
4
|
+
data.tar.gz: c6a84ead82b663be2760573db2f392daf293e2167909a7adbc235b81706da484
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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/.rubocop.yml
CHANGED
|
@@ -3,6 +3,7 @@ require:
|
|
|
3
3
|
|
|
4
4
|
AllCops:
|
|
5
5
|
TargetRubyVersion: 2.6
|
|
6
|
+
NewCops: enable
|
|
6
7
|
|
|
7
8
|
Layout/EmptyLinesAroundAttributeAccessor:
|
|
8
9
|
Enabled: true
|
|
@@ -94,6 +95,9 @@ Style/RedundantRegexpEscape:
|
|
|
94
95
|
Style/SlicingWithRange:
|
|
95
96
|
Enabled: true
|
|
96
97
|
|
|
98
|
+
Style/StringConcatenation:
|
|
99
|
+
Enabled: false
|
|
100
|
+
|
|
97
101
|
# Metrics/ClassLength:
|
|
98
102
|
# Max: 250
|
|
99
103
|
|
data/.travis.yml
CHANGED
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 '
|
|
9
|
-
gem '
|
|
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,5 +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!"
|
|
4
|
+
|
|
5
|
+
docker_bash:
|
|
6
|
+
docker compose run --rm hashes_equal_gem bash
|
|
7
|
+
|
|
8
|
+
docker_build:
|
|
9
|
+
docker compose up --build
|
|
3
10
|
|
|
4
11
|
lint:
|
|
5
12
|
bundle exec rubocop
|
data/docker-compose.yaml
ADDED
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 =
|
|
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', '~>
|
|
45
|
-
spec.add_development_dependency 'minitest-reporters', '~> 1.
|
|
46
|
-
spec.add_development_dependency 'mocha', '~>
|
|
47
|
-
spec.add_development_dependency 'pry', '~> 0.13'
|
|
48
|
-
spec.add_development_dependency 'rake', '~> 13.0'
|
|
49
|
-
spec.add_development_dependency 'rubocop', '
|
|
50
|
-
spec.add_development_dependency 'rubocop-performance', '~> 1.5'
|
|
51
|
-
spec.add_development_dependency 'simplecov', '~> 0.
|
|
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
|
|
@@ -1,9 +1,27 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'hashes_equal/enumerable_diff_displayer'
|
|
4
|
+
require 'hashes_equal/time_coarsener'
|
|
4
5
|
|
|
5
6
|
module HashesEqual
|
|
6
7
|
module EnumerableCompareHelper
|
|
8
|
+
def assert_time_aware_enumerable_equal(
|
|
9
|
+
expected,
|
|
10
|
+
actual,
|
|
11
|
+
time_granularity:,
|
|
12
|
+
verbose: true
|
|
13
|
+
)
|
|
14
|
+
time_coarsener = TimeCoarsener.new(time_granularity)
|
|
15
|
+
time_coarsened_expected = time_coarsener.call(expected)
|
|
16
|
+
time_coarsened_actual = time_coarsener.call(actual)
|
|
17
|
+
|
|
18
|
+
assert_enumerable_equal(
|
|
19
|
+
time_coarsened_expected,
|
|
20
|
+
time_coarsened_actual,
|
|
21
|
+
verbose: verbose
|
|
22
|
+
)
|
|
23
|
+
end
|
|
24
|
+
|
|
7
25
|
def assert_enumerable_equal(expected, actual, verbose: true)
|
|
8
26
|
displayable_diff = EnumerableDiffDisplayer.new(
|
|
9
27
|
expected: expected,
|
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'ansi'
|
|
4
|
+
require 'assertable'
|
|
5
|
+
require 'hashdiff'
|
|
6
|
+
|
|
7
|
+
module HashesEqual
|
|
8
|
+
class TimeCoarsener
|
|
9
|
+
include Assertable
|
|
10
|
+
|
|
11
|
+
class InvalidTimeGranularity < ArgumentError; end
|
|
12
|
+
|
|
13
|
+
VALID_TIME_GRANULARITY = %i[
|
|
14
|
+
sec
|
|
15
|
+
usec
|
|
16
|
+
].freeze
|
|
17
|
+
|
|
18
|
+
def initialize(time_granularity)
|
|
19
|
+
@time_granularity = time_granularity
|
|
20
|
+
assert_send :time_granularity
|
|
21
|
+
check_valid_granularity_for_time_aware_comparison
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Either an enumerable or a Time object
|
|
25
|
+
def call(object_to_convert)
|
|
26
|
+
@object_to_convert = object_to_convert
|
|
27
|
+
assert_send :object_to_convert
|
|
28
|
+
|
|
29
|
+
convert_object(object_to_convert)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
attr_reader :object_to_convert, :time_granularity
|
|
35
|
+
|
|
36
|
+
def convert_object(object)
|
|
37
|
+
return convert_hash(object) if object.is_a?(Hash)
|
|
38
|
+
return convert_enumerable(object) if object.is_a?(Enumerable)
|
|
39
|
+
return convert_time(object) if object.is_a?(Time)
|
|
40
|
+
|
|
41
|
+
object
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def convert_hash(hash_to_convert)
|
|
45
|
+
hash_to_convert.transform_values do |value|
|
|
46
|
+
convert_object(value)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def convert_enumerable(enumerable_to_convert)
|
|
51
|
+
enumerable_to_convert.map do |value|
|
|
52
|
+
convert_object value
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def convert_time(time_to_convert)
|
|
57
|
+
send(coarsening_method_name, time_to_convert)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def coarsen_to_sec(time_to_convert)
|
|
61
|
+
Time.at(
|
|
62
|
+
time_to_convert.to_i
|
|
63
|
+
)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def coarsen_to_usec(time_to_convert)
|
|
67
|
+
Time.at(
|
|
68
|
+
time_to_convert.to_i, time_to_convert.usec, :usec
|
|
69
|
+
)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def coarsening_method_name
|
|
73
|
+
"coarsen_to_#{time_granularity}"
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def check_valid_granularity_for_time_aware_comparison
|
|
77
|
+
return if VALID_TIME_GRANULARITY.include?(time_granularity.to_sym)
|
|
78
|
+
|
|
79
|
+
raise(
|
|
80
|
+
InvalidTimeGranularity,
|
|
81
|
+
[
|
|
82
|
+
"#{time_granularity.inspect} is not a valid time_granularity.",
|
|
83
|
+
"Valid values are: #{VALID_TIME_GRANULARITY.inspect}"
|
|
84
|
+
].join(' ')
|
|
85
|
+
)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
data/lib/hashes_equal/version.rb
CHANGED
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.1
|
|
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:
|
|
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.85'
|
|
200
|
-
type: :development
|
|
201
|
-
prerelease: false
|
|
202
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
203
|
-
requirements:
|
|
204
|
-
- - "~>"
|
|
205
|
-
- !ruby/object:Gem::Version
|
|
206
|
-
version: '0.85'
|
|
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,19 +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
|
|
92
|
+
- lib/hashes_equal/time_coarsener.rb
|
|
262
93
|
- lib/hashes_equal/version.rb
|
|
263
94
|
homepage: https://github.com/Facilecomm/hashes_equal
|
|
264
95
|
licenses:
|
|
265
96
|
- MIT
|
|
266
97
|
metadata: {}
|
|
267
|
-
post_install_message:
|
|
268
98
|
rdoc_options: []
|
|
269
99
|
require_paths:
|
|
270
100
|
- lib
|
|
@@ -279,8 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
279
109
|
- !ruby/object:Gem::Version
|
|
280
110
|
version: '0'
|
|
281
111
|
requirements: []
|
|
282
|
-
rubygems_version: 3.
|
|
283
|
-
signing_key:
|
|
112
|
+
rubygems_version: 3.6.9
|
|
284
113
|
specification_version: 4
|
|
285
114
|
summary: MiniTest style assertion to compare hashes.
|
|
286
115
|
test_files: []
|