active_remote 3.2.2 → 3.3.0
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.
- checksums.yaml +4 -4
- data/CHANGES.md +44 -0
- data/active_remote.gemspec +1 -0
- data/bin/benchmark +36 -0
- data/lib/active_remote/attribute_definition.rb +6 -2
- data/lib/active_remote/serializers/protobuf.rb +26 -18
- data/lib/active_remote/type.rb +35 -0
- data/lib/active_remote/type/registry.rb +45 -0
- data/lib/active_remote/version.rb +1 -1
- data/spec/support/models/typecasted_author.rb +3 -3
- metadata +20 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae8cf64c394e8f550a86ae5249454544d8a80c26f895f5358cd553a45d7d7a4c
|
4
|
+
data.tar.gz: 6ebd6029726c068e9f08ee8ec77e89309f9582c4b35f870b38edfd1b154a1138
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf3efedb46cd28754bc7ddad9c7c8a5b69483c8c68d77df57423ae34f60bccc98215a0239a920831ae92e1fab52fa2cd7e58a5788d0908df33569a75338d85f2
|
7
|
+
data.tar.gz: 553dc23127a1dd631ca176a427c08110295cbc128d38119eb4597fe520642b9ed700a41f3a629bdcc6de52883b8f411b1afe476e2d2050b23a7f24a129717afb
|
data/CHANGES.md
CHANGED
@@ -1,5 +1,49 @@
|
|
1
1
|
# ActiveRemote Changes
|
2
2
|
|
3
|
+
3.3.0
|
4
|
+
----------
|
5
|
+
|
6
|
+
- Add support for registering types that can be used to define attributes without using the existing `:type` or
|
7
|
+
`:typecaster` options `attribute :name, :string` [#69]
|
8
|
+
|
9
|
+
3.2.2
|
10
|
+
----------
|
11
|
+
|
12
|
+
- Speed up boolean typecasting [#67, @abrandoned]
|
13
|
+
|
14
|
+
3.2.1
|
15
|
+
----------
|
16
|
+
|
17
|
+
- Use `:remote_call` instead of of `rpc.execute` in persistence, search
|
18
|
+
|
19
|
+
3.2.0
|
20
|
+
----------
|
21
|
+
|
22
|
+
- Add ability to override default RPC endpoints [#66]
|
23
|
+
- Require Active Model 4.x to 5.1 for compatibility
|
24
|
+
|
25
|
+
3.1.3
|
26
|
+
----------
|
27
|
+
|
28
|
+
- Require Active Model 4.x for compatibility
|
29
|
+
- Cache and dup default attributes instead of building from scratch (4x speed boost on initialize) [#63, @film42]
|
30
|
+
|
31
|
+
3.1.2
|
32
|
+
----------
|
33
|
+
|
34
|
+
- Allow primary_key to be set on create [#61, @mattnichols]
|
35
|
+
- Change the behavior of DateTime types to gracefully handle invalid dates [#62, @brianstien]
|
36
|
+
|
37
|
+
3.1.1
|
38
|
+
----------
|
39
|
+
|
40
|
+
- Guard against undefined method errors in the Protobuf adapter [#59, @brianstien]
|
41
|
+
|
42
|
+
3.1.0
|
43
|
+
----------
|
44
|
+
|
45
|
+
- Bubble up the type of error given from Protobuf instead of a generic `ActiveRemoteError` [#58, @ryanbjones]
|
46
|
+
|
3
47
|
3.0.0
|
4
48
|
----------
|
5
49
|
|
data/active_remote.gemspec
CHANGED
data/bin/benchmark
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
|
5
|
+
require "active_remote"
|
6
|
+
require "benchmark/ips"
|
7
|
+
|
8
|
+
require "./spec/support/models/typecasted_author"
|
9
|
+
|
10
|
+
ATTRIBUTES = {
|
11
|
+
:guid => "0c030733-3b78-4587-b94b-5e0cf26497c5",
|
12
|
+
:name => "Charles Dickens",
|
13
|
+
:age => 68,
|
14
|
+
:birthday => "1812-02-07 00:00:00",
|
15
|
+
:writes_fiction => true,
|
16
|
+
:net_sales => 1_000_000.0
|
17
|
+
}
|
18
|
+
|
19
|
+
::Benchmark.ips do |x|
|
20
|
+
x.config(:time => 20, :warmup => 10)
|
21
|
+
x.report("initialize") do
|
22
|
+
::TypecastedAuthor.new(ATTRIBUTES)
|
23
|
+
end
|
24
|
+
|
25
|
+
x.report("instantiate") do
|
26
|
+
::TypecastedAuthor.instantiate(ATTRIBUTES)
|
27
|
+
end
|
28
|
+
|
29
|
+
x.report("init attributes") do
|
30
|
+
::TypecastedAuthor.new(ATTRIBUTES).attributes
|
31
|
+
end
|
32
|
+
|
33
|
+
x.report("inst attributes") do
|
34
|
+
::TypecastedAuthor.instantiate(ATTRIBUTES).attributes
|
35
|
+
end
|
36
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "active_remote/type"
|
2
|
+
|
1
3
|
module ActiveRemote
|
2
4
|
# Represents an attribute for reflection
|
3
5
|
#
|
@@ -47,15 +49,17 @@ module ActiveRemote
|
|
47
49
|
# AttributeDefinition.new(:amount)
|
48
50
|
#
|
49
51
|
# @param [Symbol, String, #to_sym] name attribute name
|
52
|
+
# @param [Symbol] type attribute type
|
50
53
|
# @param [Hash{Symbol => Object}] options attribute options
|
51
54
|
#
|
52
55
|
# @return [ActiveAttr::AttributeDefinition]
|
53
56
|
#
|
54
57
|
# @since 0.2.0
|
55
|
-
def initialize(name, options
|
58
|
+
def initialize(name, type = :unknown, **options)
|
56
59
|
raise TypeError, "can't convert #{name.class} into Symbol" unless name.respond_to? :to_sym
|
57
60
|
@name = name.to_sym
|
58
61
|
@options = options
|
62
|
+
@options[:typecaster] = ::ActiveRemote::Type.lookup(type) unless type == :unknown
|
59
63
|
|
60
64
|
if @options[:type]
|
61
65
|
typecaster = ::ActiveRemote::Typecasting::TYPECASTER_MAP[@options[:type]]
|
@@ -101,6 +105,6 @@ module ActiveRemote
|
|
101
105
|
|
102
106
|
# The attribute options
|
103
107
|
# @since 0.5.0
|
104
|
-
attr_reader :options
|
108
|
+
attr_reader :options, :type
|
105
109
|
end
|
106
110
|
end
|
@@ -1,28 +1,32 @@
|
|
1
|
-
require "active_remote/
|
1
|
+
require "active_remote/type"
|
2
2
|
|
3
3
|
module ActiveRemote
|
4
4
|
module Serializers
|
5
5
|
module Protobuf
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
|
-
|
9
|
-
::Protobuf::Field::BoolField
|
10
|
-
::Protobuf::Field::BytesField
|
11
|
-
::Protobuf::Field::DoubleField
|
12
|
-
::Protobuf::Field::Fixed32Field
|
13
|
-
::Protobuf::Field::Fixed64Field
|
14
|
-
::Protobuf::Field::FloatField
|
15
|
-
::Protobuf::Field::Int32Field
|
16
|
-
::Protobuf::Field::Int64Field
|
17
|
-
::Protobuf::Field::Sfixed32Field =>
|
18
|
-
::Protobuf::Field::Sfixed64Field =>
|
19
|
-
::Protobuf::Field::Sint32Field
|
20
|
-
::Protobuf::Field::Sint64Field
|
21
|
-
::Protobuf::Field::StringField
|
22
|
-
::Protobuf::Field::Uint32Field
|
23
|
-
::Protobuf::Field::Uint64Field
|
8
|
+
FIELD_TYPE_MAP = {
|
9
|
+
::Protobuf::Field::BoolField => :boolean,
|
10
|
+
::Protobuf::Field::BytesField => :string,
|
11
|
+
::Protobuf::Field::DoubleField => :float,
|
12
|
+
::Protobuf::Field::Fixed32Field => :float,
|
13
|
+
::Protobuf::Field::Fixed64Field => :float,
|
14
|
+
::Protobuf::Field::FloatField => :float,
|
15
|
+
::Protobuf::Field::Int32Field => :integer,
|
16
|
+
::Protobuf::Field::Int64Field => :integer,
|
17
|
+
::Protobuf::Field::Sfixed32Field => :float,
|
18
|
+
::Protobuf::Field::Sfixed64Field => :float,
|
19
|
+
::Protobuf::Field::Sint32Field => :integer,
|
20
|
+
::Protobuf::Field::Sint64Field => :integer,
|
21
|
+
::Protobuf::Field::StringField => :string,
|
22
|
+
::Protobuf::Field::Uint32Field => :integer,
|
23
|
+
::Protobuf::Field::Uint64Field => :integer
|
24
24
|
}
|
25
25
|
|
26
|
+
def self.type_name_for_field(field)
|
27
|
+
FIELD_TYPE_MAP[field.type_class]
|
28
|
+
end
|
29
|
+
|
26
30
|
module ClassMethods
|
27
31
|
def fields_from_attributes(message_class, attributes)
|
28
32
|
Fields.from_attributes(message_class, attributes)
|
@@ -118,6 +122,10 @@ module ActiveRemote
|
|
118
122
|
value.is_a?(Array) ? value : [ value ]
|
119
123
|
end
|
120
124
|
|
125
|
+
def type_name
|
126
|
+
Serializers::Protobuf.type_name_for_field(field)
|
127
|
+
end
|
128
|
+
|
121
129
|
def typecast(value)
|
122
130
|
return value if value.nil?
|
123
131
|
|
@@ -129,7 +137,7 @@ module ActiveRemote
|
|
129
137
|
end
|
130
138
|
|
131
139
|
def typecaster
|
132
|
-
@typecaster ||=
|
140
|
+
@typecaster ||= Type.lookup(type_name)
|
133
141
|
end
|
134
142
|
|
135
143
|
def typecaster?
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Based on the type registry from Rails 5.0
|
2
|
+
# https://github.com/rails/rails/blob/5-0-stable/activemodel/lib/active_model/type.rb
|
3
|
+
#
|
4
|
+
# TODO: Replace this with the Active Model type registry once Rails 4.2 support is dropped.
|
5
|
+
#
|
6
|
+
require "active_remote/type/registry"
|
7
|
+
require "active_remote/typecasting"
|
8
|
+
|
9
|
+
module ActiveRemote
|
10
|
+
module Type
|
11
|
+
@registry = Registry.new
|
12
|
+
|
13
|
+
class << self
|
14
|
+
attr_accessor :registry # :nodoc:
|
15
|
+
|
16
|
+
# Add a new type to the registry, allowing it to be gotten through ActiveRemote::Type#lookup
|
17
|
+
def register(type_name, klass)
|
18
|
+
registry.register(type_name, klass)
|
19
|
+
end
|
20
|
+
|
21
|
+
def lookup(type_name) # :nodoc:
|
22
|
+
registry.lookup(type_name)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
register(:boolean, Typecasting::BooleanTypecaster)
|
27
|
+
register(:date, Typecasting::DateTypecaster)
|
28
|
+
register(:datetime, Typecasting::DateTimeTypecaster)
|
29
|
+
register(:decimal, Typecasting::BigDecimalTypecaster)
|
30
|
+
register(:float, Typecasting::FloatTypecaster)
|
31
|
+
register(:integer, Typecasting::IntegerTypecaster)
|
32
|
+
register(:object, Typecasting::ObjectTypecaster)
|
33
|
+
register(:string, Typecasting::StringTypecaster)
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module ActiveRemote
|
2
|
+
module Type
|
3
|
+
class Registry
|
4
|
+
attr_reader :registrations
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@registrations = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def register(type_name, typecaster)
|
11
|
+
registrations << registration_klass.new(type_name, typecaster)
|
12
|
+
end
|
13
|
+
|
14
|
+
def lookup(symbol)
|
15
|
+
registration = find_registration(symbol)
|
16
|
+
raise ArgumentError, "Unknown type #{symbol.inspect}" unless registration
|
17
|
+
|
18
|
+
registration.typecaster
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def registration_klass
|
24
|
+
Registration
|
25
|
+
end
|
26
|
+
|
27
|
+
def find_registration(symbol)
|
28
|
+
registrations.find { |r| r.matches?(symbol) }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Registration
|
33
|
+
attr_reader :name, :typecaster
|
34
|
+
|
35
|
+
def initialize(name, typecaster)
|
36
|
+
@name = name
|
37
|
+
@typecaster = typecaster
|
38
|
+
end
|
39
|
+
|
40
|
+
def matches?(type_name)
|
41
|
+
type_name == name
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
class TypecastedAuthor < ::ActiveRemote::Base
|
2
2
|
attribute :guid, :type => String
|
3
3
|
attribute :name, :typecaster => StringTypecaster
|
4
|
-
attribute :age, :
|
4
|
+
attribute :age, :integer
|
5
5
|
attribute :birthday, :type => DateTime
|
6
|
-
attribute :writes_fiction, :
|
7
|
-
attribute :net_sales, :
|
6
|
+
attribute :writes_fiction, :boolean
|
7
|
+
attribute :net_sales, :typecaster => FloatTypecaster
|
8
8
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_remote
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Hutchison
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -156,12 +156,27 @@ dependencies:
|
|
156
156
|
- - ">="
|
157
157
|
- !ruby/object:Gem::Version
|
158
158
|
version: '0'
|
159
|
+
- !ruby/object:Gem::Dependency
|
160
|
+
name: benchmark-ips
|
161
|
+
requirement: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - ">="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - ">="
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: '0'
|
159
173
|
description: Active Remote provides Active Record-like object-relational mapping over
|
160
174
|
RPC. It was written for use with Google Protocol Buffers, but could be extended
|
161
175
|
to use any RPC data format.
|
162
176
|
email:
|
163
177
|
- liveh2o@gmail.com
|
164
178
|
executables:
|
179
|
+
- benchmark
|
165
180
|
- console
|
166
181
|
extensions: []
|
167
182
|
extra_rdoc_files: []
|
@@ -175,6 +190,7 @@ files:
|
|
175
190
|
- README.md
|
176
191
|
- Rakefile
|
177
192
|
- active_remote.gemspec
|
193
|
+
- bin/benchmark
|
178
194
|
- bin/console
|
179
195
|
- lib/active_remote.rb
|
180
196
|
- lib/active_remote/association.rb
|
@@ -197,6 +213,8 @@ files:
|
|
197
213
|
- lib/active_remote/search.rb
|
198
214
|
- lib/active_remote/serialization.rb
|
199
215
|
- lib/active_remote/serializers/protobuf.rb
|
216
|
+
- lib/active_remote/type.rb
|
217
|
+
- lib/active_remote/type/registry.rb
|
200
218
|
- lib/active_remote/typecasting.rb
|
201
219
|
- lib/active_remote/typecasting/big_decimal_typecaster.rb
|
202
220
|
- lib/active_remote/typecasting/boolean.rb
|