occi-core 4.0.0.alpha.3 → 4.0.0.alpha.4

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.
data/README.md CHANGED
@@ -14,8 +14,7 @@ Ruby
14
14
 
15
15
  The following setup is recommended
16
16
 
17
- * usage of the Ruby Version Manager
18
- * Ruby 1.9.3
17
+ * Ruby 1.9.3+
19
18
  * RubyGems installed
20
19
 
21
20
  The following libraries / packages may be required to use rOCCI
@@ -51,10 +50,15 @@ To build and install the bleeding edge version from master
51
50
  git clone git://github.com/gwdg/rOCCI-core.git
52
51
  cd rOCCI-core
53
52
  rvm install ruby-1.9.3
54
- rvm --create --ruby-version use 1.9.3@rOCCI-core
53
+ gem install bundler
55
54
  bundle install
56
55
  rake test
57
56
 
57
+ Documentation
58
+ -------------
59
+
60
+ [Code documentation can be found on RubyDoc.info](rubydoc.info/github/gwdg/rOCCI-core).
61
+
58
62
  Usage
59
63
  -----
60
64
  #### Logging
@@ -114,12 +118,12 @@ Currently only the following entries of OVF files are parsed
114
118
  * Disk in the DiskSection
115
119
  * Network in the NetworkSection
116
120
  * In the VirutalSystemSection:
117
- ** Info
118
- ** in the VirtualHardwareSection the items regarding
119
- *** Processor
120
- *** Memory
121
- *** Ethernet Adapter
122
- *** Parallel port
121
+ * Info
122
+ * in the VirtualHardwareSection the items regarding
123
+ * Processor
124
+ * Memory
125
+ * Ethernet Adapter
126
+ * Parallel port
123
127
 
124
128
  ### Using the OCCI model
125
129
 
@@ -128,6 +132,15 @@ The occi-core gem includes all OCCI Core classes necessary to handly arbitrary O
128
132
  Changelog
129
133
  ---------
130
134
 
135
+ ### Version 4.0
136
+ * introduced compatibility mode (for OCCI-OS, on by default)
137
+ * introduced new attribute handling for resources
138
+ * completely rewrote OCCI parser
139
+ * improved action and mixin handling
140
+ * aligned with latest draft of OCCI Core and OCCI JSON specification
141
+ * split the code into rOCCI-core, rOCCI-api and rOCCI-cli
142
+ * internal changes, refactoring and some bugfixes
143
+
131
144
  ### Version 3.1
132
145
  * added basic OS Keystone support
133
146
  * added support for PKCS12 credentials for X.509 authN
@@ -6,18 +6,15 @@ module Occi
6
6
 
7
7
  attr_accessor :scheme, :term, :title, :attributes, :model
8
8
 
9
- def self.categories
10
- self.mixins + self.actions << self.kind
11
- end
12
-
13
- # @param [String ] scheme
14
- # @param [String] term
15
- # @param [String] title
16
- # @param [Hash] attributes
9
+ # @param scheme [String] The categorisation scheme.
10
+ # @param term [String] Unique identifier of the Category instance within the categorisation scheme.
11
+ # @param title [String] The display name of an instance.
12
+ # @param attributes [Occi::Core::Attributes,Hash] Set of Attribute instances.
17
13
  def initialize(scheme='http://schemas.ogf.org/occi/core#',
18
14
  term='category',
19
15
  title=nil,
20
16
  attributes=Occi::Core::Attributes.new)
17
+ scheme += '#' unless scheme.end_with? '#'
21
18
  @scheme = scheme
22
19
  @term = term
23
20
  @title = title
@@ -29,138 +26,54 @@ module Occi
29
26
  end
30
27
  end
31
28
 
32
-
33
- # @param [String] scheme
34
- # @param [String] term
35
- # @param [Array] related
36
- # @return [Class] ruby class with scheme as namespace, term as name and related kind as super class
37
- def self.get_class(scheme, term, related=['http://schemas.ogf.org/occi/core#entity'])
38
- related = related.to_a.flatten
39
- scheme += '#' unless scheme.end_with? '#'
40
-
41
- if related.first.to_s == 'http://schemas.ogf.org/occi/core#entity' or related.first.nil?
42
- parent = Occi::Core::Entity
43
- elsif related.first.kind_of? Occi::Core::Kind
44
- parent = related.first.entity_type
45
- elsif related.first.kind_of? Occi::Core::Mixin
46
- parent = related.first.class
47
- else
48
- related_scheme, related_term = related.first.to_s.split '#'
49
- parent = self.get_class related_scheme, related_term
50
- end
51
-
52
- uri = URI.parse(scheme)
53
-
54
- namespace = if uri.host == 'schemas.ogf.org'
55
- uri.path.reverse.chomp('/').reverse.split('/')
56
- else
57
- uri.host.split('.').reverse + uri.path.reverse.chomp('/').reverse.split('/')
58
- end
59
-
60
- namespace = namespace.inject(Object) do |mod, name|
61
- if mod.constants.collect { |sym| sym.to_s }.include? name.capitalize
62
- mod.const_get name.capitalize
63
- else
64
- mod.const_set name.capitalize, Module.new
65
- end
66
- end
67
-
68
- class_name = self.sanitize_term_before_classify(term).classify
69
- if namespace.const_defined? class_name
70
- klass = namespace.const_get class_name
71
- return klass.mixin if klass.respond_to? :mixin
72
- unless klass.ancestors.include? Occi::Core::Entity or klass.ancestors.include? Occi::Core::Category
73
- raise "OCCI Kind with type identifier #{scheme + term} could not be created as the corresponding class #{klass.to_s} already exists and is not derived from Occi::Core::Entity"
74
- end
75
- else
76
- klass = namespace.const_set class_name, Class.new(parent)
77
- klass.kind = Occi::Core::Kind.new scheme, term, nil, {}, related unless parent.ancestors.include? Occi::Core::Category
78
- end
79
-
80
- klass
81
- end
82
-
83
- # @param [Occi::Model] model
84
- def model=(model)
85
- @related.model=model if @related
86
- end
87
-
88
- # @return [String] Type identifier of the category
29
+ # @return [String] Type identifier of the Category.
89
30
  def type_identifier
90
- @scheme + @term
31
+ self.scheme + self.term
91
32
  end
92
33
 
93
- # check if category is related to another category
94
- # a category is related to another category
95
- # if it is included in @related or
96
- # if it is the category itself
97
- #
98
- # @param [String, Category] category Related Category or its type identifier
99
- # @return [true,false] true if category is related to category_id else false
100
- def related_to?(category)
101
- if @related
102
- self.related.each do |cat|
103
- return true if cat.to_s == category.to_s
104
- end
105
- return true if self.to_s == category.to_s
106
- end
107
- false
108
- end
109
-
110
- # @param [Hash] options
111
- # @return [Hashie::Mash] json representation
34
+ # @param options [Hash]
35
+ # @return [Hashie::Mash] JSON representation of Category.
112
36
  def as_json(options={})
113
37
  category = Hashie::Mash.new
114
- category.scheme = @scheme if @scheme
115
- category.term = @term if @term
116
- category.title = @title if @title
117
- category.attributes = @attributes if @attributes.any?
38
+ category.scheme = self.scheme
39
+ category.term = self.term
40
+ category.title = self.title if self.title
41
+ category.attributes = self.attributes if self.attributes.any?
118
42
  category
119
43
  end
120
44
 
121
- # @return [String] short text representation of the category
45
+ # @return [String] Short text representation of the Category.
122
46
  def to_string_short
123
- @term + ';scheme=' + @scheme.inspect + ';class=' + self.class.name.demodulize.downcase.inspect
47
+ self.term + ';scheme=' + self.scheme.inspect + ';class=' + self.class.name.demodulize.downcase.inspect
124
48
  end
125
49
 
126
- # @return [String] full text representation of the category
50
+ # @return [String] Full text representation of the Category.
127
51
  def to_string
128
52
  string = self.to_string_short
129
- string << ';title=' + @title.inspect if @title
53
+ string << ';title=' + self.title.inspect if self.title
130
54
  string
131
55
  end
132
56
 
133
- # @return [String] text representation
57
+ # @return [String] Text representation of the Category.
134
58
  def to_text
135
59
  'Category: ' + self.to_string
136
60
  end
137
61
 
138
- # @return [Hash] hash containing the HTTP headers of the text/occi rendering
62
+ # @return [Hash] Hash containing the HTTP headers of the text/occi rendering.
139
63
  def to_header
140
64
  {:Category => self.to_string}
141
65
  end
142
66
 
143
- # @return [NilClass] category itself does not have a location
67
+ # @return [NilClass] Returns nil as Category itself does not have a location.
144
68
  def location
145
69
  nil # not implemented
146
70
  end
147
71
 
72
+ # @return [String] Type Identififier of the Category.
148
73
  def to_s
149
74
  self.type_identifier
150
75
  end
151
76
 
152
- private
153
-
154
- # Relaxed parser rules require additional checks on terms.
155
- # TODO: a better solution?
156
- # TODO: check for more characters
157
- def self.sanitize_term_before_classify(term)
158
- sanitized = term.downcase.gsub(/[\s\(\)\.\{\}\-;,\\\/\?\!\|\*\<\>]/, '_').gsub(/_+/, '_').chomp('_').reverse.chomp('_').reverse
159
- sanitized = "uuid_#{sanitized}" if sanitized.match(/^[0-9]/)
160
-
161
- sanitized
162
- end
163
-
164
77
  end
165
78
  end
166
79
  end
@@ -0,0 +1,7 @@
1
+ module Occi
2
+ module Core
3
+ class Dependencies < Occi::Core::Mixins
4
+
5
+ end
6
+ end
7
+ end
@@ -2,43 +2,110 @@ module Occi
2
2
  module Core
3
3
  class Kind < Occi::Core::Category
4
4
 
5
- attr_accessor :entities, :related, :actions, :location
6
-
7
- # @param [String ] scheme
8
- # @param [String] term
9
- # @param [String] title
10
- # @param [Hash] attributes
11
- # @param [Array] related
12
- # @param [Array] actions
5
+ attr_accessor :entities, :parent, :actions, :location
6
+
7
+ # @param scheme [String ] The categorisation scheme.
8
+ # @param term [String] Unique identifier of the Kind instance within the categorisation scheme.
9
+ # @param title [String] The display name of an instance.
10
+ # @param parent [Occi::Core::Kind,String] Another Kind instance which this Kind relates to.
11
+ # @param actions [Occi::Core::Actions,Array] Set of Action instances defined by the Kind instance.
12
+ # @param location [String] Location of the Kind instance.
13
13
  def initialize(scheme='http://schemas.ogf.org/occi/core#',
14
14
  term='kind',
15
15
  title=nil,
16
16
  attributes=Occi::Core::Attributes.new,
17
- related=Occi::Core::Related.new,
17
+ parent=nil,
18
18
  actions=Occi::Core::Actions.new,
19
19
  location=nil)
20
20
  super(scheme, term, title, attributes)
21
- @related = Occi::Core::Related.new(related)
21
+ @parent = [parent].flatten.first
22
22
  @actions = Occi::Core::Actions.new(actions)
23
23
  @entities = Occi::Core::Entities.new
24
24
  location.blank? ? @location = '/' + term + '/' : @location = location
25
25
  end
26
26
 
27
+ # @param scheme [String] The categorisation scheme.
28
+ # @param term [String] Unique identifier of the Category instance within the categorisation scheme.
29
+ # @param parent [Array] Another Kind instance which this Kind relates to.
30
+ # @return [Class] Ruby class with scheme as namespace, term as name and parent kind as super class.
31
+ def self.get_class(scheme, term, parent=Occi::Core::Entity.kind)
32
+ parent ||= Occi::Core::Entity.kind
33
+ if parent.kind_of? Array
34
+ parent = parent.first
35
+ end
36
+ if parent.to_s == 'http://schemas.ogf.org/occi/core#entity'
37
+ parent = Occi::Core::Entity.kind
38
+ elsif parent.kind_of? Occi::Core::Kind
39
+ parent = parent
40
+ else
41
+ parent = self.get_class(*parent.to_s.split('#')).kind
42
+ end
43
+
44
+ unless scheme.end_with? '#'
45
+ scheme += '#'
46
+ end
47
+
48
+ uri = URI.parse(scheme)
49
+
50
+ if uri.host == 'schemas.ogf.org'
51
+ namespace = uri.path.reverse.chomp('/').reverse.split('/')
52
+ else
53
+ namespace = uri.host.split('.').reverse + uri.path.reverse.chomp('/').reverse.split('/')
54
+ end
55
+ namespace.inject(Object) do |mod, name|
56
+ if mod.constants.collect { |sym| sym.to_s }.include? name.capitalize
57
+ namespace = mod.const_get name.capitalize
58
+ else
59
+ namespace = mod.const_set name.capitalize, Module.new
60
+ end
61
+ end
62
+
63
+ class_name = self.sanitize_term_before_classify(term).classify
64
+ if namespace.const_defined? class_name
65
+ klass = namespace.const_get class_name
66
+ unless klass.ancestors.include? Occi::Core::Entity
67
+ raise "OCCI Kind with type identifier #{scheme + term} could not be created as the corresponding class #{klass.to_s} already exists and is not derived from Occi::Core::Entity"
68
+ end
69
+ else
70
+ klass = namespace.const_set class_name, Class.new(parent.entity_type)
71
+ klass.kind = Occi::Core::Kind.new scheme=scheme,
72
+ term=term,
73
+ title=nil,
74
+ attributes={},
75
+ parent=parent
76
+ end
77
+
78
+ klass
79
+ end
80
+
81
+ # Check if this Kind instance is related to another Kind instance.
82
+ #
83
+ # @param kind [Occi::Core::Kind, String] Kind or Type Identifier of a Kind where relation should be checked.
84
+ # @return [true,false]
85
+ def related_to?(kind)
86
+ self.parent.to_s == kind.to_s or self.to_s == kind.to_s
87
+ end
88
+
27
89
  def entity_type
28
- self.class.get_class @scheme, @term, @related
90
+ self.class.get_class self.scheme, self.term, self.parent
29
91
  end
30
92
 
31
93
  def location
32
94
  @location.clone
33
95
  end
34
96
 
97
+ def related
98
+ [self.parent]
99
+ end
100
+
35
101
  # @param [Hash] options
36
102
  # @return [Hashie::Mash] json representation
37
103
  def as_json(options={})
38
104
  kind = Hashie::Mash.new
39
- kind.related = @related.join(' ').split(' ') if @related.any?
40
- kind.actions = @actions.join(' ').split(' ') if @actions.any?
41
- kind.location = @location if @location
105
+ kind.parent = self.parent.to_s if self.parent
106
+ kind.related = self.related.join(' ').split(' ') if self.related.any?
107
+ kind.actions = self.actions.join(' ').split(' ') if self.actions.any?
108
+ kind.location = self.location if self.location
42
109
  kind.merge! super
43
110
  kind
44
111
  end
@@ -46,13 +113,25 @@ module Occi
46
113
  # @return [String] string representation of the kind
47
114
  def to_string
48
115
  string = super
49
- string << ';rel=' + @related.join(' ').inspect if @related.any?
116
+ string << ';rel=' + self.related.first.to_s.inspect if self.related.any?
50
117
  string << ';location=' + self.location.inspect
51
- string << ';attributes=' + @attributes.names.keys.join(' ').inspect if @attributes.any?
52
- string << ';actions=' + @actions.join(' ').inspect if @actions.any?
118
+ string << ';attributes=' + self.attributes.names.keys.join(' ').inspect if self.attributes.any?
119
+ string << ';actions=' + self.actions.join(' ').inspect if self.actions.any?
53
120
  string
54
121
  end
55
122
 
123
+ private
124
+
125
+ # Relaxed parser rules require additional checks on terms.
126
+ # TODO: a better solution?
127
+ # TODO: check for more characters
128
+ def self.sanitize_term_before_classify(term)
129
+ sanitized = term.downcase.gsub(/[\s\(\)\.\{\}\-;,\\\/\?\!\|\*\<\>]/, '_').gsub(/_+/, '_').chomp('_').reverse.chomp('_').reverse
130
+ sanitized = "uuid_#{sanitized}" if sanitized.match(/^[0-9]/)
131
+
132
+ sanitized
133
+ end
134
+
56
135
  end
57
136
  end
58
137
  end
@@ -11,7 +11,7 @@ module Occi
11
11
  scheme, term = category.split '#'
12
12
  scheme += '#'
13
13
 
14
- klass = Occi::Core::Category.get_class scheme, term, [Occi::Core::Kind.new]
14
+ klass = Occi::Core::Kind.get_class scheme, term, [Occi::Core::Kind.new]
15
15
  category = klass.kind
16
16
  end
17
17
  category
@@ -11,7 +11,7 @@ module Occi
11
11
  term='link',
12
12
  title='link',
13
13
  attributes=self.attributes,
14
- related=Occi::Core::Related.new << Occi::Core::Entity.kind
14
+ parent=Occi::Core::Entity.kind
15
15
 
16
16
  # @param [String] kind
17
17
  # @param [String] mixins
@@ -23,7 +23,7 @@ module Occi
23
23
  def initialize(kind=self.kind, mixins=[], attributes={}, actions=[], rel=Occi::Core::Link.type_identifier, target=nil, source=nil, location=nil)
24
24
  super(kind, mixins, attributes, actions, location)
25
25
  scheme, term = rel.to_s.split('#')
26
- @rel = Occi::Core::Category.get_class(scheme, term).kind if scheme && term
26
+ @rel = Occi::Core::Kind.get_class(scheme, term).kind if scheme && term
27
27
  @source = source if source
28
28
  @target = target
29
29
  end
@@ -2,7 +2,7 @@ module Occi
2
2
  module Core
3
3
  class Mixin < Occi::Core::Category
4
4
 
5
- attr_accessor :entities, :related, :actions, :location
5
+ attr_accessor :entities, :depends, :actions, :location, :applies
6
6
 
7
7
  # @param [String ] scheme
8
8
  # @param [String] term
@@ -14,28 +14,44 @@ module Occi
14
14
  term='mixin',
15
15
  title=nil,
16
16
  attributes=Occi::Core::Attributes.new,
17
- related=Occi::Core::Related.new,
17
+ depends=Occi::Core::Dependencies.new,
18
18
  actions=Occi::Core::Actions.new,
19
- location='')
19
+ location='',
20
+ applies=Occi::Core::Kinds.new)
20
21
 
21
22
  super(scheme, term, title, attributes)
22
- @related = Occi::Core::Related.new(related)
23
- @actions = Occi::Core::Actions.new(actions)
23
+ @depends = Occi::Core::Dependencies.new depends
24
+ @actions = Occi::Core::Actions.new actions
24
25
  @entities = Occi::Core::Entities.new
25
26
  location.blank? ? @location = '/mixins/' + term + '/' : @location = location
27
+ @applies = Occi::Core::Kinds.new applies
28
+ end
29
+
30
+ # Check if this Mixin instance is related to another Mixin instance.
31
+ #
32
+ # @param kind [Occi::Core::Mixin, String] Mixin or Type Identifier of a Mixin where relation should be checked.
33
+ # @return [true,false]
34
+ def related_to?(mixin)
35
+ self.depends.any? { |dependency| dependency.to_s == mixin.to_s } or self.to_s == mixin.to_s
26
36
  end
27
37
 
28
38
  def location
29
39
  @location.clone
30
40
  end
31
41
 
42
+ def related
43
+ self.depends + self.applies
44
+ end
45
+
32
46
  # @param [Hash] options
33
47
  # @return [Hashie::Mash] json representation
34
- def as_json(options={ })
48
+ def as_json(options={})
35
49
  mixin = Hashie::Mash.new
36
- mixin.related = @related.join(' ').split(' ') if @related.any?
37
- mixin.actions = @actions if @actions.any?
38
- mixin.location = @location if @location
50
+ mixin.dependencies = self.depends.join(' ').split(' ') if self.depends.any?
51
+ mixin.applies = self.applies.join(' ').split(' ') if self.applies.any?
52
+ mixin.related = self.related.join(' ').split(' ') if self.related.any?
53
+ mixin.actions = self.actions if self.actions.any?
54
+ mixin.location = self.location if self.location
39
55
  mixin.merge! super
40
56
  mixin
41
57
  end
@@ -43,10 +59,10 @@ module Occi
43
59
  # @return [String] text representation
44
60
  def to_string
45
61
  string = super
46
- string << ';rel=' + @related.join(' ').inspect if @related.any?
62
+ string << ';rel=' + self.related.join(' ').inspect if self.related.any?
47
63
  string << ';location=' + self.location.inspect
48
- string << ';attributes=' + @attributes.names.keys.join(' ').inspect if @attributes.any?
49
- string << ';actions=' + @actions.join(' ').inspect if @actions.any?
64
+ string << ';attributes=' + self.attributes.names.keys.join(' ').inspect if self.attributes.any?
65
+ string << ';actions=' + self.actions.join(' ').inspect if self.actions.any?
50
66
  string
51
67
  end
52
68
 
@@ -26,15 +26,8 @@ module Occi
26
26
  # TODO: fix mixin conversion
27
27
  def convert(mixin)
28
28
  mixin = super mixin
29
-
30
29
  if mixin.kind_of? String
31
- scheme, term = mixin.split '#'
32
- scheme += '#'
33
-
34
- mixin = Occi::Core::Category.get_class scheme, term, [Occi::Core::Mixin.new]
35
- if mixin.respond_to? :new
36
- mixin = mixin.new(scheme, term)
37
- end
30
+ mixin = Occi::Core::Mixin.new *mixin.split('#')
38
31
  end
39
32
  mixin
40
33
  end
@@ -12,7 +12,7 @@ module Occi
12
12
  term='resource',
13
13
  title='resource',
14
14
  attributes=self.attributes,
15
- related=Occi::Core::Related.new << Occi::Core::Entity.kind
15
+ parent=Occi::Core::Entity.kind
16
16
 
17
17
  # @param [String] kind
18
18
  # @param [Array] mixins
data/lib/occi/core.rb CHANGED
@@ -2,11 +2,11 @@ require 'occi/core/properties'
2
2
  require 'occi/core/attributes'
3
3
  require 'occi/core/category'
4
4
  require 'occi/core/categories'
5
- require 'occi/core/related'
6
5
  require 'occi/core/kind'
7
6
  require 'occi/core/kinds'
8
7
  require 'occi/core/mixin'
9
8
  require 'occi/core/mixins'
9
+ require 'occi/core/dependencies'
10
10
  require 'occi/core/action'
11
11
  require 'occi/core/action_instance'
12
12
  require 'occi/core/actions'
@@ -45,7 +45,7 @@ module Occi
45
45
  term='compute',
46
46
  title = 'compute resource',
47
47
  attributes=self.attributes,
48
- related=Occi::Core::Related.new << Occi::Core::Resource.kind,
48
+ parent=Occi::Core::Resource.kind,
49
49
  actions = self.actions,
50
50
  location = '/compute/'
51
51
 
@@ -17,9 +17,10 @@ module Occi
17
17
  term='ipnetwork',
18
18
  title='IP network mixin',
19
19
  attributes=self.attributes,
20
- related=Occi::Core::Related.new << Occi::Infrastructure::Network.kind,
20
+ dependencies=Occi::Core::Dependencies.new,
21
21
  actions=Occi::Core::Actions.new,
22
- location='/mixins/ipnetwork/'
22
+ location='/mixins/ipnetwork/',
23
+ applies=Occi::Core::Kinds.new << Occi::Infrastructure::Network.kind
23
24
 
24
25
  end
25
26
  end
@@ -25,7 +25,7 @@ module Occi
25
25
  term='network',
26
26
  title = 'network resource',
27
27
  attributes=self.attributes,
28
- related=Occi::Core::Related.new << Occi::Core::Resource.kind,
28
+ parent=Occi::Core::Resource.kind,
29
29
  actions = self.actions,
30
30
  location = '/network/'
31
31
 
@@ -17,9 +17,10 @@ module Occi
17
17
  term='ipnetworkinterface',
18
18
  title='IP network interface mixin',
19
19
  attributes=self.attributes,
20
- related=Occi::Core::Related.new << Occi::Infrastructure::Networkinterface.kind,
20
+ dependencies=Occi::Core::Dependencies.new,
21
21
  actions=Occi::Core::Actions.new,
22
- location='/mixins/ipnetworkinterface/'
22
+ location='/mixins/ipnetworkinterface/',
23
+ applies=Occi::Core::Kinds.new << Occi::Infrastructure::Network.kind
23
24
 
24
25
  end
25
26
  end
@@ -23,7 +23,7 @@ module Occi
23
23
  term='networkinterface',
24
24
  title = 'networkinterface link',
25
25
  attributes = self.attributes,
26
- related = Occi::Core::Related.new << Occi::Core::Link.kind,
26
+ parent = Occi::Core::Link.kind,
27
27
  actions = self.actions,
28
28
  location = '/networkinterface/'
29
29
 
@@ -36,7 +36,7 @@ module Occi
36
36
  term='storage',
37
37
  title = 'storage resource',
38
38
  attributes = self.attributes,
39
- related = Occi::Core::Related.new << Occi::Core::Resource.kind,
39
+ parent=Occi::Core::Resource.kind,
40
40
  actions = self.actions,
41
41
  location = '/storage/'
42
42
 
@@ -22,7 +22,7 @@ module Occi
22
22
  term='storagelink',
23
23
  title = 'storage link',
24
24
  attributes = self.attributes,
25
- related = Occi::Core::Related.new << Occi::Core::Link.kind,
25
+ parent=Occi::Core::Link.kind,
26
26
  actions = self.actions,
27
27
  location = '/storagelink/'
28
28
 
@@ -6,8 +6,8 @@ module Occi
6
6
  def self.collection(string)
7
7
  collection = Occi::Collection.new
8
8
  hash = Hashie::Mash.new(JSON.parse(string))
9
- collection.kinds.merge hash.kinds.collect { |kind| Occi::Core::Kind.new(kind.scheme, kind.term, kind.title, kind.attributes, kind.related, kind.actions) } if hash.kinds
10
- collection.mixins.merge hash.mixins.collect { |mixin| Occi::Core::Mixin.new(mixin.scheme, mixin.term, mixin.title, mixin.attributes, mixin.related, mixin.actions) } if hash.mixins
9
+ collection.kinds.merge hash.kinds.collect { |kind| Occi::Core::Kind.new(kind.scheme, kind.term, kind.title, kind.attributes, kind.parent ||= kind.related, kind.actions) } if hash.kinds
10
+ collection.mixins.merge hash.mixins.collect { |mixin| Occi::Core::Mixin.new(mixin.scheme, mixin.term, mixin.title, mixin.attributes, mixin.depends ||= mixin.related, mixin.actions, mixin.applies) } if hash.mixins
11
11
  collection.actions.merge hash.actions.collect { |action| Occi::Core::Action.new(action.scheme, action.term, action.title, action.attributes) } if hash.actions
12
12
  collection.resources.merge hash.resources.collect { |resource| Occi::Core::Resource.new(resource.kind, resource.mixins, resource.attributes, resource.actions, resource.links) } if hash.resources
13
13
  collection.links.merge hash.links.collect { |link| Occi::Core::Link.new(link.kind, link.mixins, link.attributes, [], nil, link.target) } if hash.links
data/lib/occi/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Occi
2
- VERSION = "4.0.0.alpha.3" unless defined?(::Occi::VERSION)
2
+ VERSION = "4.0.0.alpha.4" unless defined?(::Occi::VERSION)
3
3
  end
@@ -2,33 +2,35 @@ module Occi
2
2
  module Core
3
3
  describe Category do
4
4
 
5
- it "gets OCCI Resource class by term and scheme" do
6
- scheme = 'http://schemas.ogf.org/occi/core'
7
- term = 'resource'
8
- klass = Occi::Core::Category.get_class scheme, term
9
- klass.should be Occi::Core::Resource
10
- klass.superclass.should be Occi::Core::Entity
11
- end
5
+ describe '.new' do
12
6
 
13
- it "gets non predefined OCCI class by term, scheme and related class" do
14
- scheme = 'http://example.com/occi'
15
- term = 'test'
16
- related = ['http://schemas.ogf.org/occi/core#resource']
17
- klass = Occi::Core::Category.get_class scheme, term, related
18
- klass.should be Com::Example::Occi::Test
19
- klass.superclass.should be Occi::Core::Resource
20
- end
7
+ it 'instantiates a new Category' do
8
+ category = Category.new
9
+ category.scheme.should == 'http://schemas.ogf.org/occi/core#'
10
+ category.term.should == 'category'
11
+ category.title.should be_nil
12
+ category.attributes.should be_kind_of Occi::Core::Attributes
13
+ category.attributes.should be_empty
14
+ end
15
+
16
+ it 'instantiates a new Category and ensures that the scheme ends with a #' do
17
+ category = Category.new *'http://schemas.ogf.org/occi/core#category'.split('#')
18
+ category.scheme.should == 'http://schemas.ogf.org/occi/core#'
19
+ category.term.should == 'category'
20
+ category.title.should be_nil
21
+ category.attributes.should be_kind_of Occi::Core::Attributes
22
+ category.attributes.should be_empty
23
+ end
21
24
 
22
- it "does not get OCCI class by term and scheme if it relates to existing class not derived from OCCI Entity" do
23
- scheme = 'http://hashie/'
24
- term = 'mash'
25
- related = ['http://schemas.ogf.org/occi/core#resource']
26
- expect { Occi::Core::Category.get_class scheme, term, related }.to raise_error
27
25
  end
28
26
 
29
- it "checks if the category is related to another category" do
30
- category = Occi::Core::Resource.kind
31
- category.related_to?(Occi::Core::Entity.kind).should be true
27
+ describe '#type_identifier' do
28
+
29
+ it 'returns the type identifier of the category' do
30
+ category = Category.new
31
+ category.type_identifier.should == 'http://schemas.ogf.org/occi/core#category'
32
+ end
33
+
32
34
  end
33
35
 
34
36
  # rendering
@@ -0,0 +1,44 @@
1
+ module Occi
2
+ module Core
3
+ describe Kind do
4
+
5
+ describe '#get_class' do
6
+
7
+ it 'gets OCCI Resource class by term and scheme' do
8
+ scheme = 'http://schemas.ogf.org/occi/core'
9
+ term = 'resource'
10
+ klass = Occi::Core::Kind.get_class scheme, term
11
+ klass.should be Occi::Core::Resource
12
+ klass.superclass.should be Occi::Core::Entity
13
+ end
14
+
15
+ it 'gets non predefined OCCI class by term, scheme and related class' do
16
+ scheme = 'http://example.com/occi'
17
+ term = 'test'
18
+ related = ['http://schemas.ogf.org/occi/core#resource']
19
+ klass = Occi::Core::Kind.get_class scheme, term, related
20
+ klass.should be Com::Example::Occi::Test
21
+ klass.superclass.should be Occi::Core::Resource
22
+ end
23
+
24
+ it 'does not get OCCI class by term and scheme if it relates to existing class not derived from OCCI Entity' do
25
+ scheme = 'http://hashie/'
26
+ term = 'mash'
27
+ related = ['http://schemas.ogf.org/occi/core#resource']
28
+ expect { Occi::Core::Kind.get_class scheme, term, related }.to raise_error
29
+ end
30
+
31
+ end
32
+
33
+ describe '#related_to?' do
34
+
35
+ it 'checks if the kind is related to another kind' do
36
+ kind = Occi::Core::Resource.kind
37
+ kind.related_to?(Occi::Core::Entity.kind).should be true
38
+ end
39
+
40
+ end
41
+
42
+ end
43
+ end
44
+ end
@@ -39,8 +39,9 @@ module Occi
39
39
  network = Occi::Infrastructure::Network.kind
40
40
  collection = model.get(network)
41
41
  collection.kind_of? Occi::Collection
42
+ collection.kinds.should have(1).kind
42
43
  collection.kinds.first.should == network
43
- collection.mixins.first.should == Occi::Infrastructure::Network::Ipnetwork.mixin
44
+ collection.mixins.should be_empty
44
45
  collection.actions.should be_empty
45
46
  collection.resources.should be_empty
46
47
  collection.links.should be_empty
@@ -21,8 +21,8 @@ module Occi
21
21
  category.attributes['a-1'].class.should eq Occi::Core::Attributes
22
22
  category.attributes['a-1']['a'].class.should eq Occi::Core::Attributes
23
23
  category.attributes['a-1']['a']['b'].class.should eq Occi::Core::Properties
24
- category.actions.to_a.first.to_s.should eq 'http://a.a/a1#a1'
25
- category.actions.to_a.last.to_s.should eq 'http://a.b1/b1#b2'
24
+ category.actions.to_a.any? {|action| action.to_s == 'http://a.a/a1#a1'}.should be_true
25
+ category.actions.to_a.any? {|action| action.to_s == 'http://a.b1/b1#b2'}.should be_true
26
26
  end
27
27
 
28
28
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: occi-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0.alpha.3
4
+ version: 4.0.0.alpha.4
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-07-18 00:00:00.000000000 Z
14
+ date: 2013-07-26 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: json
@@ -236,6 +236,7 @@ files:
236
236
  - lib/occi/core/attributes.rb
237
237
  - lib/occi/core/categories.rb
238
238
  - lib/occi/core/category.rb
239
+ - lib/occi/core/dependencies.rb
239
240
  - lib/occi/core/entities.rb
240
241
  - lib/occi/core/entity.rb
241
242
  - lib/occi/core/kind.rb
@@ -245,7 +246,6 @@ files:
245
246
  - lib/occi/core/mixin.rb
246
247
  - lib/occi/core/mixins.rb
247
248
  - lib/occi/core/properties.rb
248
- - lib/occi/core/related.rb
249
249
  - lib/occi/core/resource.rb
250
250
  - lib/occi/core/resources.rb
251
251
  - lib/occi/helpers/inspect.rb
@@ -276,6 +276,7 @@ files:
276
276
  - spec/occi/core/categories_spec.rb
277
277
  - spec/occi/core/category_spec.rb
278
278
  - spec/occi/core/entity_spec.rb
279
+ - spec/occi/core/kind_spec.rb
279
280
  - spec/occi/core/resource_spec.rb
280
281
  - spec/occi/infrastructure/compute_spec.rb
281
282
  - spec/occi/log_spec.rb
@@ -1,7 +0,0 @@
1
- module Occi
2
- module Core
3
- class Related < Occi::Core::Categories
4
-
5
- end
6
- end
7
- end