occi-core 5.0.0 → 5.0.1
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.
- 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
|