ixtlan-remote 0.1.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.
Files changed (89) hide show
  1. data/Gemfile +2 -0
  2. data/README.md +64 -0
  3. data/agpl-3.0.txt +661 -0
  4. data/lib/ixtlan-remote.rb +23 -0
  5. data/lib/ixtlan/passwords.rb +52 -0
  6. data/lib/ixtlan/passwords.rb~ +47 -0
  7. data/lib/ixtlan/railtie.rb~ +17 -0
  8. data/lib/ixtlan/remote.rb +23 -0
  9. data/lib/ixtlan/remote/access_controller.rb +62 -0
  10. data/lib/ixtlan/remote/access_controller.rb~ +25 -0
  11. data/lib/ixtlan/remote/constant_time_compare.rb +39 -0
  12. data/lib/ixtlan/remote/constant_time_compare.rb~ +19 -0
  13. data/lib/ixtlan/remote/heartbeat.rb~ +80 -0
  14. data/lib/ixtlan/remote/model_conversion.rb~ +245 -0
  15. data/lib/ixtlan/remote/model_helpers.rb +73 -0
  16. data/lib/ixtlan/remote/model_helpers.rb~ +53 -0
  17. data/lib/ixtlan/remote/permission.rb +40 -0
  18. data/lib/ixtlan/remote/permission.rb~ +19 -0
  19. data/lib/ixtlan/remote/railtie.rb +30 -0
  20. data/lib/ixtlan/remote/railtie.rb~ +9 -0
  21. data/lib/ixtlan/remote/remote_access_controller.rb~ +25 -0
  22. data/lib/ixtlan/remote/remote_permisson.rb~ +9 -0
  23. data/lib/ixtlan/remote/resource.rb +145 -0
  24. data/lib/ixtlan/remote/resource.rb-~ +165 -0
  25. data/lib/ixtlan/remote/resource.rb~ +152 -0
  26. data/lib/ixtlan/remote/rest.rb +108 -0
  27. data/lib/ixtlan/remote/rest.rb~ +83 -0
  28. data/lib/ixtlan/remote/rest_resource.rb~ +140 -0
  29. data/lib/ixtlan/remote/rest_resource_config.rb~ +63 -0
  30. data/lib/ixtlan/remote/rest_resource_factory.rb~ +259 -0
  31. data/lib/ixtlan/remote/rest_resource_old.rb-~ +259 -0
  32. data/lib/ixtlan/remote/server.rb +119 -0
  33. data/lib/ixtlan/remote/server.rb~ +82 -0
  34. data/lib/ixtlan/remote/summary.rb +46 -0
  35. data/lib/ixtlan/remote/summary.rb~ +23 -0
  36. data/lib/ixtlan/remote/sync.rb +104 -0
  37. data/lib/ixtlan/remote/sync.rb~ +78 -0
  38. data/lib/ixtlan/remote/sync_summary.rb~ +23 -0
  39. data/lib/ixtlan/remote/tranlation_key.rb~ +7 -0
  40. data/lib/ixtlan/remote/translation.rake~ +194 -0
  41. data/lib/ixtlan/remote/translation_models.rb~ +11 -0
  42. data/lib/ixtlan/remote/updater.rb~ +71 -0
  43. data/lib/ixtlan/user_management/application_model.rb +30 -0
  44. data/lib/ixtlan/user_management/application_model.rb~ +21 -0
  45. data/lib/ixtlan/user_management/application_resource.rb +48 -0
  46. data/lib/ixtlan/user_management/application_resource.rb~ +21 -0
  47. data/lib/ixtlan/user_management/authentcator.rb~ +31 -0
  48. data/lib/ixtlan/user_management/authentication_model.rb +31 -0
  49. data/lib/ixtlan/user_management/authentication_model.rb~ +21 -0
  50. data/lib/ixtlan/user_management/authenticator.rb +55 -0
  51. data/lib/ixtlan/user_management/authenticator.rb~ +20 -0
  52. data/lib/ixtlan/user_management/domain_resource.rb +48 -0
  53. data/lib/ixtlan/user_management/domain_resource.rb~ +21 -0
  54. data/lib/ixtlan/user_management/dummy_authentication.rb +50 -0
  55. data/lib/ixtlan/user_management/dummy_authentication.rb~ +49 -0
  56. data/lib/ixtlan/user_management/group.rb~ +39 -0
  57. data/lib/ixtlan/user_management/group_model.rb +31 -0
  58. data/lib/ixtlan/user_management/group_model.rb~ +21 -0
  59. data/lib/ixtlan/user_management/models.rb~ +39 -0
  60. data/lib/ixtlan/user_management/session-serializer.rb~ +18 -0
  61. data/lib/ixtlan/user_management/session_cuba.rb +47 -0
  62. data/lib/ixtlan/user_management/session_cuba.rb~ +44 -0
  63. data/lib/ixtlan/user_management/session_manager.rb +38 -0
  64. data/lib/ixtlan/user_management/session_model.rb +36 -0
  65. data/lib/ixtlan/user_management/session_model.rb~ +10 -0
  66. data/lib/ixtlan/user_management/session_plugin.rb +32 -0
  67. data/lib/ixtlan/user_management/session_serializer.rb +21 -0
  68. data/lib/ixtlan/user_management/session_serializer.rb~ +21 -0
  69. data/lib/ixtlan/user_management/user.rb~ +16 -0
  70. data/lib/ixtlan/user_management/user_model.rb +36 -0
  71. data/lib/ixtlan/user_management/user_model.rb~ +33 -0
  72. data/lib/ixtlan/user_management/user_resource.rb +55 -0
  73. data/lib/ixtlan/user_management/user_resource.rb~ +24 -0
  74. data/lib/ixtlan/user_management/user_serializer.rb +15 -0
  75. data/lib/ixtlan/user_management/user_serializer.rb~ +23 -0
  76. data/spec/access_controller_spec.rb +65 -0
  77. data/spec/access_controller_spec.rb~ +65 -0
  78. data/spec/model_helpers_spec.rb +40 -0
  79. data/spec/model_helpers_spec.rb~ +36 -0
  80. data/spec/remote_access_controller_spec.rb~ +36 -0
  81. data/spec/resource_spec.rb +181 -0
  82. data/spec/resource_spec.rb~ +173 -0
  83. data/spec/rest_resource_spec.rb~ +173 -0
  84. data/spec/rest_spec.rb +94 -0
  85. data/spec/rest_spec.rb~ +99 -0
  86. data/spec/rest_with_attribute_name_like_model_name_spec.rb +82 -0
  87. data/spec/sync_spec.rb +83 -0
  88. data/spec/sync_spec.rb~ +81 -0
  89. metadata +313 -0
@@ -0,0 +1,63 @@
1
+ require 'ixtlan/remote/model_helpers'
2
+ module Ixtlan
3
+ module Remote
4
+ class RestResourceConfig
5
+
6
+ private
7
+
8
+ include ModelHelpers
9
+
10
+ def model_to_servers
11
+ @_models ||= {}
12
+ end
13
+
14
+ def servers
15
+ @_servers ||= {}
16
+ end
17
+
18
+ public
19
+
20
+ def server(server_name, &block ) # url, options = {})
21
+ server = servers[ server_name.to_sym ] ||= Server.new( self )
22
+ block.call server if block
23
+ server
24
+ end
25
+
26
+ def []=( clazz, server )
27
+ model_to_servers[ to_model_singular_underscore( clazz ) ] = server
28
+ end
29
+
30
+ def new_resource( model )
31
+ model_to_servers[ to_model_singular_underscore( model ) ].new_rest_resource
32
+ end
33
+
34
+ def create(model, *args)
35
+ if args.size == 0 && model.respond_to?(:attributes)
36
+ clazz = model.class
37
+ new_resource(clazz).create(clazz, model.attributes).send_it
38
+ else
39
+ new_resource(model).create(model, *args).send_it
40
+ end
41
+ end
42
+
43
+ def retrieve(model, *args)
44
+ resource = new_resource(model)
45
+ if args.last.is_a? Hash
46
+ params = args.delete_at(args.size - 1)
47
+ resource.retrieve(model, *args).query_params(params)
48
+ else
49
+ resource.retrieve(model, *args)
50
+ end
51
+ resource.send_it
52
+ end
53
+
54
+ def update(model, *args)
55
+ new_resource(model).update(model, *args).send_it
56
+ end
57
+
58
+ def delete(model, *args)
59
+ new_resource(model).delete(model, *args).send_it
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,259 @@
1
+ require 'rest-client'
2
+ module Ixtlan
3
+ module Remote
4
+ class RestResourceFactory
5
+ def initialize(url, model_map = {}, options = {})
6
+ @url = url
7
+ @model_map = model_map
8
+ @options = options
9
+ end
10
+
11
+ def to_class(model)
12
+ @model_map[model]
13
+ end
14
+
15
+ def new
16
+ RestResource.new(RestClient::Resource.new(@url, @options), @model_map)
17
+ end
18
+ end
19
+ module Model
20
+
21
+ def to_model_underscore(data)
22
+ to_model(data).to_s.underscore
23
+ end
24
+
25
+ def to_model_singular_underscore(data)
26
+ to_model.underscore.singular
27
+ end
28
+
29
+ def to_model(data)
30
+ case data
31
+ when Hash
32
+ data.keys.first
33
+ when Array
34
+ if data.empty?
35
+ #TODO
36
+ else
37
+ to_model_class(data[0].class)
38
+ end
39
+ when String
40
+ data
41
+ when Symbol
42
+ data
43
+ when Class
44
+ to_model_class(data)
45
+ else
46
+ to_model_class(data.class)
47
+ end
48
+ end
49
+
50
+ def to_model_class(obj)
51
+ obj.respond_to?(:model_name) ? obj.model_name.constantize : obj.class
52
+ end
53
+ end
54
+
55
+ class RestResourceConfig
56
+
57
+ def register(server_name, url, options = {})
58
+ models = options.delete(:models).dup
59
+ model_map =
60
+ case models
61
+ when Array
62
+ map = {}
63
+ models.each do |model|
64
+ map[to_model_singular_underscore(model)] = model
65
+ end
66
+ map
67
+ when Hash
68
+ models
69
+ else
70
+ {}
71
+ end
72
+
73
+ s = servers[server_name.to_sym] = RestResourceFactory.new(url, model_map, options)
74
+
75
+ model_map.keys.each do |k|
76
+ self.models[k] = s
77
+ end
78
+ s
79
+ end
80
+
81
+
82
+ def models
83
+ @models ||= {}
84
+ end
85
+
86
+ def new_resource(model)
87
+ models[model].new
88
+ end
89
+
90
+ def to_class(model)
91
+ key = to_model_singular_underscore(model)
92
+ models[key].to_class(key)
93
+ end
94
+
95
+ def servers
96
+ @servers ||= {}
97
+ end
98
+
99
+ def server(name)
100
+ servers[name.to_sym]
101
+ end
102
+
103
+ def create(model, *args)
104
+ new_resource(model).create(model, *args).send
105
+ end
106
+
107
+ def retrieve(model, *args)
108
+ resource = new_resource(model)
109
+ if args.last.is_a? Hash
110
+ params = args.delete_at(args.size - 1)
111
+ resource.retrieve(model, *args).query_params(params)
112
+ else
113
+ resource.retrieve(model, *args)
114
+ end
115
+ resource.send
116
+ end
117
+
118
+ def update(model, *args)
119
+ new_resource(model).update(model, *args).send
120
+ end
121
+
122
+ def delete(model, *args)
123
+ new_resource(model).delete(model, *args).send
124
+ end
125
+
126
+ include Model
127
+ end
128
+
129
+ class RestResource
130
+
131
+ def initialize(resource, model_map = {})
132
+ @base = resource
133
+ @map = model_map
134
+ end
135
+
136
+ def first_or_new(attributes)
137
+ cond = {}
138
+ @model.key.each { |k| cond[k.name] = attributes[k.name.to_s] }
139
+ m = @model.first_or_new(cond)
140
+ m.attributes = attributes
141
+ m
142
+ end
143
+
144
+ def send(&block)
145
+ raise "no method given - call any CRUD method first" unless @method
146
+ headers = {:content_type => :json, :accept => :json}
147
+ headers[:params] = @params if @params
148
+ result =
149
+ if @payload
150
+ @resource.send @method, @payload.to_json, headers, &block
151
+ else
152
+ @resource.send @method, headers, &block
153
+ end
154
+ result = JSON.load(result)
155
+ if @model
156
+ root = @model_key || @model.to_s.underscore
157
+ if result.is_a? Array
158
+ result.collect do |r|
159
+ first_or_new(r[root])
160
+ end
161
+ else
162
+ first_or_new(result[root])
163
+ end
164
+ else
165
+ result
166
+ end
167
+ end
168
+
169
+ def query_params(params)
170
+ @params = params
171
+ self
172
+ end
173
+
174
+ # def as_model(obj)
175
+ # @model = obj.respond_to?(:model_name) ? obj.model_name.constantize : obj.class
176
+ # end
177
+
178
+ def path(*parts)
179
+ parts.collect {|p| path_part(p)} * '/'
180
+ end
181
+
182
+ include Model
183
+
184
+ def model=(model)
185
+ m = @map[model.singularize]
186
+ m ||= model.singularize.camelize.constantize rescue nil
187
+ if m
188
+ @model = m
189
+ @model_key = model.singularize.underscore
190
+ end
191
+ end
192
+
193
+ def path_part(data)
194
+ model = to_model_underscore(data)
195
+ case data
196
+ when Hash
197
+ @payload = data
198
+ self.model = model
199
+ model = model.pluralize
200
+ when Array
201
+ @payload = data
202
+ self.model = model
203
+ model = model.pluralize
204
+ when String
205
+ self.model = model
206
+ when Fixnum
207
+ when Symbol
208
+ self.model = model
209
+ when Class
210
+ model = model.pluralize
211
+ else
212
+ @payload = data
213
+ self.model = model
214
+ model = model.pluralize
215
+ end
216
+ model.underscore
217
+ end
218
+
219
+ # retrieve(Locale) => GET /locales
220
+ # retrieve(Locale, 1) => GET /locales/1
221
+ ## retrieve(Locale, {:updated_at => ...}) => GET /locales?updated=...
222
+ ## retrieve(:locales, {:updated_at => ...}) => GET /locales?updated=...
223
+ # retrieve(:locales, 1) => GET /locales/1
224
+ def retrieve(*args)
225
+ @method = :get
226
+ @payload = nil
227
+ @params = nil
228
+ @resource = @base[path(*args)]
229
+ self
230
+ end
231
+
232
+ # create(locale) => POST /locales
233
+ # create(:locale => {:code => 'en'}) => POST /locales
234
+ def create(*obj_or_hash)
235
+ @method = :post
236
+ @payload = nil#obj_or_hash.is_a?(Class)? nil : obj_or_hash
237
+ @params = nil
238
+ @resource = @base[path(*obj_or_hash)]
239
+ self
240
+ end
241
+
242
+ def update(*obj_or_hash)
243
+ @method = :put
244
+ @payload = nil#obj_or_hash.is_a?(Class)? nil : obj_or_hash
245
+ @params = nil
246
+ @resource = @base[path(*obj_or_hash)]
247
+ self
248
+ end
249
+
250
+ def delete(*obj_or_hash)
251
+ @method = :delete
252
+ @payload = nil #obj_or_hash.is_a?(Class)? nil : obj_or_hash
253
+ @params = nil
254
+ @resource = @base[path(*obj_or_hash)]
255
+ self
256
+ end
257
+ end
258
+ end
259
+ end
@@ -0,0 +1,259 @@
1
+ require 'rest-client'
2
+ module Ixtlan
3
+ module Remote
4
+ class RestResourceFactory
5
+ def initialize(url, model_map = {}, options = {})
6
+ @url = url
7
+ @model_map = model_map
8
+ @options = options
9
+ end
10
+
11
+ def to_class(model)
12
+ @model_map[model]
13
+ end
14
+
15
+ def new
16
+ RestResource.new(RestClient::Resource.new(@url, @options), @model_map)
17
+ end
18
+ end
19
+ module Model
20
+
21
+ def to_model_underscore(data)
22
+ to_model(data).to_s.underscore
23
+ end
24
+
25
+ def to_model_singular_underscore(data)
26
+ to_model.underscore.singular
27
+ end
28
+
29
+ def to_model(data)
30
+ case data
31
+ when Hash
32
+ data.keys.first
33
+ when Array
34
+ if data.empty?
35
+ #TODO
36
+ else
37
+ to_model_class(data[0].class)
38
+ end
39
+ when String
40
+ data
41
+ when Symbol
42
+ data
43
+ when Class
44
+ to_model_class(data)
45
+ else
46
+ to_model_class(data.class)
47
+ end
48
+ end
49
+
50
+ def to_model_class(obj)
51
+ obj.respond_to?(:model_name) ? obj.model_name.constantize : obj.class
52
+ end
53
+ end
54
+
55
+ class RestResourceConfig
56
+
57
+ def register(server_name, url, options = {})
58
+ models = options.delete(:models).dup
59
+ model_map =
60
+ case models
61
+ when Array
62
+ map = {}
63
+ models.each do |model|
64
+ map[to_model_singular_underscore(model)] = model
65
+ end
66
+ map
67
+ when Hash
68
+ models
69
+ else
70
+ {}
71
+ end
72
+
73
+ s = servers[server_name.to_sym] = RestResourceFactory.new(url, model_map, options)
74
+
75
+ model_map.keys.each do |k|
76
+ self.models[k] = s
77
+ end
78
+ s
79
+ end
80
+
81
+
82
+ def models
83
+ @models ||= {}
84
+ end
85
+
86
+ def new_resource(model)
87
+ models[model].new
88
+ end
89
+
90
+ def to_class(model)
91
+ key = to_model_singular_underscore(model)
92
+ models[key].to_class(key)
93
+ end
94
+
95
+ def servers
96
+ @servers ||= {}
97
+ end
98
+
99
+ def server(name)
100
+ servers[name.to_sym]
101
+ end
102
+
103
+ def create(model, *args)
104
+ new_resource(model).create(model, *args).send
105
+ end
106
+
107
+ def retrieve(model, *args)
108
+ resource = new_resource(model)
109
+ if args.last.is_a? Hash
110
+ params = args.delete_at(args.size - 1)
111
+ resource.retrieve(model, *args).query_params(params)
112
+ else
113
+ resource.retrieve(model, *args)
114
+ end
115
+ resource.send
116
+ end
117
+
118
+ def update(model, *args)
119
+ new_resource(model).update(model, *args).send
120
+ end
121
+
122
+ def delete(model, *args)
123
+ new_resource(model).delete(model, *args).send
124
+ end
125
+
126
+ include Model
127
+ end
128
+
129
+ class RestResource
130
+
131
+ def initialize(resource, model_map = {})
132
+ @base = resource
133
+ @map = model_map
134
+ end
135
+
136
+ def first_or_new(attributes)
137
+ cond = {}
138
+ @model.key.each { |k| cond[k.name] = attributes[k.name.to_s] }
139
+ m = @model.first_or_new(cond)
140
+ m.attributes = attributes
141
+ m
142
+ end
143
+
144
+ def send(&block)
145
+ raise "no method given - call any CRUD method first" unless @method
146
+ headers = {:content_type => :json, :accept => :json}
147
+ headers[:params] = @params if @params
148
+ result =
149
+ if @payload
150
+ @resource.send @method, @payload.to_json, headers, &block
151
+ else
152
+ @resource.send @method, headers, &block
153
+ end
154
+ result = JSON.load(result)
155
+ if @model
156
+ root = @model_key || @model.to_s.underscore
157
+ if result.is_a? Array
158
+ result.collect do |r|
159
+ first_or_new(r[root])
160
+ end
161
+ else
162
+ first_or_new(result[root])
163
+ end
164
+ else
165
+ result
166
+ end
167
+ end
168
+
169
+ def query_params(params)
170
+ @params = params
171
+ self
172
+ end
173
+
174
+ # def as_model(obj)
175
+ # @model = obj.respond_to?(:model_name) ? obj.model_name.constantize : obj.class
176
+ # end
177
+
178
+ def path(*parts)
179
+ parts.collect {|p| path_part(p)} * '/'
180
+ end
181
+
182
+ include Model
183
+
184
+ def model=(model)
185
+ m = @map[model.singularize]
186
+ m ||= model.singularize.camelize.constantize rescue nil
187
+ if m
188
+ @model = m
189
+ @model_key = model.singularize.underscore
190
+ end
191
+ end
192
+
193
+ def path_part(data)
194
+ model = to_model_underscore(data)
195
+ case data
196
+ when Hash
197
+ @payload = data
198
+ self.model = model
199
+ model = model.pluralize
200
+ when Array
201
+ @payload = data
202
+ self.model = model
203
+ model = model.pluralize
204
+ when String
205
+ self.model = model
206
+ when Fixnum
207
+ when Symbol
208
+ self.model = model
209
+ when Class
210
+ model = model.pluralize
211
+ else
212
+ @payload = data
213
+ self.model = model
214
+ model = model.pluralize
215
+ end
216
+ model.underscore
217
+ end
218
+
219
+ # retrieve(Locale) => GET /locales
220
+ # retrieve(Locale, 1) => GET /locales/1
221
+ ## retrieve(Locale, {:updated_at => ...}) => GET /locales?updated=...
222
+ ## retrieve(:locales, {:updated_at => ...}) => GET /locales?updated=...
223
+ # retrieve(:locales, 1) => GET /locales/1
224
+ def retrieve(*args)
225
+ @method = :get
226
+ @payload = nil
227
+ @params = nil
228
+ @resource = @base[path(*args)]
229
+ self
230
+ end
231
+
232
+ # create(locale) => POST /locales
233
+ # create(:locale => {:code => 'en'}) => POST /locales
234
+ def create(*obj_or_hash)
235
+ @method = :post
236
+ @payload = nil#obj_or_hash.is_a?(Class)? nil : obj_or_hash
237
+ @params = nil
238
+ @resource = @base[path(*obj_or_hash)]
239
+ self
240
+ end
241
+
242
+ def update(*obj_or_hash)
243
+ @method = :put
244
+ @payload = nil#obj_or_hash.is_a?(Class)? nil : obj_or_hash
245
+ @params = nil
246
+ @resource = @base[path(*obj_or_hash)]
247
+ self
248
+ end
249
+
250
+ def delete(*obj_or_hash)
251
+ @method = :delete
252
+ @payload = nil #obj_or_hash.is_a?(Class)? nil : obj_or_hash
253
+ @params = nil
254
+ @resource = @base[path(*obj_or_hash)]
255
+ self
256
+ end
257
+ end
258
+ end
259
+ end