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,152 @@
1
+ require 'ixtlan/remote/model_helpers'
2
+ module Ixtlan
3
+ module Remote
4
+ class Resource
5
+
6
+ include ModelHelpers
7
+
8
+ def initialize(resource, model_map = {})
9
+ @base = resource
10
+ @map = model_map
11
+ end
12
+
13
+ def send_it(&block)
14
+ raise "no method given - call any CRUD method first" unless @method
15
+ headers = {:content_type => :json, :accept => :json}
16
+ headers[:params] = @params if @params
17
+ result =
18
+ if @payload
19
+ @resource.send @method, @payload.to_json, headers, &block
20
+ else
21
+ @resource.send @method, headers, &block
22
+ end
23
+ unless result.blank?
24
+ result = JSON.load(result)
25
+ if @model
26
+ root = @map[ @model ].singular || @model_key
27
+ if result.is_a? Array
28
+ if result.empty?
29
+ []
30
+ else
31
+ root =
32
+ if result[ 1 ].is_a?( Hash ) && result[ 1 ].size == 1
33
+ root
34
+ end
35
+ result.collect do |r|
36
+ new_instance( @model, r[root] || r )
37
+ end
38
+ end
39
+ else
40
+ attr = if result.is_a?( Hash ) && result.size == 1
41
+ result[root]
42
+ else
43
+ result
44
+ end
45
+ new_instance(@model, attr)
46
+ end
47
+ else
48
+ result
49
+ end
50
+ end
51
+ end
52
+
53
+ def query_params(params)
54
+ @params = params
55
+ self
56
+ end
57
+
58
+ # retrieve(Locale) => GET /locales
59
+ # retrieve(Locale, 1) => GET /locales/1
60
+ # retrieve(:locales) => GET /locales
61
+ # retrieve(:locales, 1) => GET /locales/1
62
+ def retrieve(*args)
63
+ @method = :get
64
+ @params = nil
65
+ @resource = @base[path(*args)]
66
+ @payload = nil
67
+ self
68
+ end
69
+
70
+ # create(locale) => POST /locales
71
+ # create(:locale => {:code => 'en'}) => POST /locales
72
+ def create(*obj_or_hash)
73
+ @method = :post
74
+ @payload = nil#obj_or_hash.is_a?(Class)? nil : obj_or_hash
75
+ @params = nil
76
+ @resource = @base[path(*obj_or_hash)]
77
+ self
78
+ end
79
+
80
+ def update(*obj_or_hash)
81
+ @method = :put
82
+ @payload = nil#obj_or_hash.is_a?(Class)? nil : obj_or_hash
83
+ @params = nil
84
+ @resource = @base[path(*obj_or_hash)]
85
+ self
86
+ end
87
+
88
+ def delete(*obj_or_hash)
89
+ @method = :delete
90
+ @payload = nil #obj_or_hash.is_a?(Class)? nil : obj_or_hash
91
+ @params = nil
92
+ @resource = @base[path(*obj_or_hash)]
93
+ self
94
+ end
95
+
96
+ def model
97
+ @model
98
+ end
99
+
100
+ private
101
+
102
+ def new_instance( clazz, attributes )
103
+ @map[ clazz ].new( attributes )
104
+ end
105
+
106
+ def path(*parts)
107
+ parts.collect { |p| path_part( p ) }.delete_if { |p| p.nil? } * '/'
108
+ end
109
+
110
+ def model_set(model)
111
+ m = model.singularize.camelize.constantize rescue nil
112
+ if m
113
+ @model = m
114
+ @model_key = model.singularize.underscore
115
+ end
116
+ end
117
+
118
+ def path_part(data)
119
+ model = to_model_underscore(data)
120
+ case data
121
+ when Hash
122
+ @payload = data
123
+ if model_set(model)
124
+ model = model.pluralize
125
+ else
126
+ model = nil
127
+ end
128
+ when Array
129
+ @payload = data
130
+ if model_set model
131
+ model = model.pluralize
132
+ end
133
+ when String
134
+ model_set model
135
+ when Fixnum
136
+ model = data.to_s
137
+ when Symbol
138
+ model_set model
139
+ when Class
140
+ model_set model
141
+ model = @map.member?( model ) ? @map[ model ].path : model.pluralize
142
+ else
143
+ @payload = data
144
+ model_set model
145
+ model = model.pluralize
146
+ end
147
+ model.underscore if model
148
+ end
149
+
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,108 @@
1
+ #
2
+ # ixtlan-remote - helper sync data between miniapps or communicate wth realtime
3
+ # rest-services
4
+ # Copyright (C) 2012 Christian Meier
5
+ #
6
+ # This file is part of ixtlan-remote.
7
+ #
8
+ # ixtlan-remote is free software: you can redistribute it and/or modify
9
+ # it under the terms of the GNU Affero General Public License as
10
+ # published by the Free Software Foundation, either version 3 of the
11
+ # License, or (at your option) any later version.
12
+ #
13
+ # ixtlan-remote is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU Affero General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU Affero General Public License
19
+ # along with ixtlan-remote. If not, see <http://www.gnu.org/licenses/>.
20
+ #
21
+ require 'ixtlan/remote/model_helpers'
22
+ require 'ixtlan/remote/server'
23
+ module Ixtlan
24
+ module Remote
25
+ class Rest
26
+
27
+ private
28
+
29
+ include ModelHelpers
30
+
31
+ def model_to_servers
32
+ @_models ||= {}
33
+ end
34
+
35
+ def servers
36
+ @_servers ||= {}
37
+ end
38
+
39
+ public
40
+
41
+ def server( server_name, &block )
42
+ server = servers[ server_name.to_sym ] ||= Server.new( self )
43
+ block.call server if block
44
+ server
45
+ end
46
+
47
+ def []=( clazz, server )
48
+ model_to_servers[ to_model_singular_underscore( clazz ) ] = server
49
+ end
50
+
51
+ def to_server( model )
52
+ s = model_to_servers[ to_model_singular_underscore( model ) ]
53
+ raise "model #{model} unknown as rest service" unless s
54
+ s
55
+ end
56
+
57
+ def new_resource( model )
58
+ begin
59
+ m = to_model_singular_underscore( model ).camelize.constantize
60
+ to_server( model ).new_rest_resource( m )
61
+ rescue
62
+ raise "unknown model #{model}"
63
+ end
64
+ end
65
+
66
+ def create( model, *args, &block )
67
+ if model.respond_to?( :attributes )
68
+ args << model.attributes
69
+ model = model.class
70
+ end
71
+ new_resource( model ).create( *args ).send_it( &block )
72
+ end
73
+
74
+ def retrieve( model, *args )
75
+ resource = new_resource( model )
76
+ if args.last.is_a? Hash
77
+ params = args.delete_at( args.size - 1 )
78
+ resource.retrieve( *args ).query_params( params )
79
+ else
80
+ resource.retrieve( *args )
81
+ end
82
+ resource.send_it
83
+ end
84
+
85
+ def update_or_delete( method, model, *args )
86
+ if model.respond_to?( :attributes )
87
+ if args.size == 0
88
+ args += model.key
89
+ args << model.attributes
90
+ else
91
+ args << model.attributes
92
+ end
93
+ model = model.class
94
+ end
95
+ new_resource( model ).send( method, *args ).send_it
96
+ end
97
+ private :update_or_delete
98
+
99
+ def update( model, *args )
100
+ update_or_delete( :update, model, *args )
101
+ end
102
+
103
+ def delete( model, *args )
104
+ update_or_delete( :delete, model, *args )
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,83 @@
1
+ require 'ixtlan/remote/model_helpers'
2
+ module Ixtlan
3
+ module Remote
4
+ class Rest
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 )
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 to_server( model )
31
+ model_to_servers[ to_model_singular_underscore( model ) ]
32
+ end
33
+
34
+ def new_resource( model )
35
+ to_server( model ).new_rest_resource
36
+ end
37
+
38
+ def create(model, *args)
39
+ if args.size == 0 && model.respond_to?(:attributes)
40
+ clazz = model.class
41
+ new_resource(clazz).create(clazz, model.attributes).send_it
42
+ else
43
+ new_resource(model).create(model, *args).send_it
44
+ end
45
+ end
46
+
47
+ def retrieve(model, *args)
48
+ resource = new_resource(model)
49
+ if args.last.is_a? Hash
50
+ params = args.delete_at(args.size - 1)
51
+ resource.retrieve(model, *args).query_params(params)
52
+ else
53
+ resource.retrieve(model, *args)
54
+ end
55
+ resource.send_it
56
+ end
57
+
58
+ def update(model, *args)
59
+ if args.size == 0 && model.respond_to?(:attributes)
60
+ clazz = model.class
61
+ s = to_server( clazz )
62
+ s.new_rest_resource.update(clazz,
63
+ *s.keys( model ),
64
+ model.attributes).send_it
65
+ else
66
+ new_resource(model).update(model, *args).send_it
67
+ end
68
+ end
69
+
70
+ def delete(model, *args)
71
+ if args.size == 0 && model.respond_to?(:attributes)
72
+ clazz = model.class
73
+ s = to_server( clazz )
74
+ s.new_rest_resource.delete(clazz,
75
+ *s.keys( model ),
76
+ model.attributes).send_it
77
+ else
78
+ new_resource(model).delete(model, *args).send_it
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,140 @@
1
+ require 'ixtlan/remote/model_helpers'
2
+ module Ixtlan
3
+ module Remote
4
+ class RestResource
5
+
6
+ include ModelHelpers
7
+
8
+ def initialize(resource, model_map = {})
9
+ @base = resource
10
+ @map = model_map
11
+ end
12
+
13
+ def send_it(&block)
14
+ raise "no method given - call any CRUD method first" unless @method
15
+ headers = {:content_type => :json, :accept => :json}
16
+ headers[:params] = @params if @params
17
+ result =
18
+ if @payload
19
+ @resource.send @method, @payload.to_json, headers, &block
20
+ else
21
+ @resource.send @method, headers, &block
22
+ end
23
+ unless result.blank?
24
+ result = JSON.load(result)
25
+ if @model
26
+ root = @model_key || @model.to_s.underscore
27
+ if result.is_a? Array
28
+ result.collect do |r|
29
+ new_instance(@model, r[root] || r)
30
+ end
31
+ else
32
+ new_instance(@model, result[root] || result)
33
+ end
34
+ else
35
+ result
36
+ end
37
+ end
38
+ end
39
+
40
+ def query_params(params)
41
+ @params = params
42
+ self
43
+ end
44
+
45
+ # retrieve(Locale) => GET /locales
46
+ # retrieve(Locale, 1) => GET /locales/1
47
+ # retrieve(:locales) => GET /locales
48
+ # retrieve(:locales, 1) => GET /locales/1
49
+ def retrieve(*args)
50
+ @method = :get
51
+ @params = nil
52
+ @resource = @base[path(*args)]
53
+ @payload = nil
54
+ self
55
+ end
56
+
57
+ # create(locale) => POST /locales
58
+ # create(:locale => {:code => 'en'}) => POST /locales
59
+ def create(*obj_or_hash)
60
+ @method = :post
61
+ @payload = nil#obj_or_hash.is_a?(Class)? nil : obj_or_hash
62
+ @params = nil
63
+ @resource = @base[path(*obj_or_hash)]
64
+ self
65
+ end
66
+
67
+ def update(*obj_or_hash)
68
+ @method = :put
69
+ @payload = nil#obj_or_hash.is_a?(Class)? nil : obj_or_hash
70
+ @params = nil
71
+ @resource = @base[path(*obj_or_hash)]
72
+ self
73
+ end
74
+
75
+ def delete(*obj_or_hash)
76
+ @method = :delete
77
+ @payload = nil #obj_or_hash.is_a?(Class)? nil : obj_or_hash
78
+ @params = nil
79
+ @resource = @base[path(*obj_or_hash)]
80
+ self
81
+ end
82
+
83
+ def model
84
+ @model
85
+ end
86
+
87
+ private
88
+
89
+ def new_instance( clazz, attributes )
90
+ @map[ clazz ].new_method.call attributes
91
+ end
92
+
93
+ def path(*parts)
94
+ parts.collect { |p| path_part( p ) }.delete_if { |p| p.nil? } * '/'
95
+ end
96
+
97
+ def model_set(model)
98
+ m = model.singularize.camelize.constantize rescue nil
99
+ if m
100
+ @model = m
101
+ @model_key = model.singularize.underscore
102
+ end
103
+ end
104
+
105
+ def path_part(data)
106
+ model = to_model_underscore(data)
107
+ case data
108
+ when Hash
109
+ @payload = data
110
+ if model_set(model)
111
+ model = model.pluralize
112
+ else
113
+ model = nil
114
+ end
115
+ when Array
116
+ p data
117
+ @payload = data
118
+ if model_set model
119
+ model = model.pluralize
120
+ end
121
+ when String
122
+ model_set model
123
+ when Fixnum
124
+ model = data.to_s
125
+ when Symbol
126
+ model_set model
127
+ when Class
128
+ model_set model
129
+ model = @map.member?( model ) ? @map[ model ].path : model.pluralize
130
+ else
131
+ @payload = data
132
+ model_set model
133
+ model = model.pluralize
134
+ end
135
+ model.underscore if model
136
+ end
137
+
138
+ end
139
+ end
140
+ end