trifle 0.0.6 → 0.0.7
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/Gemfile.lock +2 -3
- data/README.md +1 -0
- data/lib/trifle/loader.rb +14 -3
- data/lib/trifle/version.rb +1 -1
- data/spec/spec_helper.rb +0 -1
- data/spec/trifle/loader_spec.rb +25 -18
- data/trifle.gemspec +2 -1
- metadata +18 -18
data/Gemfile.lock
CHANGED
@@ -9,7 +9,8 @@ GIT
|
|
9
9
|
PATH
|
10
10
|
remote: .
|
11
11
|
specs:
|
12
|
-
trifle (0.0.
|
12
|
+
trifle (0.0.7)
|
13
|
+
redis
|
13
14
|
|
14
15
|
GEM
|
15
16
|
remote: http://rubygems.org/
|
@@ -27,7 +28,6 @@ GEM
|
|
27
28
|
rspec-expectations (2.10.0)
|
28
29
|
diff-lcs (~> 1.1.3)
|
29
30
|
rspec-mocks (2.10.1)
|
30
|
-
rujitsu (0.3.3)
|
31
31
|
|
32
32
|
PLATFORMS
|
33
33
|
ruby
|
@@ -36,5 +36,4 @@ DEPENDENCIES
|
|
36
36
|
active_support
|
37
37
|
fakeredis!
|
38
38
|
rspec
|
39
|
-
rujitsu
|
40
39
|
trifle!
|
data/README.md
CHANGED
@@ -65,6 +65,7 @@ trifle.find "192.168.1.1"
|
|
65
65
|
|
66
66
|
## Release notes
|
67
67
|
|
68
|
+
* **0.0.7** Loading now happens into separate key, making loading possible without downtime
|
68
69
|
* **0.0.6** Added a fix for invalid IPs
|
69
70
|
* **0.0.5** Fixed bug when finding IPs at the edge of the data set
|
70
71
|
* **0.0.4** Changed binary syntax
|
data/lib/trifle/loader.rb
CHANGED
@@ -17,6 +17,16 @@ class Trifle
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
def tmp_key
|
21
|
+
"#{key}:tmp"
|
22
|
+
end
|
23
|
+
|
24
|
+
def clear
|
25
|
+
redis.del key
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
|
20
30
|
def load_files filenames
|
21
31
|
raise ArgumentError.new("filenames must be an array of strings") unless filenames.is_a?(Array) && !filenames.map{|element| element.is_a?(String)}.include?(false)
|
22
32
|
|
@@ -33,11 +43,12 @@ class Trifle
|
|
33
43
|
clear
|
34
44
|
sort(data)
|
35
45
|
data.each {|row| append(row) }
|
46
|
+
move
|
36
47
|
end
|
37
48
|
|
38
49
|
def append row
|
39
50
|
entry = row.values_at(2,3,4,5).join(":")
|
40
|
-
redis.rpush
|
51
|
+
redis.rpush tmp_key, entry
|
41
52
|
end
|
42
53
|
|
43
54
|
def sort data
|
@@ -60,8 +71,8 @@ class Trifle
|
|
60
71
|
field.is_a?(Numeric) || field =~ /^\d+$/
|
61
72
|
end
|
62
73
|
|
63
|
-
def
|
64
|
-
redis.
|
74
|
+
def move
|
75
|
+
redis.rename tmp_key, key
|
65
76
|
end
|
66
77
|
end
|
67
78
|
end
|
data/lib/trifle/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
data/spec/trifle/loader_spec.rb
CHANGED
@@ -63,21 +63,21 @@ describe Trifle::Loader do
|
|
63
63
|
end
|
64
64
|
|
65
65
|
it "should read the files" do
|
66
|
-
@loader.load_files @filenames
|
66
|
+
@loader.send(:load_files, @filenames)
|
67
67
|
@loader.redis.llen(@loader.key).should be == 4
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
71
|
context "when given anything but an array of strings" do
|
72
72
|
it "should raise an error" do
|
73
|
-
-> { @loader.load_files "" }.should raise_error(ArgumentError)
|
74
|
-
-> { @loader.load_files [:foo] }.should raise_error(ArgumentError)
|
73
|
+
-> { @loader.send(:load_files, "") }.should raise_error(ArgumentError)
|
74
|
+
-> { @loader.send(:load_files, [:foo]) }.should raise_error(ArgumentError)
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
78
|
context "when given a filename for a file that's missing" do
|
79
79
|
it "should raise an error" do
|
80
|
-
-> { @loader.load_files
|
80
|
+
-> { @loader.send(:load_files, ["foobar.csv"]) }.should raise_error(/No such file or directory - foobar.csv/)
|
81
81
|
end
|
82
82
|
end
|
83
83
|
end
|
@@ -87,41 +87,48 @@ describe Trifle::Loader do
|
|
87
87
|
context "when given valid data" do
|
88
88
|
it "should clear out existing data" do
|
89
89
|
@loader.should_receive(:clear)
|
90
|
-
@loader.load_data @valid_data
|
90
|
+
@loader.send(:load_data, @valid_data)
|
91
91
|
end
|
92
92
|
|
93
93
|
it "should validate the data" do
|
94
94
|
@loader.should_receive(:valid?).and_return(true)
|
95
|
-
@loader.load_data @valid_data
|
95
|
+
@loader.send(:load_data, @valid_data)
|
96
96
|
end
|
97
97
|
|
98
98
|
it "should load it in redis" do
|
99
|
-
@loader.load_data @valid_data
|
99
|
+
@loader.send(:load_data, @valid_data)
|
100
100
|
@loader.redis.llen(@loader.key).should be == 2
|
101
101
|
end
|
102
|
+
|
103
|
+
it "should load via a tmp key to ensure no downtime" do
|
104
|
+
@loader.should_receive(:move)
|
105
|
+
@loader.send(:load_data, @valid_data)
|
106
|
+
@loader.redis.get(@loader.key).should be_nil
|
107
|
+
@loader.redis.llen(@loader.tmp_key).should be == 2
|
108
|
+
end
|
102
109
|
end
|
103
110
|
|
104
111
|
context "when given invalid data" do
|
105
112
|
it "should raise an error" do
|
106
113
|
@loader.should_receive(:valid?).and_return(false)
|
107
|
-
-> { @loader.load_data @valid_data }.should raise_error(ArgumentError)
|
114
|
+
-> { @loader.send(:load_data, @valid_data) }.should raise_error(ArgumentError)
|
108
115
|
end
|
109
116
|
end
|
110
117
|
|
111
118
|
context "when given anything but an array" do
|
112
119
|
it "should raise an error" do
|
113
|
-
-> { @loader.load_data :rubbish }.should raise_error(ArgumentError)
|
120
|
+
-> { @loader.send(:load_data, :rubbish) }.should raise_error(ArgumentError)
|
114
121
|
end
|
115
122
|
end
|
116
123
|
end
|
117
124
|
|
118
125
|
describe "#parse" do
|
119
126
|
it "should parse valid csv data" do
|
120
|
-
@loader.parse
|
127
|
+
@loader.send(:parse, @csv).should be == @valid_data
|
121
128
|
end
|
122
129
|
|
123
130
|
it "should raise an error for invalid csv data" do
|
124
|
-
-> { @loader.parse
|
131
|
+
-> { @loader.send(:parse, '"foo",","#') }.should raise_error(CSV::MalformedCSVError)
|
125
132
|
end
|
126
133
|
|
127
134
|
it "should handle ipv6 data" do
|
@@ -129,39 +136,39 @@ describe Trifle::Loader do
|
|
129
136
|
"2c0f:ffe8::", "2c0f:ffe8:ffff:ffff:ffff:ffff:ffff:ffff", "58569106662796955307479896348547874816", "58569106742025117821744233942091825151", "NG", "Nigeria"
|
130
137
|
"2c0f:fff0::", "2c0f:fff0:ffff:ffff:ffff:ffff:ffff:ffff", "58569107296622255421594597096899477504", "58569107375850417935858934690443427839", "NG", "Nigeria"
|
131
138
|
CSV
|
132
|
-
-> { @loader.parse
|
139
|
+
-> { @loader.send(:parse, @ipv6csv) }.should_not raise_error
|
133
140
|
end
|
134
141
|
end
|
135
142
|
|
136
143
|
describe "#sort" do
|
137
144
|
it "should sort the data" do
|
138
|
-
@loader.sort
|
145
|
+
@loader.send(:sort, @valid_data.reverse).should be == @valid_data
|
139
146
|
end
|
140
147
|
end
|
141
148
|
|
142
149
|
|
143
150
|
describe "#valid?" do
|
144
151
|
it "should mark valid data as such" do
|
145
|
-
@loader.valid
|
152
|
+
@loader.send(:valid?, @valid_data).should be_true
|
146
153
|
end
|
147
154
|
|
148
155
|
it "should mark invalid data as such" do
|
149
156
|
invalid_data = []
|
150
|
-
@loader.valid
|
157
|
+
@loader.send(:valid?, invalid_data).should be_false
|
151
158
|
invalid_data = [
|
152
159
|
["223.255.254.0","223.255.254.255","not_a_number","3758096127","SG","Singapore"]
|
153
160
|
]
|
154
|
-
@loader.valid
|
161
|
+
@loader.send(:valid?, invalid_data).should be_false
|
155
162
|
invalid_data = [
|
156
163
|
["223.255.254.0","223.255.254.255","3758095872","not_a_number","SG","Singapore"]
|
157
164
|
]
|
158
|
-
@loader.valid
|
165
|
+
@loader.send(:valid?, invalid_data).should be_false
|
159
166
|
end
|
160
167
|
end
|
161
168
|
|
162
169
|
describe "#clear" do
|
163
170
|
it "should clear existing data" do
|
164
|
-
@loader.load_data @valid_data
|
171
|
+
@loader.send(:load_data, @valid_data)
|
165
172
|
@loader.clear
|
166
173
|
@loader.redis.llen(@loader.key).should be == 0
|
167
174
|
end
|
data/trifle.gemspec
CHANGED
@@ -19,7 +19,8 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
21
|
s.add_development_dependency 'rspec'
|
22
|
-
s.add_development_dependency 'rujitsu'
|
23
22
|
s.add_development_dependency 'active_support'
|
24
23
|
s.add_development_dependency "fakeredis", "~> 0.3.0"
|
24
|
+
|
25
|
+
s.add_dependency 'redis'
|
25
26
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trifle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-06-
|
12
|
+
date: 2012-06-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70133403697660 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70133403697660
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
27
|
-
requirement: &
|
26
|
+
name: active_support
|
27
|
+
requirement: &70133403697060 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,29 +32,29 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70133403697060
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
38
|
-
requirement: &
|
37
|
+
name: fakeredis
|
38
|
+
requirement: &70133403696340 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
|
-
- -
|
41
|
+
- - ~>
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version:
|
43
|
+
version: 0.3.0
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70133403696340
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
49
|
-
requirement: &
|
48
|
+
name: redis
|
49
|
+
requirement: &70133403695580 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ! '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0
|
55
|
-
type: :
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70133403695580
|
58
58
|
description: Stores the GeoIP databases in Redis and gives it a simple way to lookup
|
59
59
|
IPs and map them to countries
|
60
60
|
email:
|