syncano 4.0.0.alpha1 → 4.0.0.alpha2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +8 -157
  3. data/circle.yml +1 -1
  4. data/lib/syncano.rb +38 -11
  5. data/lib/syncano/api.rb +20 -2
  6. data/lib/syncano/api/endpoints.rb +17 -0
  7. data/lib/syncano/connection.rb +46 -54
  8. data/lib/syncano/poller.rb +55 -0
  9. data/lib/syncano/resources.rb +48 -16
  10. data/lib/syncano/resources/base.rb +46 -56
  11. data/lib/syncano/resources/paths.rb +48 -0
  12. data/lib/syncano/resources/resource_invalid.rb +15 -0
  13. data/lib/syncano/response.rb +55 -0
  14. data/lib/syncano/schema.rb +10 -29
  15. data/lib/syncano/schema/attribute_definition.rb +2 -2
  16. data/lib/syncano/schema/endpoints_whitelist.rb +40 -0
  17. data/lib/syncano/schema/resource_definition.rb +5 -0
  18. data/lib/syncano/upload_io.rb +7 -0
  19. data/lib/syncano/version.rb +1 -1
  20. data/spec/integration/syncano_spec.rb +220 -15
  21. data/spec/spec_helper.rb +3 -1
  22. data/spec/unit/connection_spec.rb +34 -97
  23. data/spec/unit/resources/paths_spec.rb +21 -0
  24. data/spec/unit/resources_base_spec.rb +77 -16
  25. data/spec/unit/response_spec.rb +75 -0
  26. data/spec/unit/schema/resource_definition_spec.rb +10 -0
  27. data/spec/unit/schema_spec.rb +5 -55
  28. data/syncano.gemspec +4 -0
  29. metadata +69 -13
  30. data/lib/active_attr/dirty.rb +0 -26
  31. data/lib/active_attr/typecasting/hash_typecaster.rb +0 -34
  32. data/lib/active_attr/typecasting_override.rb +0 -29
  33. data/lib/syncano/model/associations.rb +0 -121
  34. data/lib/syncano/model/associations/base.rb +0 -38
  35. data/lib/syncano/model/associations/belongs_to.rb +0 -30
  36. data/lib/syncano/model/associations/has_many.rb +0 -75
  37. data/lib/syncano/model/associations/has_one.rb +0 -22
  38. data/lib/syncano/model/base.rb +0 -257
  39. data/lib/syncano/model/callbacks.rb +0 -49
  40. data/lib/syncano/model/scope_builder.rb +0 -158
@@ -25,4 +25,8 @@ Gem::Specification.new do |spec|
25
25
  spec.add_dependency 'activesupport', '>= 4.0'
26
26
  spec.add_dependency 'active_attr', '~> 0.8'
27
27
  spec.add_dependency 'dirty_hashy', '~> 0.2'
28
+ spec.add_dependency 'celluloid'
29
+ spec.add_dependency 'celluloid-io'
30
+ spec.add_dependency 'mimetype-fu'
31
+ spec.add_dependency 'http', '= 0.7.4' # should work with no version constraint once 0.8.2 is released https://github.com/httprb/http.rb/issues/203#issuecomment-100299898
28
32
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: syncano
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0.alpha1
4
+ version: 4.0.0.alpha2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Zadrożny
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-05-01 00:00:00.000000000 Z
12
+ date: 2015-11-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -95,6 +95,62 @@ dependencies:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0.2'
98
+ - !ruby/object:Gem::Dependency
99
+ name: celluloid
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: celluloid-io
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: mimetype-fu
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :runtime
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: http
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - '='
145
+ - !ruby/object:Gem::Version
146
+ version: 0.7.4
147
+ type: :runtime
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - '='
152
+ - !ruby/object:Gem::Version
153
+ version: 0.7.4
98
154
  description: A Ruby client that provides convenient interface for the Syncano api.
99
155
  email:
100
156
  - piotr.zadrozny@mindpower.pl
@@ -112,29 +168,25 @@ files:
112
168
  - README.md
113
169
  - Rakefile
114
170
  - circle.yml
115
- - lib/active_attr/dirty.rb
116
- - lib/active_attr/typecasting/hash_typecaster.rb
117
- - lib/active_attr/typecasting_override.rb
118
171
  - lib/syncano.rb
119
172
  - lib/syncano/api.rb
173
+ - lib/syncano/api/endpoints.rb
120
174
  - lib/syncano/connection.rb
121
- - lib/syncano/model/associations.rb
122
- - lib/syncano/model/associations/base.rb
123
- - lib/syncano/model/associations/belongs_to.rb
124
- - lib/syncano/model/associations/has_many.rb
125
- - lib/syncano/model/associations/has_one.rb
126
- - lib/syncano/model/base.rb
127
- - lib/syncano/model/callbacks.rb
128
- - lib/syncano/model/scope_builder.rb
175
+ - lib/syncano/poller.rb
129
176
  - lib/syncano/query_builder.rb
130
177
  - lib/syncano/resources.rb
131
178
  - lib/syncano/resources/base.rb
132
179
  - lib/syncano/resources/collection.rb
180
+ - lib/syncano/resources/paths.rb
181
+ - lib/syncano/resources/resource_invalid.rb
133
182
  - lib/syncano/resources/space.rb
183
+ - lib/syncano/response.rb
134
184
  - lib/syncano/schema.rb
135
185
  - lib/syncano/schema/attribute_definition.rb
186
+ - lib/syncano/schema/endpoints_whitelist.rb
136
187
  - lib/syncano/schema/resource_definition.rb
137
188
  - lib/syncano/scope.rb
189
+ - lib/syncano/upload_io.rb
138
190
  - lib/syncano/version.rb
139
191
  - spec/integration/syncano_spec.rb
140
192
  - spec/spec_helper.rb
@@ -142,8 +194,10 @@ files:
142
194
  - spec/unit/connection_spec.rb
143
195
  - spec/unit/query_builder_spec.rb
144
196
  - spec/unit/resources/collection_spec.rb
197
+ - spec/unit/resources/paths_spec.rb
145
198
  - spec/unit/resources/space_spec.rb
146
199
  - spec/unit/resources_base_spec.rb
200
+ - spec/unit/response_spec.rb
147
201
  - spec/unit/schema/attribute_definition_spec.rb
148
202
  - spec/unit/schema/resource_definition_spec.rb
149
203
  - spec/unit/schema_spec.rb
@@ -180,8 +234,10 @@ test_files:
180
234
  - spec/unit/connection_spec.rb
181
235
  - spec/unit/query_builder_spec.rb
182
236
  - spec/unit/resources/collection_spec.rb
237
+ - spec/unit/resources/paths_spec.rb
183
238
  - spec/unit/resources/space_spec.rb
184
239
  - spec/unit/resources_base_spec.rb
240
+ - spec/unit/response_spec.rb
185
241
  - spec/unit/schema/attribute_definition_spec.rb
186
242
  - spec/unit/schema/resource_definition_spec.rb
187
243
  - spec/unit/schema_spec.rb
@@ -1,26 +0,0 @@
1
- require 'active_support/concern'
2
- require 'active_model/dirty'
3
- require 'active_attr'
4
-
5
- # Overwritting ActiveAttr module
6
- module ActiveAttr
7
- # Overwritting ActiveAttr::Dirty module
8
- module Dirty
9
- extend ActiveSupport::Concern
10
- include ActiveModel::Dirty
11
-
12
- # Class methods for ActiveAttr::Dirty module
13
- module ClassMethods
14
- # Overwritten attribute! method
15
- # @param [Symbol] name
16
- # @param [Hash] options
17
- def attribute!(name, options = {})
18
- super(name, options)
19
- define_method("#{name}=") do |value|
20
- send("#{name}_will_change!") unless value == read_attribute(name)
21
- super(value)
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,34 +0,0 @@
1
- require 'active_support/core_ext/hash/indifferent_access'
2
-
3
- module ActiveAttr
4
- module Typecasting
5
- # Typecasts an Object to a HashWithInddifferentAccess
6
- #
7
- # @example Usage
8
- # typecaster = HashTypecaster.new
9
- # typecaster.call([[:foo, :bar]]) #=> { foo: :bar }
10
- #
11
- # @since 0.5.0
12
- class HashTypecaster
13
- # Typecasts an object to a HashWithInddifferentAccess
14
- #
15
- # Attempts to convert using #to_h.
16
- #
17
- # @example Typecast an Array
18
- # typecaster.call([[:foo, :bar]]) #=> { foo: :bar }
19
- #
20
- # @param [Object, #to_h] value The object to typecast
21
- #
22
- # @return [HashWithInddifferentAccess] The result of typecasting
23
- #
24
- # @since 0.5.0
25
- def call(value)
26
- if value.respond_to? :to_h
27
- HashWithIndifferentAccess.new(value.to_h)
28
- else
29
- HashWithIndifferentAccess.new
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,29 +0,0 @@
1
- require 'active_attr/typecasting/big_decimal_typecaster'
2
- require 'active_attr/typecasting/boolean'
3
- require 'active_attr/typecasting/boolean_typecaster'
4
- require 'active_attr/typecasting/date_time_typecaster'
5
- require 'active_attr/typecasting/date_typecaster'
6
- require 'active_attr/typecasting/float_typecaster'
7
- require 'active_attr/typecasting/integer_typecaster'
8
- require 'active_attr/typecasting/object_typecaster'
9
- require 'active_attr/typecasting/string_typecaster'
10
- require 'active_attr/typecasting/hash_typecaster'
11
- require 'active_attr/typecasting/unknown_typecaster_error'
12
-
13
- module ActiveAttr
14
- module Typecasting
15
- remove_const(:TYPECASTER_MAP) if defined?(TYPECASTER_MAP)
16
-
17
- TYPECASTER_MAP = {
18
- BigDecimal => BigDecimalTypecaster,
19
- Boolean => BooleanTypecaster,
20
- Date => DateTypecaster,
21
- DateTime => DateTimeTypecaster,
22
- Float => FloatTypecaster,
23
- Integer => IntegerTypecaster,
24
- Object => ObjectTypecaster,
25
- String => StringTypecaster,
26
- Hash => HashTypecaster
27
- }.freeze
28
- end
29
- end
@@ -1,121 +0,0 @@
1
- require 'syncano/model/associations/belongs_to'
2
- require 'syncano/model/associations/has_many'
3
- require 'syncano/model/associations/has_one'
4
-
5
- module Syncano
6
- module Model
7
- # Module with associations functionality for Syncano::Model
8
- module Associations
9
- extend ActiveSupport::Concern
10
-
11
- included do
12
- private
13
-
14
- class_attribute :_associations
15
- end
16
-
17
- # Class methods for Syncano::Model::Associations module
18
- module ClassMethods
19
- # Lists hash with associations
20
- # @return [HashWithIndifferentAccess]
21
- def associations
22
- self._associations ||= HashWithIndifferentAccess.new
23
- end
24
-
25
- private
26
-
27
- # Defines belongs_to association
28
- # @param [Symbol] object_name
29
- def belongs_to(object_name, options = {})
30
- association = Syncano::Model::Association::BelongsTo.new(self, object_name, options)
31
- associations[object_name] = association
32
-
33
- define_method(object_name) do
34
- association = self.class.associations[object_name]
35
- id = send(association.foreign_key)
36
- scope = scope_builder(association.associated_model).find(id)
37
- end
38
-
39
- define_method("#{object_name}=") do |object|
40
- association = self.class.associations[object_name]
41
-
42
- unless object.is_a?(association.associated_model)
43
- raise "Object should be an instance of #{association.associated_model} class"
44
- end
45
- send("#{association.foreign_key}=", object.try(:id))
46
- end
47
- end
48
-
49
- # Defines has_one association
50
- # @param [Symbol] object_name
51
- def has_one(object_name, options = {})
52
- association = Syncano::Model::Association::HasOne.new(self, object_name, options)
53
- associations[object_name] = association
54
-
55
- define_method(object_name) do
56
- association = self.class.associations[object_name]
57
-
58
- scope = scope_builder.new(association.associated_model)
59
- scope.where("#{association.foreign_key} = ?", id).first if id.present?
60
- end
61
-
62
- define_method("#{object_name}=") do |object|
63
- association = self.class.associations[object_name]
64
-
65
- unless object.is_a?(association.associated_model)
66
- raise "Object should be an instance of #{association.associated_model} class"
67
- end
68
-
69
- object.send("#{association.foreign_key}=", id)
70
- object.save unless object.new_record?
71
- object
72
- end
73
-
74
- define_method("build_#{object_name}") do |attributes = {}|
75
- association = self.class.associations[object_name]
76
- association.associated_model.new(attributes)
77
- end
78
-
79
- define_method("create_#{object_name}") do |attributes = {}|
80
- association = self.class.associations[object_name]
81
- association.associated_model.create(attributes)
82
- end
83
- end
84
-
85
- # Defines has_many association
86
- # @param [Symbol] collection_name
87
- def has_many(collection_name, options = {})
88
- association = Syncano::Model::Association::HasMany.new(self, collection_name, options)
89
- associations[collection_name] = association
90
-
91
- define_method(collection_name) do
92
- association = self.class.associations[collection_name]
93
- association.scope_builder(self)
94
- end
95
-
96
- define_method("#{collection_name}=") do |collection|
97
- association = self.class.associations[collection_name]
98
- objects_ids = {}
99
-
100
- collection.each do |object|
101
- "Object should be an instance of #{association.associated_model} class" unless object.is_a?(association.associated_model)
102
- objects_ids[object.id] = true
103
- end
104
-
105
- send(collection_name).all.each do |object|
106
- unless objects_ids[object.id]
107
- object.send("#{association.foreign_key}=", nil)
108
- object.save unless object.new_record?
109
- end
110
- end
111
-
112
- collection.each do |object|
113
- object.send("#{association.foreign_key}=", id)
114
- object.save unless object.new_record?
115
- end
116
- end
117
- end
118
- end
119
- end
120
- end
121
- end
@@ -1,38 +0,0 @@
1
- require 'syncano/model/scope_builder'
2
-
3
- module Syncano
4
- module Model
5
- # Module with associations functionality for Syncano::ActiveRecord
6
- module Association
7
- # Base class for all associations
8
- class Base
9
- # Constructor for association
10
- # @param [Class] source_model
11
- # @param [Symbol] name
12
- def initialize(source_model, name, options = {})
13
- self.source_model = source_model
14
- self.associated_model = name.to_s.classify.constantize
15
- self.foreign_key = options[:foreign_key] || source_model.name.foreign_key
16
- end
17
-
18
- # Checks if association is belongs_to type
19
- # @return [FalseClass]
20
- def belongs_to?
21
- false
22
- end
23
-
24
- # Checks if association is has_one type
25
- # @return [FalseClass]
26
- def has_one?
27
- false
28
- end
29
-
30
- # Checks if association is has_many type
31
- # @return [FalseClass]
32
- def has_many?
33
- false
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,30 +0,0 @@
1
- require 'syncano/model/associations/base'
2
-
3
- module Syncano
4
- module Model
5
- module Association
6
- # Class for belongs to association
7
- class BelongsTo < Syncano::Model::Association::Base
8
- attr_reader :associated_model, :foreign_key, :source_model
9
-
10
- # Constructor for belongs_to association
11
- # @param [Class] source_model
12
- # @param [Symbol] name
13
- def initialize(source_model, name, options = {})
14
- super
15
- self.foreign_key = options[:foreign_key] || associated_model.name.foreign_key
16
- end
17
-
18
- # Checks if association is belongs_to type
19
- # @return [TrueClass]
20
- def belongs_to?
21
- true
22
- end
23
-
24
- private
25
-
26
- attr_writer :associated_model, :foreign_key, :source_model
27
- end
28
- end
29
- end
30
- end
@@ -1,75 +0,0 @@
1
- require 'syncano/model/associations/base'
2
-
3
- module Syncano
4
- module Model
5
- module Association
6
- # Class for has many association
7
- class HasMany < Syncano::Model::Association::Base
8
- attr_reader :associated_model, :foreign_key, :source_model
9
-
10
- # Checks if association is has_many type
11
- # @return [TrueClass]
12
- def has_many?
13
- true
14
- end
15
-
16
- # Returns new associaton object with source object set
17
- # @param [Object] source
18
- # @return [Syncano::ActiveRecord::Association::HasMany]
19
- def scope_builder(source)
20
- association = self.dup
21
- association.source = source
22
- association
23
- end
24
-
25
- # Builds new associated object
26
- # @return [Object]
27
- def build(attributes = {})
28
- new(attributes)
29
- end
30
-
31
- def new(attributes = {})
32
- associated_model.new(attributes.merge(foreign_key => source.id))
33
- end
34
-
35
- # Creates new associated object
36
- # @return [Object]
37
- def create(attributes = {})
38
- associated_model.create(attributes.merge(foreign_key => source.id))
39
- end
40
-
41
- # Adds object to the related collection by setting foreign key
42
- # @param [Object] object
43
- # @return [Object]
44
- def <<(object)
45
- "Object should be an instance of #{associated_model} class" unless object.is_a?(associated_model)
46
-
47
- object.send("#{foreign_key}=", source.id)
48
- object.save unless object.new_record?
49
- object
50
- end
51
-
52
- protected
53
-
54
- attr_accessor :source
55
-
56
- private
57
-
58
- attr_writer :associated_model, :foreign_key, :source_model
59
-
60
- # Overwritten method_missing for handling scope methods
61
- # @param [String] name
62
- # @param [Array] args
63
- def method_missing(name, *args)
64
- scope_builder = Syncano::Model::ScopeBuilder.new(associated_model).where("#{foreign_key} = ?", source.id)
65
-
66
- if scope_builder.respond_to?(name) || !source.scopes[name].nil?
67
- scope_builder.send(name, *args)
68
- else
69
- super
70
- end
71
- end
72
- end
73
- end
74
- end
75
- end