restful_objects 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/lib/restful_objects.rb +1 -2
  3. data/lib/restful_objects/domain_model/domain_model.rb +14 -11
  4. data/lib/restful_objects/domain_model/helpers/link_generator.rb +102 -90
  5. data/lib/restful_objects/domain_model/mixins/object.rb +10 -13
  6. data/lib/restful_objects/domain_model/mixins/object_actions.rb +106 -117
  7. data/lib/restful_objects/domain_model/mixins/object_base.rb +175 -131
  8. data/lib/restful_objects/domain_model/mixins/object_collections.rb +58 -71
  9. data/lib/restful_objects/domain_model/mixins/object_macros.rb +20 -26
  10. data/lib/restful_objects/domain_model/mixins/object_properties.rb +85 -98
  11. data/lib/restful_objects/domain_model/mixins/service.rb +9 -17
  12. data/lib/restful_objects/domain_model/types/action_description.rb +80 -82
  13. data/lib/restful_objects/domain_model/types/collection_description.rb +39 -40
  14. data/lib/restful_objects/domain_model/types/domain_type.rb +102 -105
  15. data/lib/restful_objects/domain_model/types/parameter_description.rb +42 -47
  16. data/lib/restful_objects/domain_model/types/parameter_description_list.rb +9 -12
  17. data/lib/restful_objects/domain_model/types/property_description.rb +62 -64
  18. data/lib/restful_objects/router.rb +6 -0
  19. data/lib/restful_objects/router/base.rb +23 -32
  20. data/lib/restful_objects/router/domain_object_resources.rb +89 -94
  21. data/lib/restful_objects/router/domain_type_resources.rb +24 -29
  22. data/lib/restful_objects/router/supporting_resources.rb +26 -31
  23. data/lib/restful_objects/version.rb +1 -1
  24. data/spec/integration/domain-types_actions_spec.rb +1 -3
  25. data/spec/integration/domain-types_collections_spec.rb +1 -39
  26. data/spec/integration/domain-types_properties_spec.rb +1 -78
  27. data/spec/integration/domain-types_spec.rb +39 -0
  28. data/spec/integration/{server-root_spec.rb → homepage_spec.rb} +2 -3
  29. data/spec/integration/objects_actions_spec.rb +7 -0
  30. data/spec/integration/objects_collections_spec.rb +169 -0
  31. data/spec/integration/objects_properties_spec.rb +122 -0
  32. data/spec/{acceptance/generate_json_representations_spec.rb → integration/objects_spec.rb} +12 -4
  33. data/spec/unit/object_actions_spec.rb +5 -5
  34. data/spec/unit/object_collections_spec.rb +1 -1
  35. data/spec/unit/object_properties_spec.rb +6 -6
  36. data/spec/unit/object_spec.rb +9 -9
  37. data/spec/unit/service_spec.rb +5 -5
  38. metadata +54 -35
  39. data/spec/integration/domain_model_spec.rb +0 -35
  40. data/spec/unit/type_list_spec.rb +0 -37
@@ -0,0 +1,6 @@
1
+ module RestfulObjects::Router
2
+ autoload :Base, 'restful_objects/router/base'
3
+ autoload :SupportingResources, 'restful_objects/router/supporting_resources'
4
+ autoload :DomainObjectResources, 'restful_objects/router/domain_object_resources'
5
+ autoload :DomainTypeResources, 'restful_objects/router/domain_type_resources'
6
+ end
@@ -1,41 +1,32 @@
1
- require_relative 'supporting_resources'
2
- require_relative 'domain_object_resources'
3
- require_relative 'domain_type_resources'
1
+ class RestfulObjects::Router::Base < Sinatra::Base
2
+ register RestfulObjects::Router::SupportingResources
3
+ register RestfulObjects::Router::DomainObjectResources
4
+ register RestfulObjects::Router::DomainTypeResources
4
5
 
5
- module RestfulObjects
6
- module Router
7
- class Base < Sinatra::Base
8
- register RestfulObjects::Router::SupportingResources
9
- register RestfulObjects::Router::DomainObjectResources
10
- register RestfulObjects::Router::DomainTypeResources
6
+ set :bind, '0.0.0.0' # listen at all networks (needed for example using vagrant port forwarding)
11
7
 
12
- set :bind, '0.0.0.0' # listen at all networks (needed for example using vagrant port forwarding)
13
-
14
- after do
15
- headers['Access-Control-Allow-Origin'] = '*'
16
- end
8
+ after do
9
+ headers['Access-Control-Allow-Origin'] = '*'
10
+ end
17
11
 
18
- helpers do
19
- def model
20
- RestfulObjects::DomainModel.current
21
- end
12
+ helpers do
13
+ def model
14
+ RestfulObjects::DomainModel.current
15
+ end
22
16
 
23
- def objects
24
- RestfulObjects::DomainModel.current.objects
25
- end
17
+ def objects
18
+ RestfulObjects::DomainModel.current.objects
19
+ end
26
20
 
27
- def process_params
28
- if request.query_string != ''
29
- query_params = CGI.parse(request.query_string)
30
- parameters = Hash.new
31
- query_params.each { |key, value| parameters[key] = { 'value' => value.first } }
32
- parameters.to_json
33
- else
34
- request.body.read
35
- end
36
- end
21
+ def process_params
22
+ if request.query_string != ''
23
+ query_params = CGI.parse(request.query_string)
24
+ parameters = Hash.new
25
+ query_params.each { |key, value| parameters[key] = { 'value' => value.first } }
26
+ parameters.to_json
27
+ else
28
+ request.body.read
37
29
  end
38
30
  end
39
31
  end
40
32
  end
41
-
@@ -1,97 +1,92 @@
1
- module RestfulObjects
2
- module Router
3
- module DomainObjectResources
4
- def self.registered(router)
5
- # ** 14 Domain Object Resource & Representation **
6
- # 14.1
7
- router.get '/objects/:domain_type/:instance_id' do
8
- objects[params[:instance_id].to_i].get_representation
9
- end
10
-
11
- # 14.2
12
- router.put '/objects/:domain_type/:instance_id' do
13
- objects[params[:instance_id].to_i].put_properties_and_get_representation(request.body.read)
14
- end
15
-
16
- # 14.3
17
- router.delete '/objects/:domain_type/:instance_id' do
18
- objects[params[:instance_id].to_i].rs_delete
19
- end
20
-
21
- # patch to allow cross-origin put & delete requests #
22
- router.options "/objects/:domain_type/:instance_id" do
23
- headers['Access-Control-Allow-Methods'] = 'GET, DELETE, PUT, OPTIONS'
24
- headers['Access-Control-Allow-Headers'] = 'Origin, Content-Type, Methods'
25
- end
26
-
27
- # C.15 Domain Services
28
- router.get "/services/:service_id" do
29
- model.services[params[:service_id]].get_representation
30
- end
31
-
32
- # C.16 Property
33
- router.get "/objects/:domain_type/:instance_id/properties/:property_id" do
34
- objects[params[:instance_id].to_i].get_property_as_json(params[:property_id])
35
- end
36
-
37
- router.put "/objects/:domain_type/:instance_id/properties/:property_id" do
38
- objects[params[:instance_id].to_i].put_property_as_json(params[:property_id], request.body.read)
39
- end
40
-
41
- router.delete "/objects/:domain_type/:instance_id/properties/:property_id" do
42
- objects[params[:instance_id].to_i].clear_property(params[:property_id])
43
- end
44
-
45
- # C.17 Collection #
46
- router.get "/objects/:domain_type/:instance_id/collections/:collection_id" do
47
- objects[params[:instance_id].to_i].get_collection_as_json(params[:collection_id])
48
- end
49
-
50
- router.post "/objects/:domain_type/:instance_id/collections/:collection_id" do
51
- objects[params[:instance_id].to_i].add_to_collection(params[:collection_id], request.body.read)
52
- end
53
-
54
- router.put "/objects/:domain_type/:instance_id/collections/:collection_id" do
55
- objects[params[:instance_id].to_i].add_to_collection(params[:collection_id], request.body.read)
56
- end
57
-
58
- router.delete "/objects/:domain_type/:instance_id/collections/:collection_id" do
59
- objects[params[:instance_id].to_i].delete_from_collection(params[:collection_id], request.body.read)
60
- end
61
-
62
- # patch to allow cross-origin put & delete requests #
63
- router.options "/objects/:domain_type/:instance_id/collections/:collection_id" do
64
- headers['Access-Control-Allow-Methods'] = 'GET, DELETE, PUT, OPTIONS'
65
- headers['Access-Control-Allow-Headers'] = 'Origin, Content-Type, Methods'
66
- end
67
-
68
- # C.18 Action
69
- router.get "/objects/:domain_type/:instance_id/actions/:action_id" do
70
- objects[params[:instance_id].to_i].get_action(params[:action_id])
71
- end
72
-
73
- router.get "/services/:service_id/actions/:action_id" do
74
- model.services[params[:service_id]].get_action(params[:action_id])
75
- end
76
-
77
- # C.19 Action Invoke
78
- router.get "/objects/:domain_type/:instance_id/actions/:action_id/invoke" do
79
- objects[params[:instance_id].to_i].get_action_invoke(params[:action_id], process_params)
80
- end
81
-
82
- router.get "/services/:service_id/actions/:action_id/invoke" do
83
- model.services[params[:service_id]].get_action_invoke(params[:action_id], process_params)
84
- end
85
-
86
- router.post "/objects/:domain_type/:instance_id/actions/:action_id/invoke" do
87
- objects[params[:instance_id].to_i].get_action_invoke(params[:action_id], request.body.read)
88
- end
89
-
90
- router.post "/services/:service_id/actions/:action_id/invoke" do
91
- model.services[params[:service_id]].get_action_invoke(params[:action_id], request.body.read)
92
- end
93
- end
1
+ module RestfulObjects::Router::DomainObjectResources
2
+ def self.registered(router)
3
+ # ** 14 Domain Object Resource & Representation **
4
+ # 14.1
5
+ router.get '/objects/:domain_type/:instance_id' do
6
+ objects[params[:instance_id].to_i].ro_get_representation_response
7
+ end
8
+
9
+ # 14.2
10
+ router.put '/objects/:domain_type/:instance_id' do
11
+ objects[params[:instance_id].to_i].ro_put_multiple_properties_and_get_response(request.body.read)
12
+ end
13
+
14
+ # 14.3
15
+ router.delete '/objects/:domain_type/:instance_id' do
16
+ objects[params[:instance_id].to_i].ro_delete
17
+ end
18
+
19
+ # patch to allow cross-origin put & delete requests #
20
+ router.options "/objects/:domain_type/:instance_id" do
21
+ headers['Access-Control-Allow-Methods'] = 'GET, DELETE, PUT, OPTIONS'
22
+ headers['Access-Control-Allow-Headers'] = 'Origin, Content-Type, Methods'
23
+ end
24
+
25
+ # C.15 Domain Services
26
+ router.get "/services/:service_id" do
27
+ model.services[params[:service_id]].ro_get_representation_response
28
+ end
29
+
30
+ # C.16 Property
31
+ router.get "/objects/:domain_type/:instance_id/properties/:property_id" do
32
+ objects[params[:instance_id].to_i].ro_get_property_response(params[:property_id])
33
+ end
34
+
35
+ router.put "/objects/:domain_type/:instance_id/properties/:property_id" do
36
+ objects[params[:instance_id].to_i].ro_put_property_and_get_response(params[:property_id], request.body.read)
37
+ end
38
+
39
+ router.delete "/objects/:domain_type/:instance_id/properties/:property_id" do
40
+ objects[params[:instance_id].to_i].ro_clear_property_and_get_response(params[:property_id])
41
+ end
42
+
43
+ # C.17 Collection #
44
+ router.get "/objects/:domain_type/:instance_id/collections/:collection_id" do
45
+ objects[params[:instance_id].to_i].ro_get_collection_response(params[:collection_id])
46
+ end
47
+
48
+ router.post "/objects/:domain_type/:instance_id/collections/:collection_id" do
49
+ objects[params[:instance_id].to_i].ro_add_to_collection_and_get_response(params[:collection_id], request.body.read)
50
+ end
51
+
52
+ router.put "/objects/:domain_type/:instance_id/collections/:collection_id" do
53
+ objects[params[:instance_id].to_i].ro_add_to_collection_and_get_response(params[:collection_id], request.body.read)
54
+ end
55
+
56
+ router.delete "/objects/:domain_type/:instance_id/collections/:collection_id" do
57
+ objects[params[:instance_id].to_i].ro_delete_from_collection_and_get_response(params[:collection_id], request.body.read)
58
+ end
59
+
60
+ # patch to allow cross-origin put & delete requests #
61
+ router.options "/objects/:domain_type/:instance_id/collections/:collection_id" do
62
+ headers['Access-Control-Allow-Methods'] = 'GET, DELETE, PUT, OPTIONS'
63
+ headers['Access-Control-Allow-Headers'] = 'Origin, Content-Type, Methods'
64
+ end
65
+
66
+ # C.18 Action
67
+ router.get "/objects/:domain_type/:instance_id/actions/:action_id" do
68
+ objects[params[:instance_id].to_i].ro_get_action_response(params[:action_id])
69
+ end
70
+
71
+ router.get "/services/:service_id/actions/:action_id" do
72
+ model.services[params[:service_id]].ro_get_action_response(params[:action_id])
73
+ end
74
+
75
+ # C.19 Action Invoke
76
+ router.get "/objects/:domain_type/:instance_id/actions/:action_id/invoke" do
77
+ objects[params[:instance_id].to_i].ro_invoke_action_and_get_response(params[:action_id], process_params)
78
+ end
79
+
80
+ router.get "/services/:service_id/actions/:action_id/invoke" do
81
+ model.services[params[:service_id]].ro_invoke_action_and_get_response(params[:action_id], process_params)
82
+ end
83
+
84
+ router.post "/objects/:domain_type/:instance_id/actions/:action_id/invoke" do
85
+ objects[params[:instance_id].to_i].ro_invoke_action_and_get_response(params[:action_id], request.body.read)
86
+ end
87
+
88
+ router.post "/services/:service_id/actions/:action_id/invoke" do
89
+ model.services[params[:service_id]].ro_invoke_action_and_get_response(params[:action_id], request.body.read)
94
90
  end
95
91
  end
96
92
  end
97
-
@@ -1,37 +1,32 @@
1
- module RestfulObjects
2
- module Router
3
- module DomainTypeResources
4
- def self.registered(router)
5
- # D.21 Domain Types
6
- router.get "/domain-types" do
7
- model.get_type_list_representation
8
- end
1
+ module RestfulObjects::Router::DomainTypeResources
2
+ def self.registered(router)
3
+ # D.21 Domain Types
4
+ router.get "/domain-types" do
5
+ model.get_type_list_representation
6
+ end
9
7
 
10
- # D.22 Domain Type
11
- router.get "/domain-types/:domain_type" do
12
- model.types[params[:domain_type]].get_representation
13
- end
8
+ # D.22 Domain Type
9
+ router.get "/domain-types/:domain_type" do
10
+ model.types[params[:domain_type]].get_representation
11
+ end
14
12
 
15
- # D.23 Domain Type Property
16
- router.get "/domain-types/:domain_type/properties/:property_id" do
17
- model.types[params[:domain_type]].properties[params[:property_id]].get_representation
18
- end
13
+ # D.23 Domain Type Property
14
+ router.get "/domain-types/:domain_type/properties/:property_id" do
15
+ model.types[params[:domain_type]].properties[params[:property_id]].get_representation
16
+ end
19
17
 
20
- # D.24 Domain Type Collection
21
- router.get "/domain-types/:domain_type/collections/:collection_id" do
22
- model.types[params[:domain_type]].collections[params[:collection_id]].get_representation
23
- end
18
+ # D.24 Domain Type Collection
19
+ router.get "/domain-types/:domain_type/collections/:collection_id" do
20
+ model.types[params[:domain_type]].collections[params[:collection_id]].get_representation
21
+ end
24
22
 
25
- # D.25 Domain Type Action
26
- router.get "/domain-types/:domain_type/actions/:action_id" do
27
- model.types[params[:domain_type]].actions[params[:action_id]].get_representation
28
- end
23
+ # D.25 Domain Type Action
24
+ router.get "/domain-types/:domain_type/actions/:action_id" do
25
+ model.types[params[:domain_type]].actions[params[:action_id]].get_representation
26
+ end
29
27
 
30
- # D.26 Domain Type Action Parameter
28
+ # D.26 Domain Type Action Parameter
31
29
 
32
- # D.27 Domain Type Action Invoke
33
- end
34
- end
30
+ # D.27 Domain Type Action Invoke
35
31
  end
36
32
  end
37
-
@@ -1,39 +1,34 @@
1
- module RestfulObjects
2
- module Router
3
- module SupportingResources
4
- def self.registered(router)
5
- # B.5 Homepage
6
- router.get '/' do
7
- model.get_homepage
8
- end
1
+ module RestfulObjects::Router::SupportingResources
2
+ def self.registered(router)
3
+ # B.5 Homepage
4
+ router.get '/' do
5
+ model.get_homepage_representation_response
6
+ end
9
7
 
10
- # B.6 User
11
- router.get '/user' do
12
- model.get_user_as_json
13
- end
8
+ # B.6 User
9
+ router.get '/user' do
10
+ model.get_user_as_json
11
+ end
14
12
 
15
- # B.7 Services
16
- router.get '/services' do
17
- model.get_services
18
- end
13
+ # B.7 Services
14
+ router.get '/services' do
15
+ model.get_services
16
+ end
19
17
 
20
- # B.8 Version
21
- router.get '/version' do
22
- model.get_version
23
- end
18
+ # B.8 Version
19
+ router.get '/version' do
20
+ model.get_version_representation_response
21
+ end
24
22
 
25
- # B.9 Objects of Type Resource
26
- router.post '/objects/:domain_type' do
27
- model.types[params[:domain_type]].post_prototype_object(request.body.read)
28
- end
23
+ # B.9 Objects of Type Resource
24
+ router.post '/objects/:domain_type' do
25
+ model.types[params[:domain_type]].post_prototype_object(request.body.read)
26
+ end
29
27
 
30
- # patch to allow cross-origin put & delete requests #
31
- router.options '/objects/:domain_type' do
32
- headers['Access-Control-Allow-Methods'] = 'POST, OPTIONS'
33
- headers['Access-Control-Allow-Headers'] = 'Origin, Content-Type, Methods'
34
- end
35
- end
28
+ # patch to allow cross-origin put & delete requests #
29
+ router.options '/objects/:domain_type' do
30
+ headers['Access-Control-Allow-Methods'] = 'POST, OPTIONS'
31
+ headers['Access-Control-Allow-Headers'] = 'Origin, Content-Type, Methods'
36
32
  end
37
33
  end
38
34
  end
39
-
@@ -1,3 +1,3 @@
1
1
  module RestfulObjects
2
- VERSION = '0.0.7'
2
+ VERSION = '0.0.8'
3
3
  end
@@ -1,7 +1,6 @@
1
- # encoding: utf-8
2
1
  require_relative '../spec_helper'
3
2
 
4
- describe '/domain-types/:type/actions/:action' do
3
+ describe '=> /domain-types/:type/actions/' do
5
4
  before(:all) do
6
5
  RestfulObjects::DomainModel.current.reset
7
6
  end
@@ -40,4 +39,3 @@ describe '/domain-types/:type/actions/:action' do
40
39
  last_response.body.should match_json_expression expected
41
40
  end
42
41
  end
43
-
@@ -1,45 +1,7 @@
1
- # encoding: utf-8
2
1
  require_relative '../spec_helper'
3
2
 
4
- describe '/domain-types/:type/collections/:collection' do
3
+ describe '=> /domain-types/:type/collections/' do
5
4
  before(:all) do
6
5
  RestfulObjects::DomainModel.current.reset
7
6
  end
8
-
9
- it 'should generate a collection description representation' do
10
- class CollectionTest
11
- include RestfulObjects::Object
12
- collection :items, 'ItemClass', friendly_name: 'item collection', description: 'a collection description'
13
- end
14
-
15
- expected = {
16
- 'id' => 'items',
17
- 'friendlyName' => 'item collection',
18
- 'description' => 'a collection description',
19
- 'memberOrder' => 1,
20
- 'links' => [
21
- { 'rel' => 'self',
22
- 'href' => 'http://localhost/domain-types/CollectionTest/collections/items',
23
- 'type' => 'application/json;profile="urn:org.restfulobjects:repr-types/collection-description"',
24
- 'method' => 'GET' },
25
- { 'rel' => 'up',
26
- 'href' => 'http://localhost/domain-types/CollectionTest',
27
- 'type' => 'application/json;profile="urn:org.restfulobjects:repr-types/domain-type"',
28
- 'method' => 'GET' },
29
- { 'rel' => 'urn:org.restfulobjects:rels/return-type',
30
- 'href' => 'http://localhost/domain-types/list',
31
- 'type' => 'application/json;profile="urn:org.restfulobjects:repr-types/domain-type"',
32
- 'method' => 'GET' },
33
- { 'rel' => 'urn:org.restfulobjects:rels/element-type',
34
- 'href' => 'http://localhost/domain-types/ItemClass',
35
- 'type' => 'application/json;profile="urn:org.restfulobjects:repr-types/domain-type"',
36
- 'method' => 'GET' }
37
- ],
38
- 'extensions' => wildcard_matcher
39
- }
40
-
41
- get '/domain-types/CollectionTest/collections/items'
42
- last_response.body.should match_json_expression expected
43
- end
44
7
  end
45
-