extraloop-redis-storage 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,6 @@
1
+ == 0.0.11 / 2012-03-08
2
+ * Improved Ohm::Storage::IdKey module
3
+
1
4
  == 0.0.10 / 2012-03-06
2
5
  * Implemented non-numeric record ids for ExtraLoop::Storage::Record
3
6
 
@@ -33,7 +33,7 @@ require "support"
33
33
 
34
34
  module ExtraLoop
35
35
  module Storage
36
- VERSION ||= "0.0.10"
36
+ VERSION ||= "0.0.11"
37
37
 
38
38
  def self.connect(*args)
39
39
  Ohm.connect(*args)
@@ -4,12 +4,48 @@
4
4
  # keys
5
5
  #
6
6
  module ExtraLoop::Storage::IdKey
7
- # Public: A regex to be used in order to valid the key string format
7
+
8
+ # Internal: A regex to be used in order to valid the key string format
8
9
  ID_FORMAT = /^[a-zA-Z\-\_]+$/
10
+ # Internal: The separator to be used when record id keys.
11
+ KEY_SEPARATOR = ':'
9
12
 
13
+ # Public: Turns 'Ohm::Model::[]' into a powerful method which behaves somehow like Rails' "find_or_create"/"find_or_update".
14
+ #
15
+ # If the record does not exist, it will be created (or just initialised) with the provided attribute values. If the record does exist already, and
16
+ # no attributes are provided, the record will be fetched and returned. If the record exists and the attribute hash is provided, this method will try
17
+ # to update it with the provided attribute values.
18
+ #
19
+ # TODO: consider privatising/removing the #save and the #create method for models extended with this module.
20
+ #
21
+ #
22
+ # id - An alphanumeric id string, which will be used generate the key string to store the record into Redis.
23
+ # attributes - An hash of record attributes.
24
+ #
25
+ #
26
+ # Examples
27
+ #
28
+ # user = User['bob', {:full_name => 'Robert Plancton', :website => 'http://planktonic.net'}]
29
+ # user.id
30
+ #
31
+ # => 'User:bob'
32
+ #
33
+ # User['bob'] == user
34
+ #
35
+ # => true
36
+ #
37
+ # user = User['bob', {:website => 'http://planctoinic.net' }]
38
+ # user.website
39
+ #
40
+ # => 'http://planctoinic.net'
41
+ #
42
+ #
43
+ # Returns a Ohm record.
44
+ # Raises an 'ArgumentError' if the provided id string does not match the ID_FORMAT (e.g. if it contains non-alphanumeric characters').
45
+ #
10
46
  def [](id, attributes={})
11
47
  raise ArgumentError.new "Invalid id '#{id}'" unless id =~ ID_FORMAT
12
- id = prefix(id.to_s)
48
+ id = prefix(id.to_s, attributes)
13
49
 
14
50
  if record = super(id)
15
51
  record.update(attributes) if attributes.any?
@@ -19,8 +55,40 @@ module ExtraLoop::Storage::IdKey
19
55
  end
20
56
  end
21
57
 
22
- def prefix(id)
23
- [self.name, id].join(':')
58
+ # Public: Prefixes the provided record id with a namespace.
59
+ #
60
+ # While default behviour is to prepend the record's model class name to id string, it is possible to override this method
61
+ # so that the generated record id key will include other attributes (see example below).
62
+ #
63
+ # id - The record id.
64
+ # attributes - The attributes hash
65
+ #
66
+ # Examples
67
+ #
68
+ # # Overrides the default prefix method so that the 'locale' attribute will be included as part of the
69
+ # # record id prefix.
70
+ #
71
+ # include ExtraLoop::Storage
72
+ #
73
+ # class Entry < Record
74
+ # extend IdKey
75
+ # attribute :locale
76
+ #
77
+ # def self::prefix(id, attrs={})
78
+ # [self.name, attrs.fetch(:locale, 'en'), id]).join(IdKey::KEY_SEPARATOR)
79
+ # end
80
+ # end
81
+ #
82
+ # entry = Entry['Hello-world']
83
+ # entry.id
84
+ #
85
+ # => 'Entry:en:Hello-world'
86
+ #
87
+ # Returns the record id key.
88
+ #
89
+
90
+ def prefix(id, attributes={})
91
+ [self.name, id].join(KEY_SEPARATOR)
24
92
  end
25
93
 
26
94
  end
@@ -4,15 +4,19 @@
4
4
  class ExtraLoop::Storage::Model < Ohm::Model
5
5
  extend ExtraLoop::Storage::IdKey
6
6
 
7
-
8
7
  # Internal: Overrides the default id key handling function and
9
- # replaces it with a validity check
8
+ # replaces it with a validity check.
9
+ #
10
+ # id - The record id.
11
+ # attributes - The record attributes (defaults to an empty array)
12
+ #
13
+ #
10
14
  #
11
15
  # Returns the model name
12
16
  # Raises an ArgumentError if the id string is not capitalized
13
17
  #
14
18
 
15
- def self.prefix(id)
19
+ def self.prefix(id, attributes={})
16
20
  raise ArgumentError.new "model Id should be capitalized" unless id.to_s[0] =~ /[A-Z]/
17
21
  id
18
22
  end
@@ -75,4 +75,23 @@ describe Entry do
75
75
  end
76
76
  end
77
77
  end
78
+
79
+ describe "::create" do
80
+
81
+ end
82
+
83
+ describe "#save" do
84
+ context "with an entry initialized through the '[]' method" do
85
+ before do
86
+ @entry = Entry['hello-test', {session: session}]
87
+ @entry.foo = 'test'
88
+ @entry.save
89
+ end
90
+
91
+ it "should retain the initial id when calling save" do
92
+ @entry.id.should eql('Entry:hello-test')
93
+ Entry['hello-test'].foo.should eql('test')
94
+ end
95
+ end
96
+ end
78
97
  end
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.10
4
+ version: 0.0.11
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-06 00:00:00.000000000Z
12
+ date: 2012-04-08 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: extraloop
16
- requirement: &27209960 !ruby/object:Gem::Requirement
16
+ requirement: &17492340 !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: *27209960
24
+ version_requirements: *17492340
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: ohm
27
- requirement: &27188400 !ruby/object:Gem::Requirement
27
+ requirement: &17491180 !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: *27188400
35
+ version_requirements: *17491180
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: ohm-contrib
38
- requirement: &27187720 !ruby/object:Gem::Requirement
38
+ requirement: &17490000 !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: *27187720
46
+ version_requirements: *17490000
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: thor
49
- requirement: &27187120 !ruby/object:Gem::Requirement
49
+ requirement: &17489000 !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: *27187120
57
+ version_requirements: *17489000
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rake
60
- requirement: &27186360 !ruby/object:Gem::Requirement
60
+ requirement: &17366960 !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: *27186360
68
+ version_requirements: *17366960
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
- requirement: &27185080 !ruby/object:Gem::Requirement
71
+ requirement: &17365700 !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: *27185080
79
+ version_requirements: *17365700
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: guard-rspec
82
- requirement: &27184480 !ruby/object:Gem::Requirement
82
+ requirement: &17365120 !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: *27184480
90
+ version_requirements: *17365120
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rr
93
- requirement: &27183780 !ruby/object:Gem::Requirement
93
+ requirement: &17363920 !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: *27183780
101
+ version_requirements: *17363920
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: pry
104
- requirement: &27183060 !ruby/object:Gem::Requirement
104
+ requirement: &17362540 !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: *27183060
112
+ version_requirements: *17362540
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: fusion_tables
115
- requirement: &27182200 !ruby/object:Gem::Requirement
115
+ requirement: &17361520 !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: *27182200
123
+ version_requirements: *17361520
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: geocoder
126
- requirement: &27181360 !ruby/object:Gem::Requirement
126
+ requirement: &17360980 !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: *27181360
134
+ version_requirements: *17360980
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
@@ -182,7 +182,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
182
182
  version: '0'
183
183
  segments:
184
184
  - 0
185
- hash: -650301633234086878
185
+ hash: -2994180190336763644
186
186
  required_rubygems_version: !ruby/object:Gem::Requirement
187
187
  none: false
188
188
  requirements:
@@ -191,7 +191,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
191
191
  version: '0'
192
192
  requirements: []
193
193
  rubyforge_project: extraloop-redis-storage
194
- rubygems_version: 1.8.10
194
+ rubygems_version: 1.8.17
195
195
  signing_key:
196
196
  specification_version: 2
197
197
  summary: Redis storage for Extraloop.