protobuf-activerecord 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +0 -1
- data/README.md +54 -9
- data/lib/protobuf-activerecord.rb +4 -4
- data/lib/protobuf/activerecord/protoable.rb +17 -0
- data/lib/{protoable → protobuf/activerecord/protoable}/convert.rb +0 -0
- data/lib/{protoable → protobuf/activerecord/protoable}/errors.rb +0 -0
- data/lib/{protoable → protobuf/activerecord/protoable}/fields.rb +0 -0
- data/lib/{protoable → protobuf/activerecord/protoable}/persistence.rb +0 -0
- data/lib/{protoable → protobuf/activerecord/protoable}/scope.rb +0 -0
- data/lib/{protoable → protobuf/activerecord/protoable}/serialization.rb +0 -0
- data/lib/protobuf/activerecord/protobuf_ext/message.rb +16 -0
- data/lib/protobuf/activerecord/version.rb +1 -1
- metadata +12 -12
- data/lib/protoable.rb +0 -17
- data/lib/protobuf_ext/message.rb +0 -12
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -102,11 +102,11 @@ end
|
|
102
102
|
|
103
103
|
Once the desired protobuf message has been specified, Protoable adds a `to_proto` method to the model. Calling `to_proto` will automatically convert the model to the specified protobuf message using the same attribute to field mapping it uses to create and update objects from protobuf messages.
|
104
104
|
|
105
|
-
### Field &
|
105
|
+
### Field & attribute converters
|
106
106
|
|
107
|
-
Protoable will handle regular field conversions out of the box, but for those times when custom conversions are needed, they can be defined with the `convert_field` and `
|
107
|
+
Protoable will handle regular field conversions out of the box, but for those times when custom conversions are needed, they can be defined with the `convert_field` and `protoable_attribute` methods. Field converters are used when creating or updating objects from a protobuf message and attribute converters are used when serializing objects to protobuf messages.
|
108
108
|
|
109
|
-
`convert_field` and `
|
109
|
+
`convert_field` and `protoable_attribute` both take the name of the field/attribute being converted and a method name or callable (lambda or proc). when converting that field, calls the given callable, passing it the value of the field being converted.
|
110
110
|
|
111
111
|
**Converting fields**
|
112
112
|
|
@@ -123,21 +123,21 @@ class User < ActiveRecord::Base
|
|
123
123
|
end
|
124
124
|
```
|
125
125
|
|
126
|
-
**Converting
|
126
|
+
**Converting attributes**
|
127
127
|
|
128
128
|
```Ruby
|
129
129
|
class User < ActiveRecord::Base
|
130
130
|
include Protoable
|
131
131
|
|
132
132
|
# Calls the lambda when serializing objects to protobuf messages, passing it
|
133
|
-
# the value of the status
|
134
|
-
|
133
|
+
# the value of the status attribute.
|
134
|
+
protoable_attribute :status, lambda { |attribute_value| attribute_value_.to_s }
|
135
135
|
end
|
136
136
|
```
|
137
137
|
|
138
|
-
###
|
138
|
+
### Attribute transformers
|
139
139
|
|
140
|
-
Protoable handles mapping protobuf message fields to object attributes, but what happens when an attribute doesn't have a matching field? Using the `
|
140
|
+
Protoable handles mapping protobuf message fields to object attributes, but what happens when an attribute doesn't have a matching field? Using the `attribute_from_proto` method, you can define custom attribute transformations. Simply call `attribute_from_prot`, passing it the name of the attribute and a method name or callable (lambda or proc). When creating or updating objects, Protoable will call the transformer, passing it the protobuf message.
|
141
141
|
|
142
142
|
```Ruby
|
143
143
|
class User < ActiveRecord::Base
|
@@ -145,9 +145,54 @@ class User < ActiveRecord::Base
|
|
145
145
|
|
146
146
|
# Calls the lambda when creating/updating objects, passing it the protobuf
|
147
147
|
# message.
|
148
|
-
|
148
|
+
attribute_from_proto :account_id, lambda { |protobuf_message| # Some custom transformation... }
|
149
149
|
end
|
150
150
|
```
|
151
|
+
#### Searching
|
152
|
+
|
153
|
+
Protoable's `search_scope` method takes the protobuf message and builds ARel scopes from it.
|
154
|
+
|
155
|
+
Before you can use `search_scope`, you'll need to tell Protoable which fields should be searchable and what scope should be used to search with that field.
|
156
|
+
|
157
|
+
Consider this protobuf message:
|
158
|
+
|
159
|
+
```
|
160
|
+
message UserSearchRequest {
|
161
|
+
repeated string guid = 1;
|
162
|
+
repeated string name = 2;
|
163
|
+
repeated string email = 3;
|
164
|
+
}
|
165
|
+
```
|
166
|
+
|
167
|
+
To make the `name` field searchable, use the `field_scope` method:
|
168
|
+
|
169
|
+
```Ruby
|
170
|
+
class User < ActiveRecord::Base
|
171
|
+
include Protoable
|
172
|
+
|
173
|
+
scope :by_name, lambda { |*values| where(:name => values) }
|
174
|
+
|
175
|
+
field_scope :name, :by_name
|
176
|
+
end
|
177
|
+
```
|
178
|
+
|
179
|
+
This tells Protoable that the name field should be searchable and that the scope with the given name should be used to build the search scope.
|
180
|
+
|
181
|
+
Now that your class is configured with some searchable fields, you can use the `search_scope` method to build ARel scopes from a protobuf message.
|
182
|
+
|
183
|
+
`search_scope` is chainable just like regular ARel scopes. It takes a protobuf messages and will build search scopes from any searchable fields that have values.
|
184
|
+
|
185
|
+
Picking up our User class again:
|
186
|
+
|
187
|
+
```Ruby
|
188
|
+
# Build a search scope from the given protobuf message
|
189
|
+
User.search_scope(request)
|
190
|
+
|
191
|
+
# It's chainable too
|
192
|
+
User.limit(10).search_scope(request)
|
193
|
+
```
|
194
|
+
|
195
|
+
Protoable also provides some aliases for the `search_scope` method in the event that you'd like something a little more descriptive. `by_fields`, `from_proto`, and `scope_from_proto` are all aliases of `search_scope`.
|
151
196
|
|
152
197
|
## Contributing
|
153
198
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'protobuf/activerecord/protoable/convert'
|
2
|
+
require 'protobuf/activerecord/protoable/errors'
|
3
|
+
require 'protobuf/activerecord/protoable/fields'
|
4
|
+
require 'protobuf/activerecord/protoable/persistence'
|
5
|
+
require 'protobuf/activerecord/protoable/scope'
|
6
|
+
require 'protobuf/activerecord/protoable/serialization'
|
7
|
+
|
8
|
+
module Protoable
|
9
|
+
def self.included(klass)
|
10
|
+
klass.extend Protoable::Fields
|
11
|
+
klass.extend Protoable::Scope
|
12
|
+
|
13
|
+
klass.__send__(:include, Protoable::Convert)
|
14
|
+
klass.__send__(:include, Protoable::Persistence)
|
15
|
+
klass.__send__(:include, Protoable::Serialization)
|
16
|
+
end
|
17
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'protobuf'
|
2
|
+
|
3
|
+
class Protobuf::Message
|
4
|
+
unless method_defined?(:respond_to_and_has?)
|
5
|
+
def respond_to_and_has?(key)
|
6
|
+
self.respond_to?(key) && self.has_field?(key)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
unless method_defined?(:respond_to_and_has_and_present?)
|
11
|
+
def respond_to_and_has_and_present?(key)
|
12
|
+
self.respond_to_and_has?(key) &&
|
13
|
+
(self.__send__(key).present? || [true, false].include?(self.__send__(key)))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: protobuf-activerecord
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -202,16 +202,16 @@ files:
|
|
202
202
|
- LICENSE.txt
|
203
203
|
- README.md
|
204
204
|
- Rakefile
|
205
|
-
- lib/protoable.rb
|
206
|
-
- lib/protoable/convert.rb
|
207
|
-
- lib/protoable/errors.rb
|
208
|
-
- lib/protoable/fields.rb
|
209
|
-
- lib/protoable/persistence.rb
|
210
|
-
- lib/protoable/scope.rb
|
211
|
-
- lib/protoable/serialization.rb
|
212
205
|
- lib/protobuf-activerecord.rb
|
206
|
+
- lib/protobuf/activerecord/protoable.rb
|
207
|
+
- lib/protobuf/activerecord/protoable/convert.rb
|
208
|
+
- lib/protobuf/activerecord/protoable/errors.rb
|
209
|
+
- lib/protobuf/activerecord/protoable/fields.rb
|
210
|
+
- lib/protobuf/activerecord/protoable/persistence.rb
|
211
|
+
- lib/protobuf/activerecord/protoable/scope.rb
|
212
|
+
- lib/protobuf/activerecord/protoable/serialization.rb
|
213
|
+
- lib/protobuf/activerecord/protobuf_ext/message.rb
|
213
214
|
- lib/protobuf/activerecord/version.rb
|
214
|
-
- lib/protobuf_ext/message.rb
|
215
215
|
- protobuf-activerecord.gemspec
|
216
216
|
- spec/protoable/convert_spec.rb
|
217
217
|
- spec/protoable/fields_spec.rb
|
@@ -240,7 +240,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
240
240
|
version: '0'
|
241
241
|
segments:
|
242
242
|
- 0
|
243
|
-
hash:
|
243
|
+
hash: 471675617945359118
|
244
244
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
245
245
|
none: false
|
246
246
|
requirements:
|
@@ -249,7 +249,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
249
249
|
version: '0'
|
250
250
|
segments:
|
251
251
|
- 0
|
252
|
-
hash:
|
252
|
+
hash: 471675617945359118
|
253
253
|
requirements: []
|
254
254
|
rubyforge_project:
|
255
255
|
rubygems_version: 1.8.24
|
data/lib/protoable.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'protoable/convert'
|
2
|
-
require 'protoable/errors'
|
3
|
-
require 'protoable/fields'
|
4
|
-
require 'protoable/persistence'
|
5
|
-
require 'protoable/scope'
|
6
|
-
require 'protoable/serialization'
|
7
|
-
|
8
|
-
module Protoable
|
9
|
-
def self.included(klass)
|
10
|
-
klass.extend Protoable::Fields
|
11
|
-
klass.extend Protoable::Scope
|
12
|
-
|
13
|
-
klass.__send__(:include, Protoable::Convert)
|
14
|
-
klass.__send__(:include, Protoable::Persistence)
|
15
|
-
klass.__send__(:include, Protoable::Serialization)
|
16
|
-
end
|
17
|
-
end
|
data/lib/protobuf_ext/message.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
require 'protobuf'
|
2
|
-
|
3
|
-
class Protobuf::Message
|
4
|
-
def respond_to_and_has?(key)
|
5
|
-
self.respond_to?(key) && self.has_field?(key)
|
6
|
-
end
|
7
|
-
|
8
|
-
def respond_to_and_has_and_present?(key)
|
9
|
-
self.respond_to_and_has?(key) &&
|
10
|
-
(self.__send__(key).present? || [true, false].include?(self.__send__(key)))
|
11
|
-
end
|
12
|
-
end
|