restful_objects 0.0.5 → 0.0.6

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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -2
  3. data/bin/restful_server +1 -1
  4. data/lib/restful_objects/domain_model/domain_model.rb +143 -0
  5. data/lib/restful_objects/{link_generator.rb → domain_model/helpers/link_generator.rb} +0 -0
  6. data/lib/restful_objects/{object.rb → domain_model/mixins/object.rb} +6 -2
  7. data/lib/restful_objects/{object_actions.rb → domain_model/mixins/object_actions.rb} +1 -0
  8. data/lib/restful_objects/{object_base.rb → domain_model/mixins/object_base.rb} +46 -13
  9. data/lib/restful_objects/{object_collections.rb → domain_model/mixins/object_collections.rb} +1 -0
  10. data/lib/restful_objects/{object_macros.rb → domain_model/mixins/object_macros.rb} +4 -3
  11. data/lib/restful_objects/{object_properties.rb → domain_model/mixins/object_properties.rb} +49 -7
  12. data/lib/restful_objects/{service.rb → domain_model/mixins/service.rb} +3 -2
  13. data/lib/restful_objects/{action_description.rb → domain_model/types/action_description.rb} +2 -0
  14. data/lib/restful_objects/{collection_description.rb → domain_model/types/collection_description.rb} +0 -0
  15. data/lib/restful_objects/{type.rb → domain_model/types/domain_type.rb} +28 -8
  16. data/lib/restful_objects/{parameter_description.rb → domain_model/types/parameter_description.rb} +0 -0
  17. data/lib/restful_objects/{parameter_description_list.rb → domain_model/types/parameter_description_list.rb} +3 -0
  18. data/lib/restful_objects/{property_description.rb → domain_model/types/property_description.rb} +23 -13
  19. data/lib/restful_objects/domain_model/user.rb +31 -0
  20. data/lib/restful_objects/router/base.rb +41 -0
  21. data/lib/restful_objects/router/domain_object_resources.rb +97 -0
  22. data/lib/restful_objects/router/domain_type_resources.rb +37 -0
  23. data/lib/restful_objects/router/supporting_resources.rb +39 -0
  24. data/lib/restful_objects/version.rb +1 -1
  25. data/lib/restful_objects.rb +3 -25
  26. data/spec/acceptance/generate_json_representations_spec.rb +102 -0
  27. data/spec/integration/domain-types_properties_spec.rb +76 -1
  28. data/spec/integration/domain_model_spec.rb +35 -0
  29. data/spec/spec_helper.rb +18 -3
  30. data/spec/unit/object_spec.rb +0 -73
  31. data/spec/unit/type_list_spec.rb +2 -2
  32. metadata +26 -26
  33. data/lib/restful_objects/action_list.rb +0 -17
  34. data/lib/restful_objects/collection_list.rb +0 -17
  35. data/lib/restful_objects/domain_model.rb +0 -83
  36. data/lib/restful_objects/http_response.rb +0 -11
  37. data/lib/restful_objects/object_list.rb +0 -16
  38. data/lib/restful_objects/property_list.rb +0 -17
  39. data/lib/restful_objects/server.rb +0 -131
  40. data/lib/restful_objects/service_list.rb +0 -55
  41. data/lib/restful_objects/type_list.rb +0 -30
  42. data/lib/restful_objects/user.rb +0 -30
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: restful_objects
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pablo Vizcay
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-05 00:00:00.000000000 Z
11
+ date: 2014-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -103,36 +103,34 @@ extensions: []
103
103
  extra_rdoc_files: []
104
104
  files:
105
105
  - bin/restful_server
106
- - lib/restful_objects/server.rb
107
- - lib/restful_objects/property_description.rb
108
- - lib/restful_objects/action_list.rb
109
- - lib/restful_objects/object_list.rb
110
- - lib/restful_objects/parameter_description_list.rb
111
- - lib/restful_objects/user.rb
112
- - lib/restful_objects/object_macros.rb
113
- - lib/restful_objects/domain_model.rb
114
- - lib/restful_objects/collection_list.rb
115
- - lib/restful_objects/link_generator.rb
116
- - lib/restful_objects/object_properties.rb
117
- - lib/restful_objects/service.rb
118
- - lib/restful_objects/action_description.rb
119
- - lib/restful_objects/http_response.rb
120
- - lib/restful_objects/object_collections.rb
121
- - lib/restful_objects/type_list.rb
122
- - lib/restful_objects/parameter_description.rb
106
+ - lib/restful_objects/router/domain_type_resources.rb
107
+ - lib/restful_objects/router/domain_object_resources.rb
108
+ - lib/restful_objects/router/supporting_resources.rb
109
+ - lib/restful_objects/router/base.rb
123
110
  - lib/restful_objects/version.rb
124
- - lib/restful_objects/object_base.rb
125
- - lib/restful_objects/type.rb
126
- - lib/restful_objects/object_actions.rb
127
- - lib/restful_objects/object.rb
128
- - lib/restful_objects/collection_description.rb
129
- - lib/restful_objects/property_list.rb
130
- - lib/restful_objects/service_list.rb
111
+ - lib/restful_objects/domain_model/types/property_description.rb
112
+ - lib/restful_objects/domain_model/types/parameter_description_list.rb
113
+ - lib/restful_objects/domain_model/types/domain_type.rb
114
+ - lib/restful_objects/domain_model/types/action_description.rb
115
+ - lib/restful_objects/domain_model/types/parameter_description.rb
116
+ - lib/restful_objects/domain_model/types/collection_description.rb
117
+ - lib/restful_objects/domain_model/mixins/object_macros.rb
118
+ - lib/restful_objects/domain_model/mixins/object_properties.rb
119
+ - lib/restful_objects/domain_model/mixins/service.rb
120
+ - lib/restful_objects/domain_model/mixins/object_collections.rb
121
+ - lib/restful_objects/domain_model/mixins/object_base.rb
122
+ - lib/restful_objects/domain_model/mixins/object_actions.rb
123
+ - lib/restful_objects/domain_model/mixins/object.rb
124
+ - lib/restful_objects/domain_model/user.rb
125
+ - lib/restful_objects/domain_model/domain_model.rb
126
+ - lib/restful_objects/domain_model/helpers/link_generator.rb
131
127
  - lib/restful_objects.rb
128
+ - spec/integration/domain_model_spec.rb
132
129
  - spec/integration/domain-types_properties_spec.rb
133
130
  - spec/integration/domain-types_collections_spec.rb
134
131
  - spec/integration/domain-types_actions_spec.rb
135
132
  - spec/integration/server-root_spec.rb
133
+ - spec/acceptance/generate_json_representations_spec.rb
136
134
  - spec/spec_helper.rb
137
135
  - spec/unit/service_spec.rb
138
136
  - spec/unit/object_collections_spec.rb
@@ -167,10 +165,12 @@ signing_key:
167
165
  specification_version: 4
168
166
  summary: This gem is a framework for implementing Restful Objects servers.
169
167
  test_files:
168
+ - spec/integration/domain_model_spec.rb
170
169
  - spec/integration/domain-types_properties_spec.rb
171
170
  - spec/integration/domain-types_collections_spec.rb
172
171
  - spec/integration/domain-types_actions_spec.rb
173
172
  - spec/integration/server-root_spec.rb
173
+ - spec/acceptance/generate_json_representations_spec.rb
174
174
  - spec/spec_helper.rb
175
175
  - spec/unit/service_spec.rb
176
176
  - spec/unit/object_collections_spec.rb
@@ -1,17 +0,0 @@
1
- module RestfulObjects
2
- class ActionList
3
- extend Forwardable
4
-
5
- def initialize(domain_type)
6
- @actions = Hash.new
7
- @domain_type = domain_type
8
- end
9
-
10
- def add(id, options = {})
11
- options[:member_order] ||= count + 1
12
- @actions[id] = ActionDescription.new(id, @domain_type, options)
13
- end
14
-
15
- def_delegators :@actions, :[], :each, :include?, :count, :empty?
16
- end
17
- end
@@ -1,17 +0,0 @@
1
- module RestfulObjects
2
- class CollectionList
3
- extend Forwardable
4
-
5
- def initialize(domain_type)
6
- @domain_type = domain_type
7
- @collections = Hash.new
8
- end
9
-
10
- def add(name, type, options = {})
11
- options[:member_order] ||= count + 1
12
- @collections[name] = CollectionDescription.new(name, type, @domain_type, options)
13
- end
14
-
15
- def_delegators :@collections, :[], :each, :each_key, :each_value, :include?, :count, :empty?, :clear
16
- end
17
- end
@@ -1,83 +0,0 @@
1
- module RestfulObjects
2
- class DomainModel
3
- include LinkGenerator
4
-
5
- attr_accessor :base_url, :compatible_mode
6
- attr_reader :metadata_schema, :version, :user, :types, :services, :objects
7
-
8
- def self.current
9
- @current ||= DomainModel.new
10
- end
11
-
12
- def self.current=(value)
13
- @current = value
14
- end
15
-
16
- def initialize
17
- @base_url = 'http://localhost'
18
- @metadata_schema = :selectable
19
- @compatible_mode = false
20
- @user = User.new(@base_url, 'anonymous')
21
- @types = TypeList.new
22
- @services = ServiceList.new(@base_url)
23
- @objects = ObjectList.new(@base_url)
24
- end
25
-
26
- def get_homepage
27
- { 'links' => [
28
- link_to(:self, '/', :homepage),
29
- link_to(:user, '/user', :user),
30
- link_to(:services, '/services', :list),
31
- link_to(:version, '/version', :version),
32
- link_to(:domain_types, '/domain-types', :type_list)
33
- ],
34
- 'extensions' => {}
35
- }.to_json
36
- end
37
-
38
- def get_version
39
- { 'links' => [
40
- link_to(:self, '/version', :version),
41
- link_to(:up, '/', :homepage),
42
- ],
43
- 'specVersion' => '1.0',
44
- 'optionalCapabilities' => {
45
- 'blobsClobs' => true,
46
- 'deleteObjects' => true,
47
- 'domainModel' => metadata_schema.to_s,
48
- 'protoPersistentObjects' => true,
49
- 'validateOnly' => false
50
- },
51
- 'extensions' => {}
52
- }.to_json
53
- end
54
-
55
- def get_user
56
- @user.get_as_json
57
- end
58
-
59
- def get_services
60
- services.get_list
61
- end
62
-
63
- def metadata_schema=(value)
64
- if not [:simple, :formal, :selectable].include?(value)
65
- raise "invalid metadata schema, choose :simple, :formal or :selectable"
66
- end
67
- @metadata_schema = value
68
- end
69
-
70
- def reset
71
- @base_url = 'http://localhost'
72
- @user = nil
73
- @types.clear
74
- @services.clear
75
- @objects.clear
76
- end
77
-
78
- def reset_objects
79
- @objects.clear
80
- end
81
- end
82
- end
83
-
@@ -1,11 +0,0 @@
1
- module RestfulObjects
2
- class HttpResponse
3
- attr_accessor :body, :content_type, :status
4
-
5
- def initialize(body, content_type, status = 200)
6
- @body = body
7
- @content_type = content_type
8
- @status = status
9
- end
10
- end
11
- end
@@ -1,16 +0,0 @@
1
- module RestfulObjects
2
- class ObjectList
3
- extend Forwardable
4
-
5
- def initialize(base_url)
6
- @objects = Hash.new
7
- @base_url = base_url
8
- end
9
-
10
- def register(instance, service = false)
11
- @objects[instance.object_id] = instance
12
- end
13
-
14
- def_delegators :@objects, :[], :each, :include?, :count, :clear, :empty?, :keys, :values
15
- end
16
- end
@@ -1,17 +0,0 @@
1
- module RestfulObjects
2
- class PropertyList
3
- extend Forwardable
4
-
5
- def initialize(domain_type)
6
- @properties = Hash.new
7
- @domain_type = domain_type
8
- end
9
-
10
- def add(id, return_type, options = {})
11
- options[:member_order] ||= count + 1
12
- @properties[id] = PropertyDescription.new(id, @domain_type, return_type, options)
13
- end
14
-
15
- def_delegators :@properties, :[], :each, :include?, :count, :empty?
16
- end
17
- end
@@ -1,131 +0,0 @@
1
- module RestfulObjects
2
- class Server < Sinatra::Base
3
- set :bind, '0.0.0.0' # listen at all networks (needed for using with vagrant port forwarding)
4
-
5
- after do
6
- headers['Access-Control-Allow-Origin'] = '*'
7
- end
8
-
9
- # B. SUPPORTING RESOURCES
10
- # B.5 Homepage
11
- get '/' do
12
- model.get_homepage
13
- end
14
- # B.6 User
15
- get "/user" do
16
- model.get_user_as_json
17
- end
18
- # B.7 Services
19
- get "/services" do
20
- model.get_services
21
- end
22
- # B.8 Version
23
- get '/version' do
24
- model.get_version
25
- end
26
- # B.9 Objects of Type Resource
27
- post '/objects/:domain_type' do
28
- populate_response model.types[params[:domain_type]].post_prototype_object(request.body.read)
29
- end
30
- # C. DOMAIN OBJECT RESOURCES
31
- # C.14 Domain Object
32
- get "/objects/:domain_type/:instance_id" do
33
- populate_response model.objects[params[:instance_id].to_i].get_representation
34
- end
35
- delete "/objects/:domain_type/:instance_id" do
36
- model.objects[params[:instance_id].to_i].rs_delete
37
- end
38
- # C.15 Domain Services
39
- get "/services/:service_id" do
40
- populate_response model.services[params[:service_id]].get_representation
41
- end
42
- # C.16 Property
43
- get "/objects/:domain_type/:instance_id/properties/:property_id" do
44
- model.objects[params[:instance_id].to_i].get_property_as_json(params[:property_id])
45
- end
46
- put "/objects/:domain_type/:instance_id/properties/:property_id" do
47
- model.objects[params[:instance_id].to_i].put_property_as_json(params[:property_id], request.body.read)
48
- end
49
- delete "/objects/:domain_type/:instance_id/properties/:property_id" do
50
- model.objects[params[:instance_id].to_i].clear_property(params[:property_id])
51
- end
52
- # C.17 Collection #
53
- get "/objects/:domain_type/:instance_id/collections/:collection_id" do
54
- model.objects[params[:instance_id].to_i].get_collection_as_json(params[:collection_id])
55
- end
56
- put "/objects/:domain_type/:instance_id/collections/:collection_id" do
57
- model.objects[params[:instance_id].to_i].add_to_collection(params[:collection_id], request.body.read)
58
- end
59
- delete "/objects/:domain_type/:instance_id/collections/:collection_id" do
60
- model.objects[params[:instance_id].to_i].delete_from_collection(params[:collection_id], request.body.read)
61
- end
62
- # C.18 Action
63
- get "/objects/:domain_type/:instance_id/actions/:action_id" do
64
- model.objects[params[:instance_id].to_i].get_action(params[:action_id])
65
- end
66
- get "/services/:service_id/actions/:action_id" do
67
- model.services[params[:service_id]].get_action(params[:action_id])
68
- end
69
- # C.19 Action Invoke
70
- get "/objects/:domain_type/:instance_id/actions/:action_id/invoke" do
71
- model.objects[params[:instance_id].to_i].get_action_invoke(params[:action_id], process_params)
72
- end
73
- get "/services/:service_id/actions/:action_id/invoke" do
74
- model.services[params[:service_id]].get_action_invoke(params[:action_id], process_params)
75
- end
76
- post "/objects/:domain_type/:instance_id/actions/:action_id/invoke" do
77
- model.objects[params[:instance_id].to_i].get_action_invoke(params[:action_id], request.body.read)
78
- end
79
- post "/services/:service_id/actions/:action_id/invoke" do
80
- model.services[params[:service_id]].get_action_invoke(params[:action_id], request.body.read)
81
- end
82
- # D. DOMAIN TYPE RESOURCES #
83
- # D.21 Domain Types
84
- get "/domain-types" do
85
- model.types.get_representation
86
- end
87
- # D.22 Domain Type
88
- get "/domain-types/:domain_type" do
89
- model.types[params[:domain_type]].get_representation
90
- end
91
- # D.23 Domain Type Property
92
- get "/domain-types/:domain_type/properties/:property_id" do
93
- model.types[params[:domain_type]].properties[params[:property_id]].get_representation
94
- end
95
- # D.24 Domain Type Collection
96
- get "/domain-types/:domain_type/collections/:collection_id" do
97
- model.types[params[:domain_type]].collections[params[:collection_id]].get_representation
98
- end
99
- # D.25 Domain Type Action
100
- get "/domain-types/:domain_type/actions/:action_id" do
101
- model.types[params[:domain_type]].actions[params[:action_id]].get_representation
102
- end
103
- # D.26 Domain Type Action Parameter
104
-
105
- # D.27 Domain Type Action Invoke
106
-
107
- # ------------------------------------------------------------------------------------------ #
108
- helpers do
109
- def model
110
- RestfulObjects::DomainModel.current
111
- end
112
-
113
- def populate_response(http_response)
114
- content_type http_response.content_type
115
- status http_response.status
116
- body http_response.body
117
- end
118
-
119
- def process_params
120
- if request.query_string != ''
121
- query_params = CGI.parse(request.query_string)
122
- parameters = Hash.new
123
- query_params.each { |key, value| parameters[key] = { 'value' => value.first } }
124
- parameters.to_json
125
- else
126
- request.body.read
127
- end
128
- end
129
- end
130
- end
131
- end
@@ -1,55 +0,0 @@
1
- module RestfulObjects
2
- class ServiceList
3
- extend Forwardable
4
- include LinkGenerator
5
-
6
- def initialize(base_url)
7
- @services = Hash.new
8
- @base_url = base_url
9
- end
10
-
11
- def register(service)
12
- raise 'service registration should be done with a class' if not service.is_a? Class
13
- @services[service.name] = service
14
- end
15
-
16
- def get_list
17
- representation = {
18
- 'links' => [
19
- link_to(:self, '/services', :services),
20
- link_to(:up, '/', :homepage),
21
- ],
22
- 'value' => generate_values,
23
- 'extensions' => { }
24
- }.to_json
25
- end
26
-
27
- def [](key)
28
- value = @services[key]
29
- if value.is_a? Class
30
- value = value.new
31
- @services[key] = value
32
- end
33
- value
34
- end
35
-
36
- def_delegators :@services, :each, :include?, :count, :empty?, :clear
37
-
38
- private
39
-
40
- def generate_values
41
- ensure_all_created
42
- values = []
43
- each do |name, service|
44
- element = link_to(:service, "/services/#{name}", :object, service_id: name)
45
- element['title'] = service.title
46
- values << element
47
- end
48
- values
49
- end
50
-
51
- def ensure_all_created
52
- @services.each { |name, value| @services[name] = value.new if value.is_a? Class }
53
- end
54
- end
55
- end
@@ -1,30 +0,0 @@
1
- module RestfulObjects
2
- class TypeList
3
- extend Forwardable
4
- include LinkGenerator
5
-
6
- def initialize
7
- @types = Hash.new
8
- end
9
-
10
- def add(name)
11
- @types[name] = Type.new(name)
12
- end
13
-
14
- def get_representation
15
- response = {
16
- 'links' => [
17
- link_to(:self, '/domain-types', :type_list),
18
- link_to(:up, '/', :homepage),
19
- ],
20
- 'value' => []
21
- }
22
-
23
- each { |name, type| response['value'] << link_to(:domain_type, "/domain-types/#{name}", :domain_type) }
24
-
25
- response.to_json
26
- end
27
-
28
- def_delegators :@types, :[], :each, :include?, :size?, :clear, :empty?
29
- end
30
- end
@@ -1,30 +0,0 @@
1
- module RestfulObjects
2
- class User
3
- include LinkGenerator
4
-
5
- attr_reader :base_url, :user_name
6
- attr_accessor :friendly_name, :email
7
-
8
- def initialize(base_url, user_name)
9
- @base_url = base_url
10
- @user_name = user_name
11
- @friendly_name = ''
12
- @email = ''
13
- @roles = Array.new
14
- end
15
-
16
- def add_role(role)
17
- @roles.push(role)
18
- end
19
-
20
- def get_as_json
21
- { 'links' => [ gen_link('self', '/user', 'user'), gen_link('up', '/', 'homepage') ],
22
- 'userName' => @user_name,
23
- 'friendlyName' => @friendly_name,
24
- 'email' => @email,
25
- 'roles' => @roles,
26
- 'extensions' => {}
27
- }.to_json
28
- end
29
- end
30
- end