extraloop-redis-storage 0.0.9 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,6 @@
1
+ == 0.0.10 / 2012-03-06
2
+ * Implemented non-numeric record ids for ExtraLoop::Storage::Record
3
+
1
4
  == 0.0.9 / 2012-03-04
2
5
  * Removed Object#try method
3
6
 
@@ -33,7 +33,7 @@ require "support"
33
33
 
34
34
  module ExtraLoop
35
35
  module Storage
36
- VERSION ||= "0.0.9"
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
- def self.[](id)
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
- super(id) || create(:id => id)
17
+ id
9
18
  end
10
19
 
11
20
  def to_hash
@@ -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 if a model with id 'my_model' does not exist" do
10
- @model.should eql(ExtraLoop::Storage::Model[:My_model])
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
- after do
18
- Ohm.flush
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
@@ -6,6 +6,11 @@ require "redis-storage"
6
6
 
7
7
  RSpec.configure do |config|
8
8
  config.mock_with :rr
9
+
10
+ # flush db content after each test run
11
+ config.after(:all) do
12
+ Ohm.flush
13
+ end
9
14
  end
10
15
 
11
16
  ENV['REDIS_URL']= "redis://127.0.0.1:6379/7"
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.9
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-03 00:00:00.000000000 Z
12
+ date: 2012-04-06 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: extraloop
16
- requirement: &6431000 !ruby/object:Gem::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: *6431000
24
+ version_requirements: *27209960
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: ohm
27
- requirement: &6429820 !ruby/object:Gem::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: *6429820
35
+ version_requirements: *27188400
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: ohm-contrib
38
- requirement: &6429120 !ruby/object:Gem::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: *6429120
46
+ version_requirements: *27187720
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: thor
49
- requirement: &6428420 !ruby/object:Gem::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: *6428420
57
+ version_requirements: *27187120
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rake
60
- requirement: &6427680 !ruby/object:Gem::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: *6427680
68
+ version_requirements: *27186360
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
- requirement: &6426480 !ruby/object:Gem::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: *6426480
79
+ version_requirements: *27185080
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: guard-rspec
82
- requirement: &6425200 !ruby/object:Gem::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: *6425200
90
+ version_requirements: *27184480
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rr
93
- requirement: &6423760 !ruby/object:Gem::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: *6423760
101
+ version_requirements: *27183780
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: pry
104
- requirement: &6442240 !ruby/object:Gem::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: *6442240
112
+ version_requirements: *27183060
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: fusion_tables
115
- requirement: &6441640 !ruby/object:Gem::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: *6441640
123
+ version_requirements: *27182200
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: geocoder
126
- requirement: &6441140 !ruby/object:Gem::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: *6441140
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
- - !binary |-
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: 125904011551415212
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.17
194
+ rubygems_version: 1.8.10
194
195
  signing_key:
195
196
  specification_version: 2
196
197
  summary: Redis storage for Extraloop.