occi-core 5.0.0 → 5.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +8 -0
- data/README.md +142 -8
- data/lib/occi/core/attribute_definition.rb +1 -1
- data/lib/occi/core/helpers/argument_validator.rb +1 -1
- data/lib/occi/core/helpers/instance_attribute_resetter.rb +3 -3
- data/lib/occi/core/helpers/parser_dereferencer.rb +3 -3
- data/lib/occi/core/helpers/renderable.rb +2 -2
- data/lib/occi/core/helpers/yaml_summoner.rb +1 -1
- data/lib/occi/core/instance_builder.rb +4 -4
- data/lib/occi/core/parsers/base_parser.rb +1 -9
- data/lib/occi/core/parsers/json/action_instance.rb +2 -6
- data/lib/occi/core/parsers/json/category.rb +8 -12
- data/lib/occi/core/parsers/json/entity.rb +6 -10
- data/lib/occi/core/parsers/json/validator.rb +2 -6
- data/lib/occi/core/parsers/json_parser.rb +7 -7
- data/lib/occi/core/parsers/text/category.rb +4 -8
- data/lib/occi/core/parsers/text/entity.rb +9 -13
- data/lib/occi/core/parsers/text/location.rb +2 -6
- data/lib/occi/core/parsers/text_parser.rb +9 -13
- data/lib/occi/core/renderer_factory.rb +5 -5
- data/lib/occi/core/renderers/base_renderer.rb +1 -1
- data/lib/occi/core/renderers/json/link.rb +6 -5
- data/lib/occi/core/version.rb +1 -1
- data/lib/occi/core/warehouse.rb +5 -5
- data/lib/occi/infrastructure_ext/warehouse/kinds/attributes/occi.ipreservation.address.yml +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d523a58448adfcac4670df02b7666b1a9e48c7da
|
4
|
+
data.tar.gz: 2442b720cd5e338f33bfcf92f3da9ce1a3bff0c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 02bf8369a2c0c5a084e670b2f106d43ba83312ba0e0bd2ae7b84421da32e2aa592f7f95b51a2c892f7ea5160cf7aa72a894245c1e91e194e13acb4859874f217
|
7
|
+
data.tar.gz: f8565410f77fd48b20aff72581fb2e477c00e3f8a5e42afc784988b01395360fdcdf3d5329d23b6c2a54b9e905ea26d98c8be2378e6257951a199f46c52032fb
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -0,0 +1,8 @@
|
|
1
|
+
|
2
|
+
5.0.1 / 2017-09-05
|
3
|
+
==================
|
4
|
+
|
5
|
+
* `occi.ipreservation.address` not required for `Occi::InfrastructureExt::IPReservation`
|
6
|
+
* Respecting `{source,target}_kind` for Link rendering to JSON
|
7
|
+
* Logging `debug` messages via blocks (perf.)
|
8
|
+
* Converting JSON keys to symbols by default
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
* Ruby 2.2.2+ or jRuby 9+ (with JDK7 a JDK8)
|
10
10
|
|
11
11
|
## Installation
|
12
|
-
###
|
12
|
+
### Gem
|
13
13
|
To install the most recent stable version
|
14
14
|
~~~
|
15
15
|
gem install occi-core
|
@@ -19,17 +19,152 @@ To install the most recent beta version
|
|
19
19
|
~~~
|
20
20
|
gem install occi-core --pre
|
21
21
|
~~~
|
22
|
-
|
23
|
-
|
24
|
-
To build and install the bleeding edge version from master
|
22
|
+
### Source
|
23
|
+
To build a bleeding edge version from master
|
25
24
|
~~~
|
26
25
|
git clone git://github.com/the-rocci-project/rOCCI-core.git
|
27
26
|
cd rOCCI-core
|
28
27
|
gem build occi-core.gemspec
|
28
|
+
gem install occi-core-*.gem
|
29
29
|
~~~
|
30
30
|
|
31
31
|
## Usage
|
32
|
-
|
32
|
+
### Logging
|
33
|
+
```ruby
|
34
|
+
require 'occi/infrastructure-ext'
|
35
|
+
logger = Yell.new STDOUT, name: Object # IO or String
|
36
|
+
logger.level = :debug # see https://github.com/rudionrails/yell
|
37
|
+
```
|
38
|
+
### Model
|
39
|
+
```ruby
|
40
|
+
model = Occi::InfrastructureExt::Model.new
|
41
|
+
model.load_core!
|
42
|
+
model.load_infrastructure!
|
43
|
+
model.load_infrastructure_ext!
|
44
|
+
|
45
|
+
model.valid! # this should never raise an error when using stock model extensions
|
46
|
+
```
|
47
|
+
```ruby
|
48
|
+
model.kinds # => #<Set ...>
|
49
|
+
model.mixins # => #<Set ...>
|
50
|
+
model.actions # => #<Set ...>
|
51
|
+
```
|
52
|
+
```ruby
|
53
|
+
kind = model.find_by_identifier! 'http://schemas.ogf.org/occi/infrastructure#compute' # => #<Occi::Core::Kind ...>
|
54
|
+
mixin = model.find_by_identifier! 'http://schemas.ogf.org/occi/infrastructure#os_tpl' # => #<Occi::Core::Mixin ...>
|
55
|
+
|
56
|
+
model.find_dependent mixin # => #<Set ...> of mixins that depend on the given mixin
|
57
|
+
model.find_related kind # => #<Set ...> of kinds related to the given kind
|
58
|
+
```
|
59
|
+
### Instance Builder
|
60
|
+
```ruby
|
61
|
+
# always access the IB instance associated with a model instance
|
62
|
+
ib = model.instance_builder
|
63
|
+
ib.get 'http://schemas.ogf.org/occi/infrastructure#compute' # => #<Occi::Infrastructure::Compute ...>
|
64
|
+
```
|
65
|
+
### Entity Instance
|
66
|
+
```ruby
|
67
|
+
# using `mixin` selected from Model instance
|
68
|
+
# using `compute` created by InstanceBuilder instance
|
69
|
+
compute.identify! # to generate `occi.core.id`
|
70
|
+
|
71
|
+
compute['occi.core.id'] # => #<String ...>
|
72
|
+
compute['occi.core.title'] = 'Mine' # to assign instance attribute value
|
73
|
+
|
74
|
+
compute << mixin # add a mixin
|
75
|
+
|
76
|
+
compute.valid! # to validate
|
77
|
+
```
|
78
|
+
### Action Instance
|
79
|
+
```ruby
|
80
|
+
# using `action` selected from Model instance
|
81
|
+
ai = Occi::Core::ActionInstance.new(action: action)
|
82
|
+
|
83
|
+
ai['method'] # => #<String ...>
|
84
|
+
ai['method'] = 'cold' # to assign action instance attribute value
|
85
|
+
|
86
|
+
ai.valid!
|
87
|
+
```
|
88
|
+
### Collection
|
89
|
+
```ruby
|
90
|
+
# using `model`
|
91
|
+
# using `compute` created by InstanceBuilder instance
|
92
|
+
# using `compute1` created by InstanceBuilder instance
|
93
|
+
# using `compute2` created by InstanceBuilder instance
|
94
|
+
collection = Occi::Core::Collection.new
|
95
|
+
collection.categories = model.categories
|
96
|
+
|
97
|
+
collection << compute
|
98
|
+
collection << compute1
|
99
|
+
collection << compute2
|
100
|
+
|
101
|
+
collection.valid!
|
102
|
+
```
|
103
|
+
```ruby
|
104
|
+
# using `kind` selected from Model instance
|
105
|
+
collection.find_by_kind kind # => #<Set ...> of Occi::Core::Entity or its sub-type
|
106
|
+
collection.find_by_id! '12554' # => #<Occi::Core::Entity ...> or its sub-type
|
107
|
+
```
|
108
|
+
### Rendering
|
109
|
+
```ruby
|
110
|
+
# using `compute` created by InstanceBuilder instance
|
111
|
+
compute.valid! # ALWAYS validate before rendering!
|
112
|
+
|
113
|
+
compute.to_text # => #<String ...>
|
114
|
+
compute.to_json # => #<String ...>
|
115
|
+
```
|
116
|
+
```ruby
|
117
|
+
# using `collection` with `collection.categories` set
|
118
|
+
collection.valid! # ALWAYS validate before rendering!
|
119
|
+
|
120
|
+
collection.to_text # => #<String ...> with at most one Occi::Core::Entity sub-type
|
121
|
+
collection.to_json # => #<String ...>
|
122
|
+
```
|
123
|
+
### Parsing
|
124
|
+
```ruby
|
125
|
+
model = Occi::InfrastructureExt::Model.new # empty or partially loaded model instance can be used
|
126
|
+
|
127
|
+
mf = File.read File.join('examples', 'rendering', 'model.json')
|
128
|
+
Occi::Core::Parsers::JsonParser.model(mf, {}, 'application/occi+json', model)
|
129
|
+
|
130
|
+
model.valid! # ALWAYS validate before using the model!
|
131
|
+
```
|
132
|
+
```ruby
|
133
|
+
# using `model`
|
134
|
+
parser = Occi::Core::Parsers::JsonParser.new(model: model, media_type: 'application/occi+json')
|
135
|
+
|
136
|
+
cf = File.read File.join('examples', 'rendering', 'instance.json')
|
137
|
+
entities = parser.entities(cf, {}) # => #<Set ...>
|
138
|
+
|
139
|
+
entities.each(&:valid!) # ALWAYS validate before using parsed instances!
|
140
|
+
```
|
141
|
+
### Warehouse
|
142
|
+
```ruby
|
143
|
+
module Custom
|
144
|
+
class Warehouse < Occi::Core::Warehouse
|
145
|
+
class << self
|
146
|
+
protected
|
147
|
+
|
148
|
+
def whereami
|
149
|
+
# the `warehouse` directory should be located in this directory
|
150
|
+
File.expand_path(File.dirname(__FILE__))
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
```
|
156
|
+
See definitions in [`Occi::Infrastructure::Warehouse`](https://github.com/the-rocci-project/rOCCI-core/tree/master/lib/occi/infrastructure/warehouse) for inspiration.
|
157
|
+
### Extending Model
|
158
|
+
If you need to extend the model, use a custom `Warehouse` class to do it. Actions, kinds, and mixins referenced
|
159
|
+
by identifier in `Custom::Warehouse` definition YAMLs have to be already present in the model instance being extended!
|
160
|
+
```ruby
|
161
|
+
model = Occi::InfrastructureExt::Model.new
|
162
|
+
model.load_core!
|
163
|
+
|
164
|
+
Custom::Warehouse.bootstrap! model
|
165
|
+
|
166
|
+
model.valid!
|
167
|
+
```
|
33
168
|
|
34
169
|
## Changelog
|
35
170
|
See `CHANGELOG.md`.
|
@@ -37,9 +172,8 @@ See `CHANGELOG.md`.
|
|
37
172
|
## Code Documentation
|
38
173
|
[Code Documentation for rOCCI](http://rubydoc.info/github/the-rocci-project/rOCCI-core/)
|
39
174
|
|
40
|
-
|
41
|
-
|
42
|
-
1. Fork it.
|
175
|
+
## Contribute
|
176
|
+
1. Fork it
|
43
177
|
2. Create a branch (git checkout -b my_markup)
|
44
178
|
3. Commit your changes (git commit -am "My changes")
|
45
179
|
4. Push to the branch (git push origin my_markup)
|
@@ -8,7 +8,7 @@ module Occi
|
|
8
8
|
module ArgumentValidator
|
9
9
|
# :nodoc:
|
10
10
|
def default_args!(args)
|
11
|
-
logger.debug "Merging #{self.class} args #{args.inspect} with defaults #{defaults.inspect}"
|
11
|
+
logger.debug { "Merging #{self.class} args #{args.inspect} with defaults #{defaults.inspect}" }
|
12
12
|
args.merge!(defaults) { |_, oldval, _| oldval }
|
13
13
|
sufficient_args!(args)
|
14
14
|
end
|
@@ -53,7 +53,7 @@ module Occi
|
|
53
53
|
name_cache = attribute_names
|
54
54
|
attributes.keep_if do |key, value|
|
55
55
|
defined = name_cache.include?(key) && value && value.attribute_definition
|
56
|
-
logger.debug "Removing undefined attribute #{key.inspect} on #{self.class}" unless defined
|
56
|
+
logger.debug { "Removing undefined attribute #{key.inspect} on #{self.class}" } unless defined
|
57
57
|
defined
|
58
58
|
end
|
59
59
|
end
|
@@ -122,10 +122,10 @@ module Occi
|
|
122
122
|
# @param force [TrueClass, FalseClass] forcibly change attribute value to default
|
123
123
|
def reset_attribute(name, definition, force)
|
124
124
|
if attributes[name]
|
125
|
-
logger.debug "Setting attribute definition for existing #{name.inspect} on #{self.class}"
|
125
|
+
logger.debug { "Setting attribute definition for existing #{name.inspect} on #{self.class}" }
|
126
126
|
attributes[name].attribute_definition = definition
|
127
127
|
else
|
128
|
-
logger.debug "Creating attribute definition for new #{name.inspect} on #{self.class}"
|
128
|
+
logger.debug { "Creating attribute definition for new #{name.inspect} on #{self.class}" }
|
129
129
|
attributes[name] = Attribute.new(nil, definition)
|
130
130
|
end
|
131
131
|
|
@@ -44,8 +44,8 @@ module Occi
|
|
44
44
|
# @param derefd [Array] list of all available category instances
|
45
45
|
# @param parsed_actions [Array] textual representation of needed actions
|
46
46
|
def lookup_action_references!(cat, derefd, parsed_actions)
|
47
|
-
logger.debug "Dereferencing actions #{parsed_actions.inspect} for #{cat.identifier.inspect}"
|
48
47
|
return if parsed_actions.blank?
|
48
|
+
logger.debug { "Dereferencing actions #{parsed_actions.inspect} for #{cat.identifier.inspect}" }
|
49
49
|
parsed_actions.each { |action| cat.actions << first_or_die(derefd, action) }
|
50
50
|
end
|
51
51
|
|
@@ -54,7 +54,7 @@ module Occi
|
|
54
54
|
# @param parsed_rel [Array] textual representation of needed parent(s)
|
55
55
|
def lookup_parent_references!(kind, derefd, parsed_rel)
|
56
56
|
return if parsed_rel.blank? || kind.parent.is_a?(Occi::Core::Kind)
|
57
|
-
logger.debug "Dereferencing parent #{parsed_rel.inspect} for #{kind.identifier.inspect}"
|
57
|
+
logger.debug { "Dereferencing parent #{parsed_rel.inspect} for #{kind.identifier.inspect}" }
|
58
58
|
if parsed_rel.is_a?(Enumerable)
|
59
59
|
if parsed_rel.count > 1
|
60
60
|
raise Occi::Core::Errors::ParsingError,
|
@@ -85,7 +85,7 @@ module Occi
|
|
85
85
|
# @param what [String] identifier of the desired item
|
86
86
|
# @return [Object] desired item from `where`
|
87
87
|
def first_or_die(where, what)
|
88
|
-
logger.debug "Looking for #{what.inspect} in #{where.class}"
|
88
|
+
logger.debug { "Looking for #{what.inspect} in #{where.class}" }
|
89
89
|
found = where.detect { |elm| elm.identifier == what }
|
90
90
|
unless found
|
91
91
|
raise Occi::Core::Errors::ParsingError,
|
@@ -27,7 +27,7 @@ module Occi
|
|
27
27
|
# @return [Object] output of the chosen renderer
|
28
28
|
def render(format, options = {})
|
29
29
|
options[:format] = format
|
30
|
-
logger.debug "#{self.class} is
|
30
|
+
logger.debug { "#{self.class} is rendered to #{format} with #{options.inspect}" } if respond_to?(:logger)
|
31
31
|
renderer_for(format).render(self, options)
|
32
32
|
end
|
33
33
|
|
@@ -55,7 +55,7 @@ module Occi
|
|
55
55
|
# @param base [Class] class receiving this module
|
56
56
|
def self.included(base)
|
57
57
|
renderer_factory.formats.each do |format|
|
58
|
-
base.logger.debug "Adding support for format #{format} to #{base}" if base.respond_to?(:logger)
|
58
|
+
base.logger.debug { "Adding support for format #{format} to #{base}" } if base.respond_to?(:logger)
|
59
59
|
base.send(:define_method, "to_#{format}", proc { render(format) })
|
60
60
|
end
|
61
61
|
end
|
@@ -25,7 +25,7 @@ module Occi
|
|
25
25
|
raise 'This method cannot be invoked on instances' unless is_a? Class
|
26
26
|
allowed_classes = respond_to?(:allowed_yaml_classes, true) ? allowed_yaml_classes : []
|
27
27
|
|
28
|
-
logger.debug "Loading YAML definition for #{self} from #{path.inspect}"
|
28
|
+
logger.debug { "Loading YAML definition for #{self} from #{path.inspect}" }
|
29
29
|
object_args = YAML.safe_load(File.read(path), allowed_classes)
|
30
30
|
object_args.symbolize_keys!
|
31
31
|
object_args.dereference_with!(self, model, attribute_definitions) if needs_dereferencing?
|
@@ -42,7 +42,7 @@ module Occi
|
|
42
42
|
# @return [Object] constructed instance
|
43
43
|
# @return [NilClass] if such an instance could not be constructed
|
44
44
|
def build(identifier, args = {})
|
45
|
-
logger.debug "Building instance of #{identifier.inspect} with #{args.inspect}"
|
45
|
+
logger.debug { "Building instance of #{identifier.inspect} with #{args.inspect}" }
|
46
46
|
k_args = args_with_kind(identifier, args)
|
47
47
|
klass(identifier, parent_klass(k_args[:kind])).new k_args
|
48
48
|
end
|
@@ -93,7 +93,7 @@ module Occi
|
|
93
93
|
"#{found_klass} is not a sub-type of #{known_ancestor}"
|
94
94
|
end
|
95
95
|
|
96
|
-
logger.debug "Found class #{found_klass} for #{identifier.inspect}"
|
96
|
+
logger.debug { "Found class #{found_klass} for #{identifier.inspect}" }
|
97
97
|
found_klass
|
98
98
|
end
|
99
99
|
|
@@ -119,10 +119,10 @@ module Occi
|
|
119
119
|
# @return [Class] located known parent class
|
120
120
|
def parent_klass(kind)
|
121
121
|
if kind.related? kind_instance(Occi::Core::Constants::RESOURCE_KIND)
|
122
|
-
logger.debug "Identified #{kind.identifier} as Resource"
|
122
|
+
logger.debug { "Identified #{kind.identifier} as Resource" }
|
123
123
|
Occi::Core::Resource
|
124
124
|
elsif kind.related? kind_instance(Occi::Core::Constants::LINK_KIND)
|
125
|
-
logger.debug "Identified #{kind.identifier} as Link"
|
125
|
+
logger.debug { "Identified #{kind.identifier} as Link" }
|
126
126
|
Occi::Core::Link
|
127
127
|
else
|
128
128
|
raise Occi::Core::Errors::ModelLookupError,
|
@@ -18,10 +18,6 @@ module Occi
|
|
18
18
|
|
19
19
|
attr_accessor :model, :media_type
|
20
20
|
|
21
|
-
# Shortcuts to interesting methods on logger
|
22
|
-
DELEGATED = %i[debug? info? warn? error? fatal?].freeze
|
23
|
-
delegate(*DELEGATED, to: :logger, prefix: true)
|
24
|
-
|
25
21
|
# Constructs an instance of the parser that will use a particular model as the reference for every
|
26
22
|
# parsed instance. Only instances allowed by the model will be successfuly parsed. In case of
|
27
23
|
# `Occi::Core::Category` instances, only identifiers are parsed and existing instances from the model
|
@@ -36,7 +32,7 @@ module Occi
|
|
36
32
|
|
37
33
|
@model = args.fetch(:model)
|
38
34
|
@media_type = args.fetch(:media_type)
|
39
|
-
logger.debug "Initializing parser for #{media_type.inspect}"
|
35
|
+
logger.debug { "Initializing parser for #{media_type.inspect}" }
|
40
36
|
|
41
37
|
post_initialize(args)
|
42
38
|
end
|
@@ -123,10 +119,6 @@ module Occi
|
|
123
119
|
end
|
124
120
|
|
125
121
|
class << self
|
126
|
-
# Shortcuts to interesting methods on logger
|
127
|
-
DELEGATED = %i[debug? info? warn? error? fatal?].freeze
|
128
|
-
delegate(*DELEGATED, to: :logger, prefix: true)
|
129
|
-
|
130
122
|
# Returns a list of supported media types for this parser.
|
131
123
|
#
|
132
124
|
# @return [Array] list of supported media types
|
@@ -12,10 +12,6 @@ module Occi
|
|
12
12
|
extend Helpers::RawJsonParser
|
13
13
|
|
14
14
|
class << self
|
15
|
-
# Shortcuts to interesting methods on logger
|
16
|
-
DELEGATED = %i[debug? info? warn? error? fatal?].freeze
|
17
|
-
delegate(*DELEGATED, to: :logger, prefix: true)
|
18
|
-
|
19
15
|
# Parses action instances. Internal references between objects are converted from strings
|
20
16
|
# to actual objects. Actions have to be declared in the provided model.
|
21
17
|
#
|
@@ -26,12 +22,12 @@ module Occi
|
|
26
22
|
parsed = raw_hash(body)
|
27
23
|
action = handle(Occi::Core::Errors::ParsingError) { model.find_by_identifier! parsed[:action] }
|
28
24
|
|
29
|
-
logger.debug "Identified #{action.class}[#{action.identifier}]"
|
25
|
+
logger.debug { "Identified #{action.class}[#{action.identifier}]" }
|
30
26
|
ai = Occi::Core::ActionInstance.new(action: action)
|
31
27
|
ep = Entity.new(model: model)
|
32
28
|
ep.set_attributes!(ai, parsed[:attributes]) if parsed[:attributes]
|
33
29
|
|
34
|
-
logger.debug "Parsed into ActionInstance #{ai.inspect}"
|
30
|
+
logger.debug { "Parsed into ActionInstance #{ai.inspect}" }
|
35
31
|
ai
|
36
32
|
end
|
37
33
|
end
|
@@ -27,10 +27,6 @@ module Occi
|
|
27
27
|
DEPENDS_KEY = :depends
|
28
28
|
|
29
29
|
class << self
|
30
|
-
# Shortcuts to interesting methods on logger
|
31
|
-
DELEGATED = %i[debug? info? warn? error? fatal?].freeze
|
32
|
-
delegate(*DELEGATED, to: :logger, prefix: true)
|
33
|
-
|
34
30
|
# Parses categories into instances of subtypes of `Occi::Core::Category`. Internal references
|
35
31
|
# between objects are converted from strings to actual objects. Categories provided in the model
|
36
32
|
# will be reused but have to be declared in the parsed model as well.
|
@@ -41,12 +37,12 @@ module Occi
|
|
41
37
|
def json(body, model)
|
42
38
|
parsed = raw_hash(body)
|
43
39
|
instantiate_hashes! parsed, model
|
44
|
-
logger.debug "Parsed into raw hashes #{parsed.inspect}"
|
40
|
+
logger.debug { "Parsed into raw hashes #{parsed.inspect}" }
|
45
41
|
|
46
42
|
raw_categories = [parsed[:kinds], parsed[:mixins]].flatten.compact
|
47
43
|
dereference_identifiers! model.categories, raw_categories
|
48
44
|
|
49
|
-
logger.debug "Returning (updated) model #{model.inspect}"
|
45
|
+
logger.debug { "Returning (updated) model #{model.inspect}" }
|
50
46
|
model
|
51
47
|
end
|
52
48
|
|
@@ -59,7 +55,7 @@ module Occi
|
|
59
55
|
|
60
56
|
# :nodoc:
|
61
57
|
def instatiate_hash(raw, klass)
|
62
|
-
logger.debug "Creating #{klass} from #{raw.inspect}"
|
58
|
+
logger.debug { "Creating #{klass} from #{raw.inspect}" }
|
63
59
|
|
64
60
|
obj = klass.new(
|
65
61
|
term: raw[:term], schema: raw[:scheme], title: raw[:title],
|
@@ -67,11 +63,11 @@ module Occi
|
|
67
63
|
)
|
68
64
|
|
69
65
|
if obj.respond_to?(:location)
|
70
|
-
logger.debug "Setting location #{raw[:location].inspect}"
|
66
|
+
logger.debug { "Setting location #{raw[:location].inspect}" }
|
71
67
|
obj.location = handle(Occi::Core::Errors::ParsingError) { URI.parse(raw[:location]) }
|
72
68
|
end
|
73
69
|
|
74
|
-
logger.debug "Created category #{obj.inspect}"
|
70
|
+
logger.debug { "Created category #{obj.inspect}" }
|
75
71
|
obj
|
76
72
|
end
|
77
73
|
|
@@ -81,7 +77,7 @@ module Occi
|
|
81
77
|
|
82
78
|
attr_defs = {}
|
83
79
|
raw.each_pair do |k, v|
|
84
|
-
logger.debug "Creating AttributeDefinition for #{k.inspect} from #{v.inspect}"
|
80
|
+
logger.debug { "Creating AttributeDefinition for #{k.inspect} from #{v.inspect}" }
|
85
81
|
def_hsh = typecast(v)
|
86
82
|
unless def_hsh[:type]
|
87
83
|
raise Occi::Core::Errors::ParsingError, "Attribute #{k.to_s.inspect} has no type"
|
@@ -105,14 +101,14 @@ module Occi
|
|
105
101
|
|
106
102
|
# :nodoc:
|
107
103
|
def lookup_applies_references!(mixin, derefd, parsed_rel)
|
108
|
-
logger.debug "Looking up applies from #{parsed_rel.inspect}"
|
104
|
+
logger.debug { "Looking up applies from #{parsed_rel.inspect}" }
|
109
105
|
return if parsed_rel.blank?
|
110
106
|
parsed_rel.each { |kind| mixin.applies << first_or_die(derefd, kind) }
|
111
107
|
end
|
112
108
|
|
113
109
|
# :nodoc:
|
114
110
|
def lookup_depends_references!(mixin, derefd, parsed_rel)
|
115
|
-
logger.debug "Looking up depens from #{parsed_rel.inspect}"
|
111
|
+
logger.debug { "Looking up depens from #{parsed_rel.inspect}" }
|
116
112
|
return if parsed_rel.blank?
|
117
113
|
parsed_rel.each { |mxn| mixin.depends << first_or_die(derefd, mxn) }
|
118
114
|
end
|
@@ -14,10 +14,6 @@ module Occi
|
|
14
14
|
include Helpers::ErrorHandler
|
15
15
|
extend Helpers::RawJsonParser
|
16
16
|
|
17
|
-
# Shortcuts to interesting methods on logger
|
18
|
-
DELEGATED = %i[debug? info? warn? error? fatal?].freeze
|
19
|
-
delegate(*DELEGATED, to: :logger, prefix: true)
|
20
|
-
|
21
17
|
# Constants
|
22
18
|
SINGLE_INSTANCE_TYPES = %i[resource link].freeze
|
23
19
|
MULTI_INSTANCE_TYPES = %i[entity-collection].freeze
|
@@ -67,14 +63,14 @@ module Occi
|
|
67
63
|
# @param hash [Hash] Hash body for parsing
|
68
64
|
# @return [Array] constructed instances
|
69
65
|
def json_single(hash)
|
70
|
-
logger.debug "Converting #{hash.inspect} into a single instance"
|
66
|
+
logger.debug { "Converting #{hash.inspect} into a single instance" }
|
71
67
|
instance = @_ib.get hash[:kind], mixins: lookup(hash[:mixins]), actions: lookup(hash[:actions])
|
72
68
|
|
73
69
|
set_attributes! instance, hash[:attributes]
|
74
70
|
set_links! instance, hash[:links] if instance.respond_to?(:links)
|
75
71
|
set_target! instance, hash[:target] if instance.respond_to?(:target)
|
76
72
|
|
77
|
-
logger.debug "Created instance #{instance.inspect}"
|
73
|
+
logger.debug { "Created instance #{instance.inspect}" }
|
78
74
|
Set.new [instance]
|
79
75
|
end
|
80
76
|
|
@@ -85,12 +81,12 @@ module Occi
|
|
85
81
|
def json_collection(hash)
|
86
82
|
all = []
|
87
83
|
|
88
|
-
logger.debug "Converting #{hash.inspect} into multiple instances"
|
84
|
+
logger.debug { "Converting #{hash.inspect} into multiple instances" }
|
89
85
|
all.concat hash[:resources] if hash[:resources]
|
90
86
|
all.concat hash[:links] if hash[:links]
|
91
87
|
all.map! { |a| json_single(a) }
|
92
88
|
|
93
|
-
logger.debug "Created instances #{all.inspect}"
|
89
|
+
logger.debug { "Created instances #{all.inspect}" }
|
94
90
|
Set.new(all).flatten
|
95
91
|
end
|
96
92
|
|
@@ -107,7 +103,7 @@ module Occi
|
|
107
103
|
def set_attributes!(instance, hash)
|
108
104
|
return if hash.blank?
|
109
105
|
hash.each_pair do |name, value|
|
110
|
-
logger.debug "Setting attribute #{name} to #{value.inspect}"
|
106
|
+
logger.debug { "Setting attribute #{name} to #{value.inspect}" }
|
111
107
|
attribute = instance.attributes[name.to_s]
|
112
108
|
unless attribute
|
113
109
|
raise Occi::Core::Errors::ParsingError,
|
@@ -138,7 +134,7 @@ module Occi
|
|
138
134
|
end
|
139
135
|
return value unless TYPECASTER_HASH.key?(type)
|
140
136
|
|
141
|
-
logger.debug "Typecasting value #{value.inspect} to #{type}"
|
137
|
+
logger.debug { "Typecasting value #{value.inspect} to #{type}" }
|
142
138
|
TYPECASTER_HASH[type].call(value)
|
143
139
|
end
|
144
140
|
|
@@ -15,10 +15,6 @@ module Occi
|
|
15
15
|
BASE_SCHEMAS = %i[occi-schema].freeze
|
16
16
|
|
17
17
|
class << self
|
18
|
-
# Shortcuts to interesting methods on logger
|
19
|
-
DELEGATED = %i[debug? info? warn? error? fatal?].freeze
|
20
|
-
delegate(*DELEGATED, to: :logger, prefix: true)
|
21
|
-
|
22
18
|
# Validates given `json` text with the appropriate schema for `type`.
|
23
19
|
# This method raises `Occi::Core::Errors::ParsingError` on failure.
|
24
20
|
#
|
@@ -26,7 +22,7 @@ module Occi
|
|
26
22
|
# @param type [Symbol] schema selector
|
27
23
|
# @raise [Occi::Core::Errors::ParsingError] on validation failure
|
28
24
|
def validate!(json, type)
|
29
|
-
logger.debug "Validating #{json.inspect} as #{type}"
|
25
|
+
logger.debug { "Validating #{json.inspect} as #{type}" }
|
30
26
|
|
31
27
|
JSON::Validator.schema_reader = JSON::Schema::Reader.new(accept_uri: false, accept_file: true)
|
32
28
|
JSON::Validator.validate!(schema_for(type), json, json: true)
|
@@ -75,7 +71,7 @@ module Occi
|
|
75
71
|
raise Occi::Core::Errors::ParserError, "Schema type #{type.inspect} is not allowed"
|
76
72
|
end
|
77
73
|
schema_path = File.join(SCHEMA_REPO, "#{type}.json")
|
78
|
-
logger.debug "Found JSON schema for #{type} in #{schema_path}"
|
74
|
+
logger.debug { "Found JSON schema for #{type} in #{schema_path}" }
|
79
75
|
|
80
76
|
schema_path
|
81
77
|
end
|
@@ -34,7 +34,7 @@ module Occi
|
|
34
34
|
# @return [Set] set of instances
|
35
35
|
def entities(body, _headers = nil, expectation = nil)
|
36
36
|
expectation ||= Occi::Core::Entity
|
37
|
-
logger.debug "Parsing #{expectation}(s) from #{body.inspect}"
|
37
|
+
logger.debug { "Parsing #{expectation}(s) from #{body.inspect}" }
|
38
38
|
type = validate_entities! body
|
39
39
|
|
40
40
|
entity_parser = Json::Entity.new(model: model)
|
@@ -55,7 +55,7 @@ module Occi
|
|
55
55
|
# @param headers [Hash] raw headers as provided by the transport protocol
|
56
56
|
# @return [Set] set of parsed instances
|
57
57
|
def action_instances(body, _headers = nil)
|
58
|
-
logger.debug "Parsing Occi::Core::ActionInstance(s) from #{body.inspect}"
|
58
|
+
logger.debug { "Parsing Occi::Core::ActionInstance(s) from #{body.inspect}" }
|
59
59
|
Json::Validator.validate_action_instance! body
|
60
60
|
Set.new [Json::ActionInstance.json(body, model)]
|
61
61
|
end
|
@@ -69,7 +69,7 @@ module Occi
|
|
69
69
|
# @return [Set] set of instances
|
70
70
|
def categories(body, _headers = nil, expectation = nil)
|
71
71
|
expectation ||= Occi::Core::Category
|
72
|
-
logger.debug "Parsing #{expectation}(s) from #{body.inspect}"
|
72
|
+
logger.debug { "Parsing #{expectation}(s) from #{body.inspect}" }
|
73
73
|
Json::Validator.validate_category_identifiers! body
|
74
74
|
|
75
75
|
cats = Set.new
|
@@ -84,12 +84,12 @@ module Occi
|
|
84
84
|
found = nil
|
85
85
|
|
86
86
|
%i[link resource entity-collection].each do |type|
|
87
|
-
logger.debug "Attempting to validate #{body.inspect} as #{type}"
|
87
|
+
logger.debug { "Attempting to validate #{body.inspect} as #{type}" }
|
88
88
|
begin
|
89
89
|
Json::Validator.validate! body, type
|
90
90
|
found = type
|
91
91
|
rescue => ex
|
92
|
-
logger.debug "Moving on, body does not contain valid #{type} - #{ex.message.inspect}"
|
92
|
+
logger.debug { "Moving on, body does not contain valid #{type} - #{ex.message.inspect}" }
|
93
93
|
end
|
94
94
|
end
|
95
95
|
raise Occi::Core::Errors::ParsingError, 'No acceptable entity rendering found' unless found
|
@@ -111,7 +111,7 @@ module Occi
|
|
111
111
|
raise Occi::Core::Errors::ParsingError,
|
112
112
|
"Model cannot be parsed from #{media_type.inspect}"
|
113
113
|
end
|
114
|
-
logger.debug "Parsing model from #{media_type.inspect} in #{body.inspect}"
|
114
|
+
logger.debug { "Parsing model from #{media_type.inspect} in #{body.inspect}" }
|
115
115
|
|
116
116
|
Json::Validator.validate_model! body
|
117
117
|
Json::Category.json body, model
|
@@ -129,7 +129,7 @@ module Occi
|
|
129
129
|
unless media_types.include?(media_type)
|
130
130
|
raise Occi::Core::Errors::ParsingError, "Locations cannot be parsed from #{media_type.inspect}"
|
131
131
|
end
|
132
|
-
logger.debug "Parsing locations from #{media_type.inspect} in #{body.inspect}"
|
132
|
+
logger.debug { "Parsing locations from #{media_type.inspect} in #{body.inspect}" }
|
133
133
|
|
134
134
|
Json::Validator.validate_locations! body
|
135
135
|
handle(Occi::Core::Errors::ParsingError) { JSON.parse(body).map { |i| URI.parse(i) } }
|
@@ -20,10 +20,6 @@ module Occi
|
|
20
20
|
DEPENDS_KEY = :rel
|
21
21
|
|
22
22
|
class << self
|
23
|
-
# Shortcuts to interesting methods on logger
|
24
|
-
DELEGATED = %i[debug? info? warn? error? fatal?].freeze
|
25
|
-
delegate(*DELEGATED, to: :logger, prefix: true)
|
26
|
-
|
27
23
|
# Parses category lines into instances of subtypes of `Occi::Core::Category`. Internal references
|
28
24
|
# between objects are converted from strings to actual objects. Categories provided in the model
|
29
25
|
# will be reused but have to be declared in the parsed model as well. This mechanism can be used to
|
@@ -41,7 +37,7 @@ module Occi
|
|
41
37
|
end
|
42
38
|
dereference_identifiers! model.categories, raw_categories
|
43
39
|
|
44
|
-
logger.debug "Returning (updated) model #{model.inspect}"
|
40
|
+
logger.debug { "Returning (updated) model #{model.inspect}" }
|
45
41
|
model
|
46
42
|
end
|
47
43
|
|
@@ -52,7 +48,7 @@ module Occi
|
|
52
48
|
# @param full [TrueClass, FalseClass] parse full definition, defaults to `true`
|
53
49
|
# @return [Hash] raw category hash for further processing
|
54
50
|
def plain_category(line, full = true)
|
55
|
-
logger.debug "Parsing line #{line.inspect}"
|
51
|
+
logger.debug { "Parsing line #{line.inspect}" }
|
56
52
|
matched = line.match(CATEGORY_REGEXP)
|
57
53
|
unless matched
|
58
54
|
raise Occi::Core::Errors::ParsingError, "#{line.inspect} does not match expectations for Category"
|
@@ -96,7 +92,7 @@ module Occi
|
|
96
92
|
|
97
93
|
attributes = {}
|
98
94
|
line.split.each { |attribute| attributes.merge! plain_attribute(attribute) }
|
99
|
-
logger.debug "Matched attributes as #{attributes.inspect}"
|
95
|
+
logger.debug { "Matched attributes as #{attributes.inspect}" }
|
100
96
|
|
101
97
|
attributes
|
102
98
|
end
|
@@ -112,7 +108,7 @@ module Occi
|
|
112
108
|
def plain_attribute(line)
|
113
109
|
# TODO: find a better approach to fixing split
|
114
110
|
line.gsub!(/\{(immutable|required)_(required|immutable)\}/, '{\1 \2}')
|
115
|
-
logger.debug "Parsing attribute line #{line.inspect}"
|
111
|
+
logger.debug { "Parsing attribute line #{line.inspect}" }
|
116
112
|
|
117
113
|
matched = line.match(ATTRIBUTE_REGEXP)
|
118
114
|
unless matched && matched[1]
|
@@ -13,10 +13,6 @@ module Occi
|
|
13
13
|
include Helpers::ArgumentValidator
|
14
14
|
include Helpers::ErrorHandler
|
15
15
|
|
16
|
-
# Shortcuts to interesting methods on logger
|
17
|
-
DELEGATED = %i[debug? info? warn? error? fatal?].freeze
|
18
|
-
delegate(*DELEGATED, to: :logger, prefix: true)
|
19
|
-
|
20
16
|
# Regexp constants
|
21
17
|
ATTRIBUTE_REGEXP = /#{Constants::REGEXP_ATTRIBUTE}/
|
22
18
|
LINK_REGEXP = /#{Constants::REGEXP_LINK}/
|
@@ -25,7 +21,7 @@ module Occi
|
|
25
21
|
DEFAULT_LAMBDA = ->(val) { raise "#{self} -> Cannot typecast #{val.inspect} to an unknown type" }
|
26
22
|
|
27
23
|
FLOAT_LAMBDA = ->(val) { Float(val) rescue raise(Occi::Core::Errors::ParsingError, "Wrong value #{val}") }
|
28
|
-
JSON_LAMBDA = ->(val) { JSON.parse(val.gsub('\"', '"')) }
|
24
|
+
JSON_LAMBDA = ->(val) { JSON.parse(val.gsub('\"', '"'), symbolize_names: true) }
|
29
25
|
|
30
26
|
TYPECASTER_HASH = {
|
31
27
|
IPAddr => ->(val) { IPAddr.new val },
|
@@ -62,7 +58,7 @@ module Occi
|
|
62
58
|
cats = plain_categories(lines)
|
63
59
|
kind = cats.detect { |c| c.is_a?(Occi::Core::Kind) }
|
64
60
|
raise Occi::Core::Errors::ParsingError, 'Entity does not specify its kind' unless kind
|
65
|
-
logger.debug "Identified entity kind #{kind.inspect}"
|
61
|
+
logger.debug { "Identified entity kind #{kind.inspect}" }
|
66
62
|
|
67
63
|
entity = @_ib.build(kind.identifier)
|
68
64
|
cats.each { |cat| cat.is_a?(Occi::Core::Mixin) && entity << cat }
|
@@ -70,7 +66,7 @@ module Occi
|
|
70
66
|
plain_attributes! lines, entity.attributes
|
71
67
|
plain_links! lines, entity
|
72
68
|
|
73
|
-
logger.debug "Created instance #{entity.inspect}"
|
69
|
+
logger.debug { "Created instance #{entity.inspect}" }
|
74
70
|
entity
|
75
71
|
end
|
76
72
|
|
@@ -116,7 +112,7 @@ module Occi
|
|
116
112
|
# @param line [String] line containing a single entity attribute
|
117
113
|
# @return [Array] two-element array with name and value of the attribute
|
118
114
|
def raw_attribute(line)
|
119
|
-
logger.debug "Parsing attribute line #{line.inspect}"
|
115
|
+
logger.debug { "Parsing attribute line #{line.inspect}" }
|
120
116
|
matched = line.match(ATTRIBUTE_REGEXP)
|
121
117
|
unless matched
|
122
118
|
raise Occi::Core::Errors::ParsingError, "#{line.inspect} does not match expectations for Attribute"
|
@@ -133,7 +129,7 @@ module Occi
|
|
133
129
|
def plain_links!(lines, entity)
|
134
130
|
lines.each do |line|
|
135
131
|
next unless line.start_with?(TextParser::LINK_KEYS.first)
|
136
|
-
logger.debug "Parsing link line #{line.inspect}"
|
132
|
+
logger.debug { "Parsing link line #{line.inspect}" }
|
137
133
|
|
138
134
|
matched = line.match(LINK_REGEXP)
|
139
135
|
unless matched
|
@@ -196,11 +192,11 @@ module Occi
|
|
196
192
|
target_kind = handle(Occi::Core::Errors::ParsingError) { model.find_by_identifier!(md[:rel]) }
|
197
193
|
link = @_ib.build(categories.shift, target_kind: target_kind)
|
198
194
|
categories.each do |mxn|
|
199
|
-
logger.debug "Adding mixin #{mxn.inspect} to link instance"
|
195
|
+
logger.debug { "Adding mixin #{mxn.inspect} to link instance" }
|
200
196
|
link << handle(Occi::Core::Errors::ParsingError) { model.find_by_identifier!(mxn) }
|
201
197
|
end
|
202
198
|
|
203
|
-
logger.debug "Created link instance #{link.inspect} from #{md.inspect}"
|
199
|
+
logger.debug { "Created link instance #{link.inspect} from #{md.inspect}" }
|
204
200
|
link
|
205
201
|
end
|
206
202
|
|
@@ -212,7 +208,7 @@ module Occi
|
|
212
208
|
if md[:attributes].blank?
|
213
209
|
raise Occi::Core::Errors::ParsingError, "Link #{link.id} is missing attribute information"
|
214
210
|
end
|
215
|
-
logger.debug "Parsing inline link attributes from line #{md[:attributes].inspect}"
|
211
|
+
logger.debug { "Parsing inline link attributes from line #{md[:attributes].inspect}" }
|
216
212
|
|
217
213
|
regexp = Regexp.new "(\\s*#{Constants::REGEXP_ATTRIBUTE_REPR})"
|
218
214
|
line = md[:attributes].strip.gsub(/^;\s*/, '')
|
@@ -234,7 +230,7 @@ module Occi
|
|
234
230
|
raise Occi::Core::Errors::ParsingError, 'Cannot typecast (un)set value to (un)set type'
|
235
231
|
end
|
236
232
|
|
237
|
-
logger.debug "Typecasting value #{value.inspect} to #{type}"
|
233
|
+
logger.debug { "Typecasting value #{value.inspect} to #{type}" }
|
238
234
|
self.class.typecaster[type].call(value)
|
239
235
|
end
|
240
236
|
|
@@ -11,10 +11,6 @@ module Occi
|
|
11
11
|
include Helpers::ErrorHandler
|
12
12
|
|
13
13
|
class << self
|
14
|
-
# Shortcuts to interesting methods on logger
|
15
|
-
DELEGATED = %i[debug? info? warn? error? fatal?].freeze
|
16
|
-
delegate(*DELEGATED, to: :logger, prefix: true)
|
17
|
-
|
18
14
|
# Parses text/plain OCCI locations into `URI` instances suitable for futher processing.
|
19
15
|
# Every location line is expected to begin with 'X-OCCI-Location'.
|
20
16
|
#
|
@@ -25,7 +21,7 @@ module Occi
|
|
25
21
|
|
26
22
|
locations = lines.map do |line|
|
27
23
|
next if line.blank?
|
28
|
-
logger.debug "Parsing location from line #{line.inspect}"
|
24
|
+
logger.debug { "Parsing location from line #{line.inspect}" }
|
29
25
|
|
30
26
|
matched = line.match(regexp)
|
31
27
|
unless matched
|
@@ -45,7 +41,7 @@ module Occi
|
|
45
41
|
def uri_list(lines)
|
46
42
|
uris = lines.map do |line|
|
47
43
|
next if line.blank? || line.start_with?('#')
|
48
|
-
logger.debug "Parsing location from line #{line.inspect}"
|
44
|
+
logger.debug { "Parsing location from line #{line.inspect}" }
|
49
45
|
|
50
46
|
handle(Occi::Core::Errors::ParsingError) { URI.parse(line.strip) }
|
51
47
|
end
|
@@ -50,7 +50,7 @@ module Occi
|
|
50
50
|
# @return [Set] set of instances
|
51
51
|
def entities(body, headers, expectation = nil)
|
52
52
|
expectation ||= Occi::Core::Entity
|
53
|
-
logger.debug "Parsing #{expectation} from #{body.inspect} and #{headers.inspect}"
|
53
|
+
logger.debug { "Parsing #{expectation} from #{body.inspect} and #{headers.inspect}" }
|
54
54
|
|
55
55
|
entity_parser = Text::Entity.new(model: model)
|
56
56
|
entity = entity_parser.plain transform(body, headers)
|
@@ -68,7 +68,7 @@ module Occi
|
|
68
68
|
# @param headers [Hash] raw headers as provided by the transport protocol
|
69
69
|
# @return [Set] set of parsed instances
|
70
70
|
def action_instances(body, headers)
|
71
|
-
logger.debug "Parsing Occi::Core::ActionInstance from #{body.inspect} and #{headers.inspect}"
|
71
|
+
logger.debug { "Parsing Occi::Core::ActionInstance from #{body.inspect} and #{headers.inspect}" }
|
72
72
|
entity_parser = Text::Entity.new(model: model)
|
73
73
|
tformed = transform(body, headers)
|
74
74
|
|
@@ -88,7 +88,7 @@ module Occi
|
|
88
88
|
# @return [Set] set of instances
|
89
89
|
def categories(body, headers, expectation = nil)
|
90
90
|
expectation ||= Occi::Core::Category
|
91
|
-
logger.debug "Parsing #{expectation} from #{body.inspect} and #{headers.inspect}"
|
91
|
+
logger.debug { "Parsing #{expectation} from #{body.inspect} and #{headers.inspect}" }
|
92
92
|
|
93
93
|
cats = transform(body, headers).map do |line|
|
94
94
|
cat = Text::Category.plain_category(line, false)
|
@@ -119,9 +119,7 @@ module Occi
|
|
119
119
|
# @param model [Occi::Core::Model] `Model`-like instance to be populated (may contain existing categories)
|
120
120
|
# @return [Occi::Core::Model] model instance filled with parsed categories
|
121
121
|
def model(body, headers, media_type, model)
|
122
|
-
|
123
|
-
logger.debug "Parsing model from #{media_type.inspect} in #{body.inspect} and #{headers.inspect}"
|
124
|
-
end
|
122
|
+
logger.debug { "Parsing model from #{media_type.inspect} in #{body.inspect} and #{headers.inspect}" }
|
125
123
|
|
126
124
|
if HEADERS_TEXT_TYPES.include? media_type
|
127
125
|
Text::Category.plain transform_headers(headers), model
|
@@ -139,9 +137,7 @@ module Occi
|
|
139
137
|
# @param media_type [String] media type string as provided by the transport protocol
|
140
138
|
# @return [Array] list of extracted URIs
|
141
139
|
def locations(body, headers, media_type)
|
142
|
-
|
143
|
-
logger.debug "Parsing locations from #{media_type.inspect} in #{body.inspect} and #{headers.inspect}"
|
144
|
-
end
|
140
|
+
logger.debug { "Parsing locations from #{media_type.inspect} in #{body.inspect} and #{headers.inspect}" }
|
145
141
|
|
146
142
|
if URI_LIST_TYPES.include? media_type
|
147
143
|
Text::Location.uri_list transform_body(body)
|
@@ -170,7 +166,7 @@ module Occi
|
|
170
166
|
# @param headers [Hash] hash with raw header key-value pairs
|
171
167
|
# @return [Array] an array of body-like lines
|
172
168
|
def transform_headers(headers)
|
173
|
-
logger.debug "Transforming headers #{headers.inspect}"
|
169
|
+
logger.debug { "Transforming headers #{headers.inspect}" }
|
174
170
|
unify_headers(
|
175
171
|
canonize_headers(
|
176
172
|
normalize_headers(headers)
|
@@ -192,7 +188,7 @@ module Occi
|
|
192
188
|
headers.delete_if { |_k, v| v.blank? } # remove pairs with empty values
|
193
189
|
headers.keep_if { |k, _v| OCCI_KEYS.include?(k) } # drop non-OCCI pairs
|
194
190
|
|
195
|
-
logger.debug "Normalized headers #{headers.inspect}"
|
191
|
+
logger.debug { "Normalized headers #{headers.inspect}" }
|
196
192
|
headers
|
197
193
|
end
|
198
194
|
|
@@ -210,7 +206,7 @@ module Occi
|
|
210
206
|
canonical[pref.first] = [canonize_header_value(value)].flatten
|
211
207
|
end
|
212
208
|
|
213
|
-
logger.debug "Canonized headers #{canonical.inspect}"
|
209
|
+
logger.debug { "Canonized headers #{canonical.inspect}" }
|
214
210
|
canonical
|
215
211
|
end
|
216
212
|
|
@@ -237,7 +233,7 @@ module Occi
|
|
237
233
|
lines << v.map { |val| "#{k}: #{val}" }
|
238
234
|
end
|
239
235
|
|
240
|
-
logger.debug "Unified headers #{lines.inspect}"
|
236
|
+
logger.debug { "Unified headers #{lines.inspect}" }
|
241
237
|
lines.flatten.sort
|
242
238
|
end
|
243
239
|
|
@@ -31,7 +31,7 @@ module Occi
|
|
31
31
|
def initialize(args = {})
|
32
32
|
default_args! args
|
33
33
|
|
34
|
-
logger.debug "Initializing RendererFactory with #{args.inspect}"
|
34
|
+
logger.debug { "Initializing RendererFactory with #{args.inspect}" }
|
35
35
|
@required_methods = args.fetch(:required_methods)
|
36
36
|
@namespace = args.fetch(:namespace)
|
37
37
|
|
@@ -40,7 +40,7 @@ module Occi
|
|
40
40
|
|
41
41
|
#
|
42
42
|
def reload!
|
43
|
-
logger.debug 'Clearing RendererFactory cache for renderer reload'
|
43
|
+
logger.debug { 'Clearing RendererFactory cache for renderer reload' }
|
44
44
|
@ravail_cache = nil
|
45
45
|
end
|
46
46
|
|
@@ -65,7 +65,7 @@ module Occi
|
|
65
65
|
@ravail_cache = {}
|
66
66
|
|
67
67
|
renderer_classes.each do |rndr_klass|
|
68
|
-
logger.debug "RendererFactory registering #{rndr_klass} for #{rndr_klass.formats}"
|
68
|
+
logger.debug { "RendererFactory registering #{rndr_klass} for #{rndr_klass.formats}" }
|
69
69
|
rndr_klass.formats.each { |rndr_klass_f| @ravail_cache[rndr_klass_f] = rndr_klass }
|
70
70
|
end
|
71
71
|
|
@@ -113,7 +113,7 @@ module Occi
|
|
113
113
|
renderer_with_methods! candidate
|
114
114
|
renderer_with_formats! candidate
|
115
115
|
rescue Occi::Core::Errors::RendererError => ex
|
116
|
-
logger.debug "Renderer validation failed with #{ex.message}"
|
116
|
+
logger.debug { "Renderer validation failed with #{ex.message}" }
|
117
117
|
return false
|
118
118
|
end
|
119
119
|
|
@@ -176,7 +176,7 @@ module Occi
|
|
176
176
|
raise Occi::Core::Errors::RendererError, "#{namespace.inspect} " \
|
177
177
|
'is not a Module'
|
178
178
|
end
|
179
|
-
logger.debug "RendererFactory looking for renderers in #{namespace}"
|
179
|
+
logger.debug { "RendererFactory looking for renderers in #{namespace}" }
|
180
180
|
namespace.constants.collect { |const| namespace.const_get(const) }
|
181
181
|
end
|
182
182
|
|
@@ -32,7 +32,7 @@ module Occi
|
|
32
32
|
# @option options [String] :format (nil) rendering (sub)type
|
33
33
|
# @return [String] object rendering
|
34
34
|
def render(object, options)
|
35
|
-
logger.debug "#{self} rendering #{object.inspect} with #{options.inspect}"
|
35
|
+
logger.debug { "#{self} rendering #{object.inspect} with #{options.inspect}" }
|
36
36
|
candidate = rendering_candidate(object)
|
37
37
|
unless candidate
|
38
38
|
raise Occi::Core::Errors::RenderingError, "#{object.class} cannot be " \
|
@@ -12,7 +12,7 @@ module Occi
|
|
12
12
|
class Link < Base
|
13
13
|
include Instance
|
14
14
|
|
15
|
-
#
|
15
|
+
# Note: this is a hack for typing `source` on known Compute links
|
16
16
|
COMPUTE_KIND = 'http://schemas.ogf.org/occi/infrastructure#compute'.freeze
|
17
17
|
COMPUTY_LINKS = %w[
|
18
18
|
http://schemas.ogf.org/occi/infrastructure#networkinterface
|
@@ -32,10 +32,11 @@ module Occi
|
|
32
32
|
def typed_uri_hash(attribute, type)
|
33
33
|
hsh = { location: attribute.to_s }
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
35
|
+
known_kind = object_send("#{type}_kind")
|
36
|
+
hsh[:kind] = known_kind.identifier if known_kind
|
37
|
+
|
38
|
+
# Note: this is a hack for typing `source` on known Compute links
|
39
|
+
if hsh[:kind].blank? && type == :source && COMPUTY_LINKS.include?(object_kind.identifier)
|
39
40
|
hsh[:kind] = COMPUTE_KIND
|
40
41
|
end
|
41
42
|
|
data/lib/occi/core/version.rb
CHANGED
@@ -2,7 +2,7 @@ module Occi
|
|
2
2
|
module Core
|
3
3
|
MAJOR_VERSION = 5 # Major update constant
|
4
4
|
MINOR_VERSION = 0 # Minor update constant
|
5
|
-
PATCH_VERSION =
|
5
|
+
PATCH_VERSION = 1 # Patch/Fix version constant
|
6
6
|
STAGE_VERSION = nil # use `nil` for production releases
|
7
7
|
|
8
8
|
unless defined?(::Occi::Core::VERSION)
|
data/lib/occi/core/warehouse.rb
CHANGED
@@ -29,7 +29,7 @@ module Occi
|
|
29
29
|
#
|
30
30
|
# @param model [Occi::Core::Model] model to be bootstrapped
|
31
31
|
def bootstrap!(model)
|
32
|
-
logger.debug "Bootstrapping#{model.empty? ? ' empty' : ''} model"
|
32
|
+
logger.debug { "Bootstrapping#{model.empty? ? ' empty' : ''} model" }
|
33
33
|
actions! model
|
34
34
|
kinds! model
|
35
35
|
mixins! model
|
@@ -67,7 +67,7 @@ module Occi
|
|
67
67
|
def kinds!(model)
|
68
68
|
attribute_definitions = attribute_definitions_for(kinds_path)
|
69
69
|
yamls_in(kinds_path).each do |file|
|
70
|
-
logger.debug "Warehouse loading kind from #{file.inspect}"
|
70
|
+
logger.debug { "Warehouse loading kind from #{file.inspect}" }
|
71
71
|
model << Occi::Core::Kind.from_yaml(file, model, attribute_definitions)
|
72
72
|
end
|
73
73
|
end
|
@@ -76,7 +76,7 @@ module Occi
|
|
76
76
|
def mixins!(model)
|
77
77
|
attribute_definitions = attribute_definitions_for(mixins_path)
|
78
78
|
yamls_in(mixins_path).each do |file|
|
79
|
-
logger.debug "Warehouse loading mixin from #{file.inspect}"
|
79
|
+
logger.debug { "Warehouse loading mixin from #{file.inspect}" }
|
80
80
|
model << Occi::Core::Mixin.from_yaml(file, model, attribute_definitions)
|
81
81
|
end
|
82
82
|
end
|
@@ -86,7 +86,7 @@ module Occi
|
|
86
86
|
# TODO: work with separate attribute definitions
|
87
87
|
attribute_definitions = {}
|
88
88
|
yamls_in(actions_path).each do |file|
|
89
|
-
logger.debug "Warehouse loading action from #{file.inspect}"
|
89
|
+
logger.debug { "Warehouse loading action from #{file.inspect}" }
|
90
90
|
model << Occi::Core::Action.from_yaml(file, model, attribute_definitions)
|
91
91
|
end
|
92
92
|
end
|
@@ -98,7 +98,7 @@ module Occi
|
|
98
98
|
attr_defs_path = File.join(categories_path, ATTRIBS)
|
99
99
|
yamls_in(attr_defs_path).each do |file|
|
100
100
|
name = attribute_name_from(file)
|
101
|
-
logger.debug "Warehouse loading attribute definition for #{name.inspect} from #{file.inspect}"
|
101
|
+
logger.debug { "Warehouse loading attribute definition for #{name.inspect} from #{file.inspect}" }
|
102
102
|
attribute_definitions[name] = Occi::Core::AttributeDefinition.from_yaml(file)
|
103
103
|
end
|
104
104
|
|
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: 5.0.
|
4
|
+
version: 5.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Boris Parak
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-09-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|