restful_objects 0.0.2 → 0.0.3

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 (39) hide show
  1. checksums.yaml +8 -8
  2. data/README.md +3 -2
  3. data/bin/restful_server.rb +0 -0
  4. data/lib/restful_objects/action_description.rb +96 -82
  5. data/lib/restful_objects/action_list.rb +17 -17
  6. data/lib/restful_objects/collection_description.rb +47 -47
  7. data/lib/restful_objects/collection_list.rb +17 -17
  8. data/lib/restful_objects/domain_model.rb +83 -79
  9. data/lib/restful_objects/http_response.rb +11 -11
  10. data/lib/restful_objects/link_generator.rb +104 -104
  11. data/lib/restful_objects/object.rb +20 -20
  12. data/lib/restful_objects/object_actions.rb +134 -134
  13. data/lib/restful_objects/object_base.rb +10 -0
  14. data/lib/restful_objects/object_collections.rb +84 -84
  15. data/lib/restful_objects/object_list.rb +16 -16
  16. data/lib/restful_objects/object_macros.rb +35 -35
  17. data/lib/restful_objects/object_properties.rb +78 -78
  18. data/lib/restful_objects/parameter_description.rb +60 -60
  19. data/lib/restful_objects/parameter_description_list.rb +15 -15
  20. data/lib/restful_objects/property_description.rb +68 -68
  21. data/lib/restful_objects/property_list.rb +17 -17
  22. data/lib/restful_objects/service.rb +21 -21
  23. data/lib/restful_objects/service_list.rb +55 -55
  24. data/lib/restful_objects/type.rb +110 -110
  25. data/lib/restful_objects/type_list.rb +30 -30
  26. data/lib/restful_objects/user.rb +30 -30
  27. data/lib/restful_objects/version.rb +1 -1
  28. data/spec/integration/domain-types_actions_spec.rb +43 -43
  29. data/spec/integration/domain-types_collections_spec.rb +45 -45
  30. data/spec/integration/domain-types_properties_spec.rb +41 -41
  31. data/spec/integration/server-root_spec.rb +98 -98
  32. data/spec/spec_helper.rb +52 -52
  33. data/spec/unit/object_actions_spec.rb +380 -380
  34. data/spec/unit/object_collections_spec.rb +190 -190
  35. data/spec/unit/object_properties_spec.rb +215 -206
  36. data/spec/unit/object_spec.rb +228 -228
  37. data/spec/unit/service_spec.rb +125 -125
  38. data/spec/unit/type_list_spec.rb +37 -37
  39. metadata +2 -2
@@ -1,110 +1,110 @@
1
- module RestfulObjects
2
- class Type
3
- include LinkGenerator
4
-
5
- attr_reader :id, :is_service, :properties, :collections, :actions
6
- attr_accessor :friendly_name, :plural_name, :description
7
-
8
- def initialize(id)
9
- @id = id
10
- @properties = PropertyList.new(id)
11
- @collections = CollectionList.new(id)
12
- @actions = ActionList.new(id)
13
- @is_service = false
14
- @friendly_name = ''
15
- @plural_name = ''
16
- @description = ''
17
- end
18
-
19
- def get_representation
20
- { 'name' => @id,
21
- 'domainType' => @id,
22
- 'friendlyName' => @friendly_name,
23
- 'pluralName' => @plural_name,
24
- 'description' => @description,
25
- 'isService' => @is_service,
26
- 'members' => get_members,
27
- 'typeActions' => get_type_actions,
28
- 'links' => [ link_to(:self, "/domain-types/#{@id}", :domain_type) ],
29
- 'extensions' => {}
30
- }.to_json
31
- end
32
-
33
- def new_proto_persistent_object
34
- persist_link = link_to(:persist, "/objects/#{id}", :object, method: 'POST')
35
- persist_link['arguments'] = { 'members' => {} }
36
- members = {}
37
- properties.each do |name, property|
38
- if not property.optional
39
- persist_link['arguments']['members'][name] = {
40
- 'value' => nil,
41
- 'extensions' => property.metadata }
42
- end
43
- members[name] = { 'value' => nil }
44
- end
45
-
46
- { 'title' => "New #{id}",
47
- 'members' => members,
48
- 'links' => [ persist_link ],
49
- 'extensions' => {} }
50
- end
51
-
52
- def post_prototype_object(members_json)
53
- members = JSON.parse(members_json)['members']
54
-
55
- new_object = Object.const_get(@id.to_sym).new
56
-
57
- members.each do |name, value|
58
- if properties.include?(name) then
59
- new_object.put_property_as_json(name, value.to_json)
60
- else
61
- raise "member of property '#{name}' not found in type '#{@id}'"
62
- end
63
- end
64
-
65
- new_object.get_representation
66
- end
67
-
68
- def metadata
69
- { 'domainType' => id,
70
- 'friendlyName' => friendly_name,
71
- 'pluralName' => plural_name,
72
- 'description' => description,
73
- 'isService' => is_service }
74
- end
75
-
76
- private
77
-
78
- def get_members
79
- properties_members.merge(collections_members.merge(actions_members))
80
- end
81
-
82
- def properties_members
83
- result = Hash.new
84
- @properties.each do |name, property|
85
- result[name] = link_to(:property, "/domain-types/#{@id}/properties/#{name}", :property_description)
86
- end
87
- result
88
- end
89
-
90
- def collections_members
91
- result = Hash.new
92
- @collections.each do |name, collection|
93
- result[name] = link_to(:collection, "/domain-types/#{@id}/collections/#{name}", :collection_description)
94
- end
95
- result
96
- end
97
-
98
- def actions_members
99
- result = Hash.new
100
- @actions.each do |name, action|
101
- result[name] = link_to(:action, "/domain-types/#{@id}/actions/#{name}", :action_description)
102
- end
103
- result
104
- end
105
-
106
- def get_type_actions
107
- {}
108
- end
109
- end
110
- end
1
+ module RestfulObjects
2
+ class Type
3
+ include LinkGenerator
4
+
5
+ attr_reader :id, :is_service, :properties, :collections, :actions
6
+ attr_accessor :friendly_name, :plural_name, :description
7
+
8
+ def initialize(id)
9
+ @id = id
10
+ @properties = PropertyList.new(id)
11
+ @collections = CollectionList.new(id)
12
+ @actions = ActionList.new(id)
13
+ @is_service = false
14
+ @friendly_name = ''
15
+ @plural_name = ''
16
+ @description = ''
17
+ end
18
+
19
+ def get_representation
20
+ { 'name' => @id,
21
+ 'domainType' => @id,
22
+ 'friendlyName' => @friendly_name,
23
+ 'pluralName' => @plural_name,
24
+ 'description' => @description,
25
+ 'isService' => @is_service,
26
+ 'members' => get_members,
27
+ 'typeActions' => get_type_actions,
28
+ 'links' => [ link_to(:self, "/domain-types/#{@id}", :domain_type) ],
29
+ 'extensions' => {}
30
+ }.to_json
31
+ end
32
+
33
+ def new_proto_persistent_object
34
+ persist_link = link_to(:persist, "/objects/#{id}", :object, method: 'POST')
35
+ persist_link['arguments'] = { 'members' => {} }
36
+ members = {}
37
+ properties.each do |name, property|
38
+ if not property.optional
39
+ persist_link['arguments']['members'][name] = {
40
+ 'value' => nil,
41
+ 'extensions' => property.metadata }
42
+ end
43
+ members[name] = { 'value' => nil }
44
+ end
45
+
46
+ { 'title' => "New #{id}",
47
+ 'members' => members,
48
+ 'links' => [ persist_link ],
49
+ 'extensions' => {} }
50
+ end
51
+
52
+ def post_prototype_object(members_json)
53
+ members = JSON.parse(members_json)['members']
54
+
55
+ new_object = Object.const_get(@id.to_sym).new
56
+
57
+ members.each do |name, value|
58
+ if properties.include?(name) then
59
+ new_object.put_property_as_json(name, value.to_json)
60
+ else
61
+ raise "member of property '#{name}' not found in type '#{@id}'"
62
+ end
63
+ end
64
+
65
+ new_object.get_representation
66
+ end
67
+
68
+ def metadata
69
+ { 'domainType' => id,
70
+ 'friendlyName' => friendly_name,
71
+ 'pluralName' => plural_name,
72
+ 'description' => description,
73
+ 'isService' => is_service }
74
+ end
75
+
76
+ private
77
+
78
+ def get_members
79
+ properties_members.merge(collections_members.merge(actions_members))
80
+ end
81
+
82
+ def properties_members
83
+ result = Hash.new
84
+ @properties.each do |name, property|
85
+ result[name] = link_to(:property, "/domain-types/#{@id}/properties/#{name}", :property_description)
86
+ end
87
+ result
88
+ end
89
+
90
+ def collections_members
91
+ result = Hash.new
92
+ @collections.each do |name, collection|
93
+ result[name] = link_to(:collection, "/domain-types/#{@id}/collections/#{name}", :collection_description)
94
+ end
95
+ result
96
+ end
97
+
98
+ def actions_members
99
+ result = Hash.new
100
+ @actions.each do |name, action|
101
+ result[name] = link_to(:action, "/domain-types/#{@id}/actions/#{name}", :action_description)
102
+ end
103
+ result
104
+ end
105
+
106
+ def get_type_actions
107
+ {}
108
+ end
109
+ end
110
+ end
@@ -1,30 +1,30 @@
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
+ 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 +1,30 @@
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
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
@@ -1,3 +1,3 @@
1
1
  module RestfulObjects
2
- VERSION = "0.0.2"
2
+ VERSION = '0.0.3'
3
3
  end
@@ -1,43 +1,43 @@
1
- # encoding: utf-8
2
- require_relative '../spec_helper'
3
-
4
- describe '/domain-types/:type/actions/:action' do
5
- before(:all) do
6
- RestfulObjects::DomainModel.current.reset
7
- end
8
-
9
- it 'should generate an action description representation' do
10
- class ActionTest
11
- include RestfulObjects::Object
12
- action :do_something, :int, {}, friendly_name: 'do something!', description: 'description of something'
13
- end
14
-
15
- expected = {
16
- 'id' => 'do_something',
17
- 'friendlyName' => 'do something!',
18
- 'description' => 'description of something',
19
- 'hasParams' => false,
20
- 'memberOrder' => :integer,
21
- 'parameters' => {},
22
- 'links' => [
23
- { 'rel' => 'self',
24
- 'href' => 'http://localhost/domain-types/ActionTest/actions/do_something',
25
- 'type' => 'application/json;profile="urn:org.restfulobjects:repr-types/action-description"',
26
- 'method' => 'GET' },
27
- { 'rel' => 'up',
28
- 'href' => 'http://localhost/domain-types/ActionTest',
29
- 'type' => 'application/json;profile="urn:org.restfulobjects:repr-types/domain-type"',
30
- 'method' => 'GET' },
31
- { 'rel' => 'urn:org.restfulobjects:rels/return-type',
32
- 'href' => 'http://localhost/domain-types/int',
33
- 'type' => 'application/json;profile="urn:org.restfulobjects:repr-types/domain-type"',
34
- 'method' => 'GET' }
35
- ]
36
- }
37
-
38
- get '/domain-types/ActionTest/actions/do_something'
39
-
40
- last_response.body.should match_json_expression expected
41
- end
42
- end
43
-
1
+ # encoding: utf-8
2
+ require_relative '../spec_helper'
3
+
4
+ describe '/domain-types/:type/actions/:action' do
5
+ before(:all) do
6
+ RestfulObjects::DomainModel.current.reset
7
+ end
8
+
9
+ it 'should generate an action description representation' do
10
+ class ActionTest
11
+ include RestfulObjects::Object
12
+ action :do_something, return_type: :int, friendly_name: 'do something!', description: 'description of something'
13
+ end
14
+
15
+ expected = {
16
+ 'id' => 'do_something',
17
+ 'friendlyName' => 'do something!',
18
+ 'description' => 'description of something',
19
+ 'hasParams' => false,
20
+ 'memberOrder' => :integer,
21
+ 'parameters' => {},
22
+ 'links' => [
23
+ { 'rel' => 'self',
24
+ 'href' => 'http://localhost/domain-types/ActionTest/actions/do_something',
25
+ 'type' => 'application/json;profile="urn:org.restfulobjects:repr-types/action-description"',
26
+ 'method' => 'GET' },
27
+ { 'rel' => 'up',
28
+ 'href' => 'http://localhost/domain-types/ActionTest',
29
+ 'type' => 'application/json;profile="urn:org.restfulobjects:repr-types/domain-type"',
30
+ 'method' => 'GET' },
31
+ { 'rel' => 'urn:org.restfulobjects:rels/return-type',
32
+ 'href' => 'http://localhost/domain-types/int',
33
+ 'type' => 'application/json;profile="urn:org.restfulobjects:repr-types/domain-type"',
34
+ 'method' => 'GET' }
35
+ ]
36
+ }
37
+
38
+ get '/domain-types/ActionTest/actions/do_something'
39
+
40
+ last_response.body.should match_json_expression expected
41
+ end
42
+ end
43
+
@@ -1,45 +1,45 @@
1
- # encoding: utf-8
2
- require_relative '../spec_helper'
3
-
4
- describe '/domain-types/:type/collections/:collection' do
5
- before(:all) do
6
- RestfulObjects::DomainModel.current.reset
7
- 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
- end
45
-
1
+ # encoding: utf-8
2
+ require_relative '../spec_helper'
3
+
4
+ describe '/domain-types/:type/collections/:collection' do
5
+ before(:all) do
6
+ RestfulObjects::DomainModel.current.reset
7
+ 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
+ end
45
+