ixtlan-remote 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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