protobuf-activerecord 1.1.0 → 1.1.1
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 +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
|