extraloop-redis-storage 0.0.9 → 0.0.10
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/History.txt +3 -0
- data/lib/extraloop/redis-storage.rb +2 -1
- data/lib/extraloop/redis-storage/id_key.rb +26 -0
- data/lib/extraloop/redis-storage/model.rb +11 -2
- data/spec/id_key_spec.rb +78 -0
- data/spec/model_spec.rb +4 -4
- data/spec/spec_helper.rb +5 -0
- metadata +29 -28
data/History.txt
CHANGED
@@ -33,7 +33,7 @@ require "support"
|
|
33
33
|
|
34
34
|
module ExtraLoop
|
35
35
|
module Storage
|
36
|
-
VERSION ||= "0.0.
|
36
|
+
VERSION ||= "0.0.10"
|
37
37
|
|
38
38
|
def self.connect(*args)
|
39
39
|
Ohm.connect(*args)
|
@@ -54,6 +54,7 @@ base_path << "/redis-storage"
|
|
54
54
|
ExtraLoop::Storage.autoload :Record, "#{base_path}/record.rb"
|
55
55
|
ExtraLoop::Storage.autoload :ScrapingSession, "#{base_path}/scraping_session.rb"
|
56
56
|
ExtraLoop::Storage.autoload :Model, "#{base_path}/model.rb"
|
57
|
+
ExtraLoop::Storage.autoload :IdKey, "#{base_path}/id_key.rb"
|
57
58
|
ExtraLoop::Storage.autoload :DatasetFactory, "#{base_path}/dataset_factory.rb"
|
58
59
|
ExtraLoop::Storage.autoload :RemoteStore, "#{base_path}/remote_store.rb"
|
59
60
|
ExtraLoop::Storage.autoload :FusionTables, "#{base_path}/remote_store/fusion_tables.rb"
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# Public: Provides a convinient mechanism to override
|
2
|
+
# Ohm's default id assignment mechanism and replace
|
3
|
+
# numeric, auto-increment ids with more readable, unique
|
4
|
+
# keys
|
5
|
+
#
|
6
|
+
module ExtraLoop::Storage::IdKey
|
7
|
+
# Public: A regex to be used in order to valid the key string format
|
8
|
+
ID_FORMAT = /^[a-zA-Z\-\_]+$/
|
9
|
+
|
10
|
+
def [](id, attributes={})
|
11
|
+
raise ArgumentError.new "Invalid id '#{id}'" unless id =~ ID_FORMAT
|
12
|
+
id = prefix(id.to_s)
|
13
|
+
|
14
|
+
if record = super(id)
|
15
|
+
record.update(attributes) if attributes.any?
|
16
|
+
record
|
17
|
+
else
|
18
|
+
create(attributes.merge(:id => id))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def prefix(id)
|
23
|
+
[self.name, id].join(':')
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -2,10 +2,19 @@
|
|
2
2
|
# are associated to a Scraping session object.
|
3
3
|
#
|
4
4
|
class ExtraLoop::Storage::Model < Ohm::Model
|
5
|
+
extend ExtraLoop::Storage::IdKey
|
5
6
|
|
6
|
-
|
7
|
+
|
8
|
+
# Internal: Overrides the default id key handling function and
|
9
|
+
# replaces it with a validity check
|
10
|
+
#
|
11
|
+
# Returns the model name
|
12
|
+
# Raises an ArgumentError if the id string is not capitalized
|
13
|
+
#
|
14
|
+
|
15
|
+
def self.prefix(id)
|
7
16
|
raise ArgumentError.new "model Id should be capitalized" unless id.to_s[0] =~ /[A-Z]/
|
8
|
-
|
17
|
+
id
|
9
18
|
end
|
10
19
|
|
11
20
|
def to_hash
|
data/spec/id_key_spec.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
include ExtraLoop::Storage
|
3
|
+
|
4
|
+
class Entry < Record
|
5
|
+
extend IdKey
|
6
|
+
attribute :name
|
7
|
+
attribute :foo
|
8
|
+
index :foo
|
9
|
+
end
|
10
|
+
|
11
|
+
def session
|
12
|
+
ScrapingSession.create(
|
13
|
+
:title => 'test',
|
14
|
+
:model => Model[:Entry],
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
describe Entry do
|
19
|
+
describe "::[]()" do
|
20
|
+
|
21
|
+
context "with invalid key" do
|
22
|
+
it "should raise an error when the id key contains spaces" do
|
23
|
+
lambda { Entry['hello world'] }.should raise_error(ArgumentError)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "with a symbol as key" do
|
28
|
+
before { @entry = Entry['foo', {:session => session, :foo => 'foo' } ] }
|
29
|
+
|
30
|
+
it "should cast the id as a string" do
|
31
|
+
@entry.id.should eql('Entry:foo')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "without arguments" do
|
36
|
+
before do
|
37
|
+
@entry = Entry['foo']
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should initialize a record with id 'entry:foo'" do
|
41
|
+
@entry.id.should eql('Entry:foo')
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should initialize the same record" do
|
45
|
+
Entry['foo'].should eql(@entry)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "with an attribute hash as its second argument" do
|
50
|
+
before do
|
51
|
+
@entry = Entry['foo', {:session => session, :foo => 'foo' }]
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should persist the record" do
|
55
|
+
@entry.valid?.should be_true
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should assign a value to the 'foo' attribute " do
|
59
|
+
@entry.foo.should eql('foo')
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should not create duplicates" do
|
63
|
+
10.times do
|
64
|
+
Entry['foo', {:session => session, :foo => 'foo' } ]
|
65
|
+
end
|
66
|
+
|
67
|
+
Entry.find(:foo => 'foo').should include(@entry)
|
68
|
+
Entry.find(:foo => 'foo').should have(1).item
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should update the record with the hash content" do
|
72
|
+
Entry['foo', {'foo' => 'bar'}]
|
73
|
+
Entry['foo'].foo.should eql('bar')
|
74
|
+
Entry.all.map(&:id).grep(/foo$/).should have(1).item
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/spec/model_spec.rb
CHANGED
@@ -6,16 +6,16 @@ describe ExtraLoop::Storage::Model do
|
|
6
6
|
@model = ExtraLoop::Storage::Model[:My_model]
|
7
7
|
end
|
8
8
|
|
9
|
-
it "should create a record
|
10
|
-
@model.should eql(
|
9
|
+
it "should create a record with 'My_model' as an id" do
|
10
|
+
@model.id.should eql('My_model')
|
11
11
|
end
|
12
12
|
|
13
13
|
it "should throw an argument error if the model id is not capitalized" do
|
14
14
|
lambda { ExtraLoop::Storage::Model[:my_model] }.should raise_error(ArgumentError)
|
15
15
|
end
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
it "should throw an argument error if the model id contains spaces" do
|
18
|
+
lambda { ExtraLoop::Storage::Model['Bla bla'] }.should raise_error(ArgumentError)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: extraloop-redis-storage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
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-04-
|
12
|
+
date: 2012-04-06 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: extraloop
|
16
|
-
requirement: &
|
16
|
+
requirement: &27209960 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.0.3
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *27209960
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: ohm
|
27
|
-
requirement: &
|
27
|
+
requirement: &27188400 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 0.1.3
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *27188400
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: ohm-contrib
|
38
|
-
requirement: &
|
38
|
+
requirement: &27187720 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 0.1.2
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *27187720
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: thor
|
49
|
-
requirement: &
|
49
|
+
requirement: &27187120 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - =
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 0.14.6
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *27187120
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rake
|
60
|
-
requirement: &
|
60
|
+
requirement: &27186360 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *27186360
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
|
-
requirement: &
|
71
|
+
requirement: &27185080 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: 2.7.0
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *27185080
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: guard-rspec
|
82
|
-
requirement: &
|
82
|
+
requirement: &27184480 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ~>
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: 0.7.0
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *27184480
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: rr
|
93
|
-
requirement: &
|
93
|
+
requirement: &27183780 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ~>
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: 1.0.4
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *27183780
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: pry
|
104
|
-
requirement: &
|
104
|
+
requirement: &27183060 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ~>
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: 0.9.7.4
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *27183060
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: fusion_tables
|
115
|
-
requirement: &
|
115
|
+
requirement: &27182200 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ~>
|
@@ -120,10 +120,10 @@ dependencies:
|
|
120
120
|
version: 0.3.1
|
121
121
|
type: :development
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *27182200
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: geocoder
|
126
|
-
requirement: &
|
126
|
+
requirement: &27181360 !ruby/object:Gem::Requirement
|
127
127
|
none: false
|
128
128
|
requirements:
|
129
129
|
- - ~>
|
@@ -131,7 +131,7 @@ dependencies:
|
|
131
131
|
version: 1.1.1
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
|
-
version_requirements: *
|
134
|
+
version_requirements: *27181360
|
135
135
|
description: Redis-based Persistence layer for the ExtraLoop data extraction toolkit.
|
136
136
|
Includes a convinent command line tool allowing to list, filter, delete, and export
|
137
137
|
harvested datasets
|
@@ -149,6 +149,7 @@ files:
|
|
149
149
|
- examples/lib/scrapers/amazon_review_scraper.rb
|
150
150
|
- lib/extraloop/redis-storage.rb
|
151
151
|
- lib/extraloop/redis-storage/dataset_factory.rb
|
152
|
+
- lib/extraloop/redis-storage/id_key.rb
|
152
153
|
- lib/extraloop/redis-storage/model.rb
|
153
154
|
- lib/extraloop/redis-storage/record.rb
|
154
155
|
- lib/extraloop/redis-storage/remote_store.rb
|
@@ -158,14 +159,14 @@ files:
|
|
158
159
|
- lib/extraloop/support.rb
|
159
160
|
- spec/dataset_factory_spec.rb
|
160
161
|
- spec/fusion_tables_spec.rb
|
162
|
+
- spec/id_key_spec.rb
|
161
163
|
- spec/model_spec.rb
|
162
164
|
- spec/record_spec.rb
|
163
165
|
- spec/remote_store_spec.rb
|
164
166
|
- spec/scraper_base_spec.rb
|
165
167
|
- spec/scraping_session_spec.rb
|
166
168
|
- spec/spec_helper.rb
|
167
|
-
-
|
168
|
-
YmluL2V4dHJhbG9vcA==
|
169
|
+
- bin/extraloop
|
169
170
|
homepage: http://github.com/afiore/extraloop-redis-storage
|
170
171
|
licenses: []
|
171
172
|
post_install_message:
|
@@ -181,7 +182,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
181
182
|
version: '0'
|
182
183
|
segments:
|
183
184
|
- 0
|
184
|
-
hash:
|
185
|
+
hash: -650301633234086878
|
185
186
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
186
187
|
none: false
|
187
188
|
requirements:
|
@@ -190,7 +191,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
190
191
|
version: '0'
|
191
192
|
requirements: []
|
192
193
|
rubyforge_project: extraloop-redis-storage
|
193
|
-
rubygems_version: 1.8.
|
194
|
+
rubygems_version: 1.8.10
|
194
195
|
signing_key:
|
195
196
|
specification_version: 2
|
196
197
|
summary: Redis storage for Extraloop.
|