restful_objects 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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
+