occi-core 4.0.0.alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.rspec +1 -0
- data/.travis.yml +43 -0
- data/.yardopts +1 -0
- data/AUTHORS +9 -0
- data/Gemfile +11 -0
- data/LICENSE +13 -0
- data/README.md +212 -0
- data/Rakefile +28 -0
- data/config/occi.yml +4 -0
- data/ext/mkrf_conf.rb +35 -0
- data/lib/occi/collection.rb +192 -0
- data/lib/occi/core/action.rb +32 -0
- data/lib/occi/core/action_instance.rb +38 -0
- data/lib/occi/core/actions.rb +20 -0
- data/lib/occi/core/attribute.rb +99 -0
- data/lib/occi/core/attributes.rb +172 -0
- data/lib/occi/core/categories.rb +51 -0
- data/lib/occi/core/category.rb +153 -0
- data/lib/occi/core/entities.rb +47 -0
- data/lib/occi/core/entity.rb +264 -0
- data/lib/occi/core/kind.rb +58 -0
- data/lib/occi/core/kinds.rb +22 -0
- data/lib/occi/core/link.rb +95 -0
- data/lib/occi/core/links.rb +34 -0
- data/lib/occi/core/mixin.rb +55 -0
- data/lib/occi/core/mixins.rb +41 -0
- data/lib/occi/core/properties.rb +35 -0
- data/lib/occi/core/related.rb +7 -0
- data/lib/occi/core/resource.rb +78 -0
- data/lib/occi/core/resources.rb +14 -0
- data/lib/occi/core.rb +31 -0
- data/lib/occi/helpers/inspect.rb +12 -0
- data/lib/occi/infrastructure/compute.rb +122 -0
- data/lib/occi/infrastructure/network/ipnetwork.rb +27 -0
- data/lib/occi/infrastructure/network.rb +107 -0
- data/lib/occi/infrastructure/networkinterface/ipnetworkinterface.rb +27 -0
- data/lib/occi/infrastructure/networkinterface.rb +103 -0
- data/lib/occi/infrastructure/os_tpl.rb +19 -0
- data/lib/occi/infrastructure/resource_tpl.rb +19 -0
- data/lib/occi/infrastructure/storage.rb +61 -0
- data/lib/occi/infrastructure/storagelink.rb +56 -0
- data/lib/occi/infrastructure.rb +25 -0
- data/lib/occi/log.rb +66 -0
- data/lib/occi/model.rb +86 -0
- data/lib/occi/parser/json.rb +34 -0
- data/lib/occi/parser/ova.rb +35 -0
- data/lib/occi/parser/ovf.rb +154 -0
- data/lib/occi/parser/text.rb +234 -0
- data/lib/occi/parser/xml.rb +18 -0
- data/lib/occi/parser.rb +78 -0
- data/lib/occi/settings.rb +9 -0
- data/lib/occi/version.rb +3 -0
- data/lib/occi-core.rb +50 -0
- data/occi-core.gemspec +36 -0
- data/spec/occi/collection_spec.rb +38 -0
- data/spec/occi/core/attribute_spec.rb +0 -0
- data/spec/occi/core/attributes_spec.rb +42 -0
- data/spec/occi/core/categories_spec.rb +27 -0
- data/spec/occi/core/category_spec.rb +38 -0
- data/spec/occi/core/entity_spec.rb +46 -0
- data/spec/occi/core/resource_spec.rb +18 -0
- data/spec/occi/infrastructure/compute_spec.rb +29 -0
- data/spec/occi/log_spec.rb +14 -0
- data/spec/occi/model_spec.rb +50 -0
- data/spec/occi/parser/text_spec.rb +31 -0
- data/spec/occi/parser_spec.rb +114 -0
- data/spec/occi/test.json +33 -0
- data/spec/occi/test.ova +0 -0
- data/spec/occi/test.ovf +198 -0
- data/spec/spec_helper.rb +25 -0
- metadata +304 -0
@@ -0,0 +1,99 @@
|
|
1
|
+
module Occi
|
2
|
+
module Core
|
3
|
+
module Attribute
|
4
|
+
|
5
|
+
attr_accessor :properties
|
6
|
+
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class StringAttribute < String
|
12
|
+
|
13
|
+
attr_accessor :properties
|
14
|
+
|
15
|
+
def properties
|
16
|
+
self.properties ||= Occi::Core::Properties.new
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
class NumericAttribute
|
22
|
+
|
23
|
+
attr_accessor :properties
|
24
|
+
|
25
|
+
def properties
|
26
|
+
self.properties ||= Occi::Core::Properties.new :type => 'number'
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
class FalseClass
|
32
|
+
|
33
|
+
include Occi::Core::Attribute
|
34
|
+
|
35
|
+
def properties
|
36
|
+
self.properties ||= Occi::Core::Properties.new :type => 'boolean'
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
class TrueClass
|
42
|
+
|
43
|
+
include Occi::Core::Attribute
|
44
|
+
|
45
|
+
def properties
|
46
|
+
self.properties ||= Occi::Core::Properties.new :type => 'boolean'
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
#module Occi
|
52
|
+
# module Core
|
53
|
+
# class Attribute < Occi::Core::AttributeProperties
|
54
|
+
#
|
55
|
+
# attr_accessor :_value
|
56
|
+
#
|
57
|
+
# # @param [Hash] properties
|
58
|
+
# # @param [Hash] default
|
59
|
+
# def initialize(properties={})
|
60
|
+
# super(properties)
|
61
|
+
# case properties
|
62
|
+
# when Occi::Core::AttributeProperties
|
63
|
+
# self._value = properties._value if properties._value if properties.respond_to?('_value')
|
64
|
+
# else
|
65
|
+
# self._value = properties[:value] if properties[:value]
|
66
|
+
# end
|
67
|
+
# end
|
68
|
+
#
|
69
|
+
# def _value=(value)
|
70
|
+
# raise "value #{value} can not be assigned as the attribute is not mutable" unless self._mutable if self._value
|
71
|
+
# case self._type
|
72
|
+
# when 'number'
|
73
|
+
# raise "value #{value} from class #{value.class.name} does not match attribute property type #{self._type}" unless value.kind_of?(Numeric)
|
74
|
+
# when 'boolean'
|
75
|
+
# raise "value #{value} from class #{value.class.name} does not match attribute property type #{self._type}" unless !!value == value
|
76
|
+
# when 'string'
|
77
|
+
# raise "value #{value} from class #{value.class.name} does not match attribute property type #{self._type}" unless value.kind_of?(String) || value.kind_of?(Occi::Core::Entity)
|
78
|
+
# else
|
79
|
+
# raise "property type #{self._type} is not one of the allowed types number, boolean or string"
|
80
|
+
# end
|
81
|
+
# raise "value #{value} does not match pattern #{self._pattern}" if value.to_s.scan(Regexp.new(self._pattern)).empty? unless value.kind_of?(Occi::Core::Entity)
|
82
|
+
# @_value = value
|
83
|
+
# end
|
84
|
+
#
|
85
|
+
# def inspect
|
86
|
+
# self._value
|
87
|
+
# end
|
88
|
+
#
|
89
|
+
# def to_s
|
90
|
+
# self._value
|
91
|
+
# end
|
92
|
+
#
|
93
|
+
# def empty?
|
94
|
+
# self._value.nil?
|
95
|
+
# end
|
96
|
+
#
|
97
|
+
# end
|
98
|
+
# end
|
99
|
+
#end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
module Occi
|
2
|
+
module Core
|
3
|
+
class Attributes < Hashie::Mash
|
4
|
+
|
5
|
+
attr_accessor :converted
|
6
|
+
|
7
|
+
include Occi::Helpers::Inspect
|
8
|
+
|
9
|
+
def converted?
|
10
|
+
@converted||=false
|
11
|
+
end
|
12
|
+
|
13
|
+
def [](key)
|
14
|
+
if key.to_s.include? '.'
|
15
|
+
key, string = key.to_s.split('.', 2)
|
16
|
+
attributes = super(key)
|
17
|
+
raise "Attribute with key #{key} not found" unless attributes
|
18
|
+
attributes[string]
|
19
|
+
else
|
20
|
+
super(key)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def []=(key, value)
|
25
|
+
if key.to_s.include? '.'
|
26
|
+
key, string = key.to_s.split('.', 2)
|
27
|
+
super(key, Occi::Core::Attributes.new) unless self[key].kind_of? Occi::Core::Attributes
|
28
|
+
self[key][string] = value
|
29
|
+
else
|
30
|
+
property_key = '_' + key.to_s
|
31
|
+
case value
|
32
|
+
when Occi::Core::Attributes
|
33
|
+
super(key, value)
|
34
|
+
when Occi::Core::Properties
|
35
|
+
super(key, value.clone)
|
36
|
+
super(property_key, value.clone)
|
37
|
+
when Hash
|
38
|
+
properties = Occi::Core::Properties.new(value)
|
39
|
+
super(key, properties.clone)
|
40
|
+
super(property_key, properties.clone)
|
41
|
+
when Occi::Core::Entity
|
42
|
+
raise "value #{value} derived from Occi::Core::Entity assigned but attribute of type #{self[property_key].type} required" unless self[property_key].type == 'string' if self[property_key]
|
43
|
+
raise "value #{value} does not match pattern" unless value.to_s.match '^' + self[property_key].pattern + '$' if Occi::Settings.verify_attribute_pattern if self[property_key]
|
44
|
+
super(key, value)
|
45
|
+
when String
|
46
|
+
raise "value #{value} of type String assigned but attribute of type #{self[property_key].type} required" unless self[property_key].type == 'string' if self[property_key]
|
47
|
+
raise "value #{value} does not match pattern" unless value.match '^' + self[property_key].pattern + '$' if Occi::Settings.verify_attribute_pattern if self[property_key]
|
48
|
+
super(key, value)
|
49
|
+
when Numeric
|
50
|
+
raise "value #{value} of type String assigned but attribute of type #{self[property_key].type} required" unless self[property_key].type == 'number' if self[property_key]
|
51
|
+
raise "value #{value} does not match pattern" unless value.to_s.match '^' + self[property_key].pattern + '$' if Occi::Settings.verify_attribute_pattern if self[property_key]
|
52
|
+
super(key, value)
|
53
|
+
when NilClass
|
54
|
+
super(key, value)
|
55
|
+
else
|
56
|
+
raise "value #{value} of type #{value.class} not supported as attribute"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def remove(attributes)
|
62
|
+
attributes.keys.each do |key|
|
63
|
+
if self.keys.include? key
|
64
|
+
case self[key]
|
65
|
+
when Occi::Core::Attributes
|
66
|
+
self[key].remove attributes[key]
|
67
|
+
else
|
68
|
+
self.delete(key)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
self
|
73
|
+
end
|
74
|
+
|
75
|
+
def convert(attributes=Occi::Core::Attributes.new(self))
|
76
|
+
attributes.each_pair do |key, value|
|
77
|
+
next if attributes.key?(key[1..-1])
|
78
|
+
case value
|
79
|
+
when Occi::Core::Attributes
|
80
|
+
value.convert!
|
81
|
+
else
|
82
|
+
attributes[key] = nil
|
83
|
+
end
|
84
|
+
end
|
85
|
+
attributes.converted = true
|
86
|
+
attributes
|
87
|
+
end
|
88
|
+
|
89
|
+
def convert!
|
90
|
+
convert self
|
91
|
+
end
|
92
|
+
|
93
|
+
# @return [Array] key value pair of full attribute names with their corresponding values
|
94
|
+
def names
|
95
|
+
hash = {}
|
96
|
+
self.each_key do |key|
|
97
|
+
next if self.key?(key[1..-1])
|
98
|
+
if self[key].kind_of? Occi::Core::Attributes
|
99
|
+
self[key].names.each_pair { |k, v| hash[key + '.' + k] = v unless v.blank? }
|
100
|
+
else
|
101
|
+
hash[key] = self[key]
|
102
|
+
end
|
103
|
+
end
|
104
|
+
hash
|
105
|
+
end
|
106
|
+
|
107
|
+
# @param [Hash] attributes
|
108
|
+
# @return [Occi::Core::Properties] parsed Properties
|
109
|
+
def self.parse(hash)
|
110
|
+
hash ||= {}
|
111
|
+
attributes = Occi::Core::Attributes.new
|
112
|
+
hash.each_pair do |key, value|
|
113
|
+
if [:Type, :Required, :Mutable, :Default, :Description, :Pattern, :type, :required, :mutable, :default, :description, :pattern].any? { |k| value.key?(k) and not value[k].kind_of? Hash }
|
114
|
+
value[:type] ||= value[:Type] ||= "string"
|
115
|
+
value[:required] ||= value[:Required] ||= false
|
116
|
+
value[:mutable] ||= value[:Mutable] ||= false
|
117
|
+
value[:default] = value[:Default] if value[:Default]
|
118
|
+
value[:description] = value[:Description] if value[:Description]
|
119
|
+
value[:pattern] ||= value[:Pattern] ||= ".*"
|
120
|
+
value.delete :Type
|
121
|
+
value.delete :Required
|
122
|
+
value.delete :Mutable
|
123
|
+
value.delete :Default
|
124
|
+
value.delete :Description
|
125
|
+
value.delete :Pattern
|
126
|
+
attributes[key] = Occi::Core::Properties.new value
|
127
|
+
else
|
128
|
+
attributes[key] = self.parse attributes[key]
|
129
|
+
end
|
130
|
+
end
|
131
|
+
attributes
|
132
|
+
end
|
133
|
+
|
134
|
+
# @param [Hash] attributes key value pair of full attribute names with their corresponding values
|
135
|
+
# @return [Occi::Core::Properties]
|
136
|
+
def self.split(attributes)
|
137
|
+
attribute = Attributes.new
|
138
|
+
attributes.each do |name, value|
|
139
|
+
key, _, rest = name.partition('.')
|
140
|
+
if rest.empty?
|
141
|
+
attribute[key] = value
|
142
|
+
else
|
143
|
+
attribute.merge! Attributes.new(key => self.split(rest => value))
|
144
|
+
end
|
145
|
+
end
|
146
|
+
return attribute
|
147
|
+
end
|
148
|
+
|
149
|
+
def to_json(*a)
|
150
|
+
as_json(*a).to_json(*a)
|
151
|
+
end
|
152
|
+
|
153
|
+
# @param [Hash] options
|
154
|
+
# @return [Hashie::Mash] json representation
|
155
|
+
def as_json(options={})
|
156
|
+
hash = {}
|
157
|
+
self.each_pair do |key, value|
|
158
|
+
next if self.key?(key[1..-1])
|
159
|
+
case value
|
160
|
+
when Occi::Core::Attributes
|
161
|
+
hash[key] = value.as_json unless value.as_json.size == 0
|
162
|
+
else
|
163
|
+
hash[key] = value.as_json if value
|
164
|
+
end
|
165
|
+
end
|
166
|
+
hash
|
167
|
+
end
|
168
|
+
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
172
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Occi
|
2
|
+
module Core
|
3
|
+
class Categories < Set
|
4
|
+
|
5
|
+
include Occi::Helpers::Inspect
|
6
|
+
|
7
|
+
attr_accessor :model
|
8
|
+
|
9
|
+
def initialize(categories=[])
|
10
|
+
categories.collect! { |category| convert category } if categories
|
11
|
+
super categories
|
12
|
+
end
|
13
|
+
|
14
|
+
def <<(category)
|
15
|
+
super convert category
|
16
|
+
end
|
17
|
+
|
18
|
+
def join(separator)
|
19
|
+
self.to_a.join(separator)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns a Set with all categories related to the specified category
|
23
|
+
#
|
24
|
+
# @param [Occi::Core::Category] category
|
25
|
+
# @return [Occi::Core::Categories]
|
26
|
+
def get_related_to(category)
|
27
|
+
self.class.new select { |cat| cat.related_to? category }
|
28
|
+
end
|
29
|
+
|
30
|
+
# @param [Occi::Model] model
|
31
|
+
# @return [Occi::Model]
|
32
|
+
def model=(model)
|
33
|
+
@model = model
|
34
|
+
collect! { |category| model.get_by_id category.to_s or category }
|
35
|
+
end
|
36
|
+
|
37
|
+
# @param [Hash] options
|
38
|
+
# @return [Hashie::Mash] json representation
|
39
|
+
def as_json(options={})
|
40
|
+
self.to_a.as_json
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def convert(category)
|
46
|
+
(@model.get_by_id category if @model if category.kind_of? String) or category
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
module Occi
|
2
|
+
module Core
|
3
|
+
class Category
|
4
|
+
|
5
|
+
include Occi::Helpers::Inspect
|
6
|
+
|
7
|
+
attr_accessor :scheme, :term, :title, :attributes, :model
|
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
|
17
|
+
def initialize(scheme='http://schemas.ogf.org/occi/core#',
|
18
|
+
term='category',
|
19
|
+
title=nil,
|
20
|
+
attributes=Occi::Core::Attributes.new)
|
21
|
+
@scheme = scheme
|
22
|
+
@term = term
|
23
|
+
@title = title
|
24
|
+
case attributes
|
25
|
+
when Occi::Core::Attributes
|
26
|
+
@attributes = attributes
|
27
|
+
else
|
28
|
+
@attributes = Occi::Core::Attributes.parse attributes
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
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 = term.gsub('-', '_').capitalize
|
69
|
+
if namespace.const_defined? class_name
|
70
|
+
klass = namespace.const_get class_name
|
71
|
+
unless klass.ancestors.include? Occi::Core::Entity or klass.ancestors.include? Occi::Core::Category
|
72
|
+
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"
|
73
|
+
end
|
74
|
+
else
|
75
|
+
klass = namespace.const_set class_name, Class.new(parent)
|
76
|
+
klass.kind = Occi::Core::Kind.new scheme, term, nil, {}, related unless parent.ancestors.include? Occi::Core::Category
|
77
|
+
end
|
78
|
+
|
79
|
+
klass
|
80
|
+
end
|
81
|
+
|
82
|
+
# @param [Occi::Model] model
|
83
|
+
def model=(model)
|
84
|
+
@related.model=model if @related
|
85
|
+
end
|
86
|
+
|
87
|
+
# @return [String] Type identifier of the category
|
88
|
+
def type_identifier
|
89
|
+
@scheme + @term
|
90
|
+
end
|
91
|
+
|
92
|
+
# check if category is related to another category
|
93
|
+
# a category is related to another category
|
94
|
+
# if it is included in @related or
|
95
|
+
# if it is the category itself
|
96
|
+
#
|
97
|
+
# @param [String, Category] category Related Category or its type identifier
|
98
|
+
# @return [true,false] true if category is related to category_id else false
|
99
|
+
def related_to?(category)
|
100
|
+
if @related
|
101
|
+
self.related.each do |cat|
|
102
|
+
return true if cat.to_s == category.to_s
|
103
|
+
end
|
104
|
+
return true if self.to_s == category.to_s
|
105
|
+
end
|
106
|
+
false
|
107
|
+
end
|
108
|
+
|
109
|
+
# @param [Hash] options
|
110
|
+
# @return [Hashie::Mash] json representation
|
111
|
+
def as_json(options={})
|
112
|
+
category = Hashie::Mash.new
|
113
|
+
category.scheme = @scheme if @scheme
|
114
|
+
category.term = @term if @term
|
115
|
+
category.title = @title if @title
|
116
|
+
category.attributes = @attributes if @attributes.any?
|
117
|
+
category
|
118
|
+
end
|
119
|
+
|
120
|
+
# @return [String] short text representation of the category
|
121
|
+
def to_string_short
|
122
|
+
@term + ';scheme=' + @scheme.inspect + ';class=' + self.class.name.demodulize.downcase.inspect
|
123
|
+
end
|
124
|
+
|
125
|
+
# @return [String] full text representation of the category
|
126
|
+
def to_string
|
127
|
+
string = self.to_string_short
|
128
|
+
string << ';title=' + @title.inspect if @title
|
129
|
+
string
|
130
|
+
end
|
131
|
+
|
132
|
+
# @return [String] text representation
|
133
|
+
def to_text
|
134
|
+
'Category: ' + self.to_string
|
135
|
+
end
|
136
|
+
|
137
|
+
# @return [Hash] hash containing the HTTP headers of the text/occi rendering
|
138
|
+
def to_header
|
139
|
+
{:Category => self.to_string}
|
140
|
+
end
|
141
|
+
|
142
|
+
# @return [NilClass] category itself does not have a location
|
143
|
+
def location
|
144
|
+
nil # not implemented
|
145
|
+
end
|
146
|
+
|
147
|
+
def to_s
|
148
|
+
self.type_identifier
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Occi
|
2
|
+
module Core
|
3
|
+
class Entities < Set
|
4
|
+
|
5
|
+
include Occi::Helpers::Inspect
|
6
|
+
|
7
|
+
attr_accessor :model
|
8
|
+
|
9
|
+
def initialize(entities=[])
|
10
|
+
entities.to_a.each { |entity| entity.model = @model } if @model
|
11
|
+
super entities
|
12
|
+
end
|
13
|
+
|
14
|
+
def join(separator)
|
15
|
+
self.to_a.join(separator)
|
16
|
+
end
|
17
|
+
|
18
|
+
def model=(model)
|
19
|
+
@model = model
|
20
|
+
each { |entity| entity.model=model }
|
21
|
+
end
|
22
|
+
|
23
|
+
def check
|
24
|
+
each { |entity| entity.check }
|
25
|
+
end
|
26
|
+
|
27
|
+
def create(*args)
|
28
|
+
entity = Occi::Core::Entity.new(*args)
|
29
|
+
entity.model = @model if @model
|
30
|
+
self << entity
|
31
|
+
entity
|
32
|
+
end
|
33
|
+
|
34
|
+
def <<(entity)
|
35
|
+
entity.model = @model if @model
|
36
|
+
super entity
|
37
|
+
end
|
38
|
+
|
39
|
+
# @param [Hash] options
|
40
|
+
# @return [Hashie::Mash] json representation
|
41
|
+
def as_json(options={ })
|
42
|
+
self.to_a.as_json
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|