the_array_comparator 0.1.1 → 0.2.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.
- data/.yardopts +6 -0
- data/API-GUIDE.md +18 -0
- data/README.md +7 -2
- data/Rakefile +1 -1
- data/lib/the_array_comparator/cache.rb +66 -0
- data/lib/the_array_comparator/comparator.rb +10 -7
- data/lib/the_array_comparator/sample.rb +17 -4
- data/lib/the_array_comparator/version.rb +2 -4
- data/lib/the_array_comparator.rb +1 -0
- data/spec/cache_spec.rb +89 -0
- data/spec/comparator/comparator_spec.rb +2 -2
- data/spec/sample_spec.rb +16 -2
- metadata +6 -1
data/.yardopts
ADDED
data/API-GUIDE.md
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# API Guide
|
2
|
+
|
3
|
+
This very brief documentation should give you a good starting point on how to discover the API:
|
4
|
+
|
5
|
+
```
|
6
|
+
Comparator # Main class dispatching the work
|
7
|
+
|
|
8
|
+
-- Check, Result, Sample # Helper classes for easier testing
|
9
|
+
|
|
10
|
+
-- Strategies
|
11
|
+
| |
|
12
|
+
| -- ContainsAll # Strategies doing the hard work:
|
13
|
+
| | # compare data with keywords and
|
14
|
+
| -- ... # return the result
|
15
|
+
|
|
16
|
+
-- Cache # Cache checks for easier retrieval
|
17
|
+
|
18
|
+
```
|
data/README.md
CHANGED
@@ -112,10 +112,15 @@ If you wish to write your own comparators you can do so. Just register those cla
|
|
112
112
|
TheArrayComparator::Comparator.register :my_contains, Strategies::MyContains
|
113
113
|
```
|
114
114
|
|
115
|
+
## Further reading
|
116
|
+
|
117
|
+
Please the the full api-documentation on [rdoc info](http://rdoc.info/github/maxmeyer/the_array_comparator/frames) for further reading.
|
118
|
+
I just give you a brief overview of all the available methods. There's also a brief [guide](API-GUIDE.md) about howto discover the API.
|
119
|
+
|
115
120
|
## Contributing
|
116
121
|
|
117
|
-
Please see CONTRIBUTIONS.md
|
122
|
+
Please see [CONTRIBUTIONS.md](CONTRIBUTIONS.md).
|
118
123
|
|
119
124
|
## Copyright
|
120
125
|
|
121
|
-
(c) 2013 Max Meyer. All rights reserved. Please also see LICENSE.md
|
126
|
+
(c) 2013 Max Meyer. All rights reserved. Please also see [LICENSE.md](LICENSE.md).
|
data/Rakefile
CHANGED
@@ -0,0 +1,66 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
# the main module
|
4
|
+
module TheArrayComparator
|
5
|
+
#caching class
|
6
|
+
class Cache
|
7
|
+
|
8
|
+
# Create cache
|
9
|
+
def initialize
|
10
|
+
@cache = []
|
11
|
+
@new_objects = false
|
12
|
+
end
|
13
|
+
|
14
|
+
# Add object to cache
|
15
|
+
#
|
16
|
+
# @param [Object] obj
|
17
|
+
# the object which should be added to the cache
|
18
|
+
#
|
19
|
+
# @return [Object]
|
20
|
+
# the object which has beed added
|
21
|
+
def add(obj)
|
22
|
+
@cache << obj
|
23
|
+
@new_objects = true
|
24
|
+
|
25
|
+
obj
|
26
|
+
end
|
27
|
+
|
28
|
+
# Return all stored objects
|
29
|
+
#
|
30
|
+
# @return [Array]
|
31
|
+
# the cache
|
32
|
+
def stored_objects
|
33
|
+
@new_objects = false
|
34
|
+
@cache
|
35
|
+
end
|
36
|
+
|
37
|
+
# Clear the cache (delete all objects)
|
38
|
+
def clear
|
39
|
+
@cache = []
|
40
|
+
end
|
41
|
+
|
42
|
+
# Are there new objects
|
43
|
+
#
|
44
|
+
# @return [TrueClass,FalseClass]
|
45
|
+
# the result of the check
|
46
|
+
def new_objects?
|
47
|
+
@new_objects
|
48
|
+
end
|
49
|
+
|
50
|
+
# Delete an object from cache by number
|
51
|
+
#
|
52
|
+
# @return
|
53
|
+
# the deleted object
|
54
|
+
def delete_object(num)
|
55
|
+
@cache.delete_at(num)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Request an object from cache by number
|
59
|
+
#
|
60
|
+
# @return
|
61
|
+
# the requested object
|
62
|
+
def fetch_object(num)
|
63
|
+
@cache[num]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -40,7 +40,7 @@ module TheArrayComparator
|
|
40
40
|
# @return [Comparator]
|
41
41
|
# a new comparator
|
42
42
|
def initialize
|
43
|
-
@
|
43
|
+
@cache = Cache.new
|
44
44
|
end
|
45
45
|
|
46
46
|
# Add a check to test against
|
@@ -76,12 +76,15 @@ module TheArrayComparator
|
|
76
76
|
strategy_klass = Comparator.comparators[type]
|
77
77
|
check = Check.new(strategy_klass,sample)
|
78
78
|
|
79
|
-
@
|
80
|
-
return check
|
79
|
+
@cache.add check
|
81
80
|
end
|
82
81
|
|
82
|
+
# The result of all checks defined
|
83
|
+
#
|
84
|
+
# @return [Result]
|
85
|
+
# the result class with all the data need for further analysis
|
83
86
|
def result
|
84
|
-
@
|
87
|
+
@cache.stored_objects.each { |c| return Result.new(c.sample) unless c.success? }
|
85
88
|
|
86
89
|
Result.new
|
87
90
|
end
|
@@ -100,8 +103,8 @@ module TheArrayComparator
|
|
100
103
|
# @param [Integer] number
|
101
104
|
# the index of the check which should be deleted
|
102
105
|
def delete_check(number)
|
103
|
-
if @
|
104
|
-
@
|
106
|
+
if @cache.fetch_object(number)
|
107
|
+
@cache.delete_object(number)
|
105
108
|
else
|
106
109
|
raise Exceptions::CheckDoesNotExist, "You tried to delete a check, which does not exist!"
|
107
110
|
end
|
@@ -117,7 +120,7 @@ module TheArrayComparator
|
|
117
120
|
# @return [Array]
|
118
121
|
# all available checks
|
119
122
|
def list_checks
|
120
|
-
@
|
123
|
+
@cache.stored_objects
|
121
124
|
end
|
122
125
|
end
|
123
126
|
end
|
@@ -17,10 +17,23 @@ module TheArrayComparator
|
|
17
17
|
# description of the probe
|
18
18
|
attr_accessor :data, :keywords, :exceptions, :tag
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
# New sample
|
21
|
+
#
|
22
|
+
# @param [Array] data ([])
|
23
|
+
# the data to look for keywords
|
24
|
+
#
|
25
|
+
# @param [Set] keywords (Set.new)
|
26
|
+
# the keywords (singular values/arrays will be transformed to a set)
|
27
|
+
#
|
28
|
+
# @param [Set] exceptions (Set.new)
|
29
|
+
# the exceptions (singular values/arrays will be transformed to a set)
|
30
|
+
#
|
31
|
+
# @param [String] tag (nil)
|
32
|
+
# a tag to identify a sample
|
33
|
+
def initialize(data=[],keywords=Set.new,exceptions=Set.new,tag=nil)
|
34
|
+
@keywords = Set.new( [ *keywords ] )
|
35
|
+
@data = *data
|
36
|
+
@exceptions = Set.new( [ *exceptions ] )
|
24
37
|
@tag = tag
|
25
38
|
end
|
26
39
|
|
data/lib/the_array_comparator.rb
CHANGED
@@ -6,6 +6,7 @@ require 'forwardable'
|
|
6
6
|
|
7
7
|
require 'the_array_comparator/version'
|
8
8
|
require 'the_array_comparator/exceptions'
|
9
|
+
require 'the_array_comparator/cache'
|
9
10
|
require 'the_array_comparator/sample'
|
10
11
|
require 'the_array_comparator/check'
|
11
12
|
require 'the_array_comparator/result'
|
data/spec/cache_spec.rb
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
#enconding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Cache do
|
5
|
+
|
6
|
+
let(:cache) { Cache.new }
|
7
|
+
|
8
|
+
it "adds abitrary objects to cache" do
|
9
|
+
expect {
|
10
|
+
cache.add %w{obj}
|
11
|
+
cache.add('obj')
|
12
|
+
}.to_not raise_error
|
13
|
+
end
|
14
|
+
|
15
|
+
it "returns all cached objects" do
|
16
|
+
objects = []
|
17
|
+
|
18
|
+
objects << cache.add('obj')
|
19
|
+
objects << cache.add('obj')
|
20
|
+
objects << cache.add('obj')
|
21
|
+
|
22
|
+
expect(cache.stored_objects).to eq(objects)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "clears cache" do
|
26
|
+
cache.add('obj')
|
27
|
+
cache.add('obj')
|
28
|
+
cache.add('obj')
|
29
|
+
expect(cache.stored_objects.size).to eq(3)
|
30
|
+
|
31
|
+
cache.clear
|
32
|
+
expect(cache.stored_objects.size).to eq(0)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "tells the requester if there are new objects" do
|
36
|
+
cache.add('obj')
|
37
|
+
expect(cache.new_objects?).to eq(true)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "tells the requester if there __no__ new objects" do
|
41
|
+
cache.add('obj')
|
42
|
+
cache.stored_objects
|
43
|
+
expect(cache.new_objects?).to eq(false)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "works with sub-sequent requests to the cache as well" do
|
47
|
+
cache.add('obj')
|
48
|
+
cache.stored_objects
|
49
|
+
cache.add('obj')
|
50
|
+
expect(cache.new_objects?).to eq(true)
|
51
|
+
|
52
|
+
cache.add('obj')
|
53
|
+
cache.stored_objects
|
54
|
+
cache.add('obj')
|
55
|
+
cache.stored_objects
|
56
|
+
expect(cache.new_objects?).to eq(false)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "returns the same objecs if requested multiple times" do
|
60
|
+
cache.add('obj')
|
61
|
+
cache.add('obj')
|
62
|
+
run1 = cache.stored_objects
|
63
|
+
run2 = cache.stored_objects
|
64
|
+
|
65
|
+
expect(run1).to be(run2)
|
66
|
+
expect(run1).to eq(run2)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "deletes specific objects from cache (by number)" do
|
70
|
+
cache.add('obj')
|
71
|
+
c_created = cache.add('obj')
|
72
|
+
cache.add('obj')
|
73
|
+
|
74
|
+
c_deleted = cache.delete_object(1)
|
75
|
+
|
76
|
+
expect(c_created).to eq(c_deleted)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "gets you a specific object" do
|
80
|
+
cache.add('obj')
|
81
|
+
c_created = cache.add('obj')
|
82
|
+
cache.add('obj')
|
83
|
+
|
84
|
+
c_fetched = cache.fetch_object(1)
|
85
|
+
|
86
|
+
expect(c_created).to eq(c_fetched)
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
@@ -91,7 +91,7 @@ describe Comparator do
|
|
91
91
|
expect(result).to eq(true)
|
92
92
|
end
|
93
93
|
|
94
|
-
it "fails if a least one subtest fails"
|
94
|
+
it "fails if a least one subtest fails" do
|
95
95
|
comparator = Comparator.new
|
96
96
|
data = %w{ a b c d }
|
97
97
|
keyword_overlap = %w{ a }
|
@@ -182,7 +182,7 @@ describe Comparator do
|
|
182
182
|
expect(result.of_checks).to eq(true)
|
183
183
|
end
|
184
184
|
|
185
|
-
it "tells you which check has failed and made the whole thing failed" do
|
185
|
+
it "tells you which check has failed and made the whole thing failed" , :test => true do
|
186
186
|
comparator = Comparator.new
|
187
187
|
data = %w{ a b c d }
|
188
188
|
keyword_successfull = %w{ a b }
|
data/spec/sample_spec.rb
CHANGED
@@ -17,8 +17,22 @@ describe Sample do
|
|
17
17
|
sample = Sample.new(data, keywords, exceptions, tag)
|
18
18
|
|
19
19
|
expect(sample.data).to eq(data)
|
20
|
-
expect(sample.keywords).to eq(keywords)
|
21
|
-
expect(sample.exceptions).to eq(exceptions)
|
20
|
+
expect(sample.keywords).to eq(Set.new(keywords))
|
21
|
+
expect(sample.exceptions).to eq(Set.new(exceptions))
|
22
22
|
expect(sample.tag).to eq(tag)
|
23
23
|
end
|
24
|
+
|
25
|
+
it "takes singular values and return them into arrays" do
|
26
|
+
data = 'data'
|
27
|
+
keywords = 'keywords'
|
28
|
+
exceptions = 'exceptions'
|
29
|
+
|
30
|
+
sample = Sample.new(data, keywords, exceptions)
|
31
|
+
|
32
|
+
expect(sample.data).to eq([ data ])
|
33
|
+
expect(sample.keywords).to eq(Set.new( [ keywords ] ) )
|
34
|
+
expect(sample.exceptions).to eq(Set.new( [ exceptions ] ) )
|
35
|
+
end
|
36
|
+
|
37
|
+
|
24
38
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: the_array_comparator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -38,6 +38,8 @@ files:
|
|
38
38
|
- .rspec
|
39
39
|
- .ruby-version
|
40
40
|
- .travis.yml
|
41
|
+
- .yardopts
|
42
|
+
- API-GUIDE.md
|
41
43
|
- CONTRIBUTIONS.md
|
42
44
|
- Gemfile
|
43
45
|
- Gemfile.lock
|
@@ -49,6 +51,7 @@ files:
|
|
49
51
|
- gemfiles/Gemfile.default
|
50
52
|
- gemfiles/Gemfile.travis
|
51
53
|
- lib/the_array_comparator.rb
|
54
|
+
- lib/the_array_comparator/cache.rb
|
52
55
|
- lib/the_array_comparator/check.rb
|
53
56
|
- lib/the_array_comparator/comparator.rb
|
54
57
|
- lib/the_array_comparator/exceptions.rb
|
@@ -70,6 +73,7 @@ files:
|
|
70
73
|
- script/console
|
71
74
|
- script/terminal
|
72
75
|
- spec/benchmark/benchmark_spec.rb
|
76
|
+
- spec/cache_spec.rb
|
73
77
|
- spec/check_spec.rb
|
74
78
|
- spec/comparator/base_spec.rb
|
75
79
|
- spec/comparator/comparator_spec.rb
|
@@ -113,6 +117,7 @@ specification_version: 3
|
|
113
117
|
summary: you need to compare arrays? then this gem is very suitable for you.
|
114
118
|
test_files:
|
115
119
|
- spec/benchmark/benchmark_spec.rb
|
120
|
+
- spec/cache_spec.rb
|
116
121
|
- spec/check_spec.rb
|
117
122
|
- spec/comparator/base_spec.rb
|
118
123
|
- spec/comparator/comparator_spec.rb
|