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,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