kxi 1.0.1 → 1.0.2
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/lib/kxi.rb +44 -39
- data/lib/kxi/application/config.rb +177 -177
- data/lib/kxi/application/config_reader.rb +16 -16
- data/lib/kxi/application/event.rb +35 -35
- data/lib/kxi/application/logger.rb +155 -155
- data/lib/kxi/application/version.rb +106 -74
- data/lib/kxi/application/version_expression.rb +94 -69
- data/lib/kxi/application/workspace.rb +105 -0
- data/lib/kxi/cli/anonymous_argument.rb +50 -50
- data/lib/kxi/cli/argument.rb +56 -56
- data/lib/kxi/cli/argument_values.rb +83 -83
- data/lib/kxi/cli/explicit_argument.rb +38 -38
- data/lib/kxi/cli/flag_argument.rb +15 -15
- data/lib/kxi/cli/named_argument.rb +59 -59
- data/lib/kxi/cli/property_list.rb +57 -48
- data/lib/kxi/cli/table.rb +82 -62
- data/lib/kxi/cli/verb.rb +282 -280
- data/lib/kxi/collections/array_collection.rb +106 -106
- data/lib/kxi/collections/enumerable.rb +527 -527
- data/lib/kxi/collections/enumerator.rb +31 -31
- data/lib/kxi/collections/hash_collection.rb +100 -100
- data/lib/kxi/collections/protected_collection.rb +20 -19
- data/lib/kxi/exceptions/abstract_exception.rb +34 -34
- data/lib/kxi/exceptions/argument_exception.rb +21 -21
- data/lib/kxi/exceptions/collection_exception.rb +13 -13
- data/lib/kxi/exceptions/configuration_exception.rb +36 -25
- data/lib/kxi/exceptions/dimension_mismatch_exception.rb +29 -0
- data/lib/kxi/exceptions/invalid_type_exception.rb +32 -32
- data/lib/kxi/exceptions/no_argument_exception.rb +20 -20
- data/lib/kxi/exceptions/not_implemented_exception.rb +12 -12
- data/lib/kxi/exceptions/out_of_range_exception.rb +43 -43
- data/lib/kxi/exceptions/parse_exception.rb +28 -20
- data/lib/kxi/exceptions/verb_expected_exception.rb +20 -20
- data/lib/kxi/exceptions/workspace_collision_exception.rb +21 -0
- data/lib/kxi/math/math.rb +45 -0
- data/lib/kxi/math/matrix.rb +303 -0
- data/lib/kxi/math/polynomial.rb +141 -101
- data/lib/kxi/math/vector.rb +181 -0
- data/lib/kxi/platform.rb +103 -57
- data/lib/kxi/reflection/stack_frame.rb +80 -80
- data/lib/kxi/version.rb +4 -4
- metadata +8 -3
- data/lib/kxi/exceptions/invalid_operation_exception.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 98e721321d505ffda5f3bbcddb0f0433daa2c077
|
4
|
+
data.tar.gz: 0a2738b5d2f2a1f2936933049e91b14042ab031a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5051a6a876e67ff3a17df12a360f1fbede25a96303c49cbe5db66b12630e1a8ae5461294fff18a8a24138f903eac4d1912ca5c6659aab11d31451bc950d96e60
|
7
|
+
data.tar.gz: 8708c3aa97d4efd7e44d8385ca445c6e79ee73e5a9f1f8bbbb9e441cde0170cfabfeaf7f358a6604c55e8d48aef2b30d4b0fecea4f5bd1c041ee2029a6c61732
|
data/lib/kxi.rb
CHANGED
@@ -1,39 +1,44 @@
|
|
1
|
-
# Ruby
|
2
|
-
require 'date'
|
3
|
-
|
4
|
-
# KXI
|
5
|
-
require 'kxi/version'
|
6
|
-
require 'kxi/
|
7
|
-
require 'kxi/exceptions/
|
8
|
-
require 'kxi/exceptions/
|
9
|
-
require 'kxi/exceptions/
|
10
|
-
require 'kxi/exceptions/
|
11
|
-
require 'kxi/exceptions/
|
12
|
-
require 'kxi/exceptions/
|
13
|
-
require 'kxi/exceptions/
|
14
|
-
require 'kxi/exceptions/
|
15
|
-
require 'kxi/exceptions/
|
16
|
-
require 'kxi/exceptions/
|
17
|
-
require 'kxi/
|
18
|
-
require 'kxi/
|
19
|
-
require 'kxi/
|
20
|
-
require 'kxi/collections/
|
21
|
-
require 'kxi/collections/
|
22
|
-
require 'kxi/collections/
|
23
|
-
require 'kxi/
|
24
|
-
require 'kxi/
|
25
|
-
require 'kxi/cli/
|
26
|
-
require 'kxi/cli/
|
27
|
-
require 'kxi/cli/
|
28
|
-
require 'kxi/cli/
|
29
|
-
require 'kxi/cli/
|
30
|
-
require 'kxi/cli/
|
31
|
-
require 'kxi/cli/
|
32
|
-
require 'kxi/
|
33
|
-
require 'kxi/
|
34
|
-
require 'kxi/application/
|
35
|
-
require 'kxi/application/
|
36
|
-
require 'kxi/application/
|
37
|
-
require 'kxi/application/
|
38
|
-
require 'kxi/
|
39
|
-
require 'kxi/
|
1
|
+
# Ruby
|
2
|
+
require 'date'
|
3
|
+
|
4
|
+
# KXI
|
5
|
+
require 'kxi/version'
|
6
|
+
require 'kxi/platform'
|
7
|
+
require 'kxi/exceptions/abstract_exception'
|
8
|
+
require 'kxi/exceptions/collection_exception'
|
9
|
+
require 'kxi/exceptions/out_of_range_exception'
|
10
|
+
require 'kxi/exceptions/not_implemented_exception'
|
11
|
+
require 'kxi/exceptions/argument_exception'
|
12
|
+
require 'kxi/exceptions/no_argument_exception'
|
13
|
+
require 'kxi/exceptions/verb_expected_exception'
|
14
|
+
require 'kxi/exceptions/invalid_type_exception'
|
15
|
+
require 'kxi/exceptions/configuration_exception'
|
16
|
+
require 'kxi/exceptions/parse_exception'
|
17
|
+
require 'kxi/exceptions/workspace_collision_exception'
|
18
|
+
require 'kxi/exceptions/dimension_mismatch_exception'
|
19
|
+
require 'kxi/reflection/stack_frame'
|
20
|
+
require 'kxi/collections/enumerator'
|
21
|
+
require 'kxi/collections/enumerable'
|
22
|
+
require 'kxi/collections/array_collection'
|
23
|
+
require 'kxi/collections/hash_collection'
|
24
|
+
require 'kxi/collections/protected_collection'
|
25
|
+
require 'kxi/cli/argument'
|
26
|
+
require 'kxi/cli/explicit_argument'
|
27
|
+
require 'kxi/cli/anonymous_argument'
|
28
|
+
require 'kxi/cli/flag_argument'
|
29
|
+
require 'kxi/cli/named_argument'
|
30
|
+
require 'kxi/cli/argument_values'
|
31
|
+
require 'kxi/cli/verb'
|
32
|
+
require 'kxi/cli/table'
|
33
|
+
require 'kxi/cli/property_list'
|
34
|
+
require 'kxi/application/config_reader'
|
35
|
+
require 'kxi/application/config'
|
36
|
+
require 'kxi/application/event'
|
37
|
+
require 'kxi/application/logger'
|
38
|
+
require 'kxi/application/version'
|
39
|
+
require 'kxi/application/version_expression'
|
40
|
+
require 'kxi/application/workspace'
|
41
|
+
require 'kxi/math/math'
|
42
|
+
require 'kxi/math/vector'
|
43
|
+
require 'kxi/math/matrix'
|
44
|
+
require 'kxi/math/polynomial'
|
@@ -1,178 +1,178 @@
|
|
1
|
-
# Created by Matyáš Pokorný on 2018-01-24.
|
2
|
-
|
3
|
-
module KXI
|
4
|
-
module Application
|
5
|
-
# Represents configuration file
|
6
|
-
class Config
|
7
|
-
# Gets configuration file
|
8
|
-
# @return [String] Path to configuration file
|
9
|
-
def file
|
10
|
-
@file
|
11
|
-
end
|
12
|
-
|
13
|
-
# Instantiates the {KXI::Application::Config} file
|
14
|
-
# @param file [String] Configuration file to read
|
15
|
-
# @param reader [KXI::Application::ConfigReader] Readers used to parse configuration
|
16
|
-
def initialize(file, reader)
|
17
|
-
@file = file
|
18
|
-
@obj = reader.parse(File.read(file))
|
19
|
-
@pth = ''
|
20
|
-
@def = false
|
21
|
-
end
|
22
|
-
|
23
|
-
# Gets current context
|
24
|
-
# @return [Object] Current context
|
25
|
-
def context
|
26
|
-
@obj
|
27
|
-
end
|
28
|
-
|
29
|
-
# Gets path of current context
|
30
|
-
# @return [String] Path of current context
|
31
|
-
def path
|
32
|
-
@pth
|
33
|
-
end
|
34
|
-
|
35
|
-
# Gets value or default from current context
|
36
|
-
# @param key [String] Name of value
|
37
|
-
# @param default [Object, nil] Default value
|
38
|
-
# @yield [val] Validator function
|
39
|
-
# @yieldparam val [Object, nil] Value to validate
|
40
|
-
# @return [Object, nil] Value or default
|
41
|
-
def get(key, default = nil, &validator)
|
42
|
-
if not @def and @obj.key?(key)
|
43
|
-
ctx = @obj[key]
|
44
|
-
return ctx if validator == nil
|
45
|
-
return validate(key, ctx, &validator)
|
46
|
-
else
|
47
|
-
return default
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
# Gets value from current context
|
52
|
-
# @param key [String] Name of value
|
53
|
-
# @yield [val] Validator function
|
54
|
-
# @yieldparam val [Object, nil] Value to validate
|
55
|
-
# @return [Object, nil] Value
|
56
|
-
# @raise [KXI::Exceptions::ConfigurationException] Raised when field is not found
|
57
|
-
def get!(key, &validator)
|
58
|
-
if not @def and @obj.key?(key)
|
59
|
-
ctx = @obj[key]
|
60
|
-
return ctx if validator == nil
|
61
|
-
return validate(key, ctx, &validator)
|
62
|
-
else
|
63
|
-
raise(KXI::Exceptions::ConfigurationException.new(@file, "#{@pth}/#{key}", 'Field is mandatory!'))
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
# Enters named section of configuration file
|
68
|
-
# @param key [String] Name of section
|
69
|
-
# @param man [Bool] Determines whether this section is mandatory
|
70
|
-
# @yield [] Block of actions for entered context
|
71
|
-
def inside(key, man = false, &block)
|
72
|
-
if not @def and @obj.key?(key)
|
73
|
-
ctx = @obj[key]
|
74
|
-
raise(KXI::Exceptions::ConfigurationException.new(@file, "#{@pth}/#{key}", 'Field must be object!')) unless ctx.is_a?(Hash)
|
75
|
-
enter(key, ctx) do
|
76
|
-
block.call
|
77
|
-
end
|
78
|
-
elsif man
|
79
|
-
raise(KXI::Exceptions::ConfigurationException.new(@file, "#{@pth}/#{key}", 'Object is mandatory!'))
|
80
|
-
else
|
81
|
-
enter(key, nil) do
|
82
|
-
if @def
|
83
|
-
block.call
|
84
|
-
else
|
85
|
-
@def = true
|
86
|
-
block.call
|
87
|
-
@def = false
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
# Enters mandatory named section of configuration file
|
94
|
-
# @param key [String] Name of section
|
95
|
-
# @yield [] Block of actions for entered context
|
96
|
-
def inside!(key, &block)
|
97
|
-
inside(key, true) { block.call }
|
98
|
-
end
|
99
|
-
|
100
|
-
# Iterates through collection
|
101
|
-
# @param key [String] Name of collection
|
102
|
-
# @param man [Bool] Determines whether this section is mandatory
|
103
|
-
# @yield [] Block of actions for entered context
|
104
|
-
def each_index(key, man = false, &block)
|
105
|
-
if not @def and @obj.key?(key)
|
106
|
-
ctx = @obj[key]
|
107
|
-
raise(KXI::Exceptions::ConfigurationException.new(@file, "#{@pth}/#{key}", 'Field must be array!')) unless ctx.is_a?(Array)
|
108
|
-
ctx.each_with_index do |itm, idx|
|
109
|
-
enter("#{key}[#{idx}]", itm) do
|
110
|
-
block.call
|
111
|
-
end
|
112
|
-
end
|
113
|
-
elsif man
|
114
|
-
raise(KXI::Exceptions::ConfigurationException.new(@file, "#{@pth}/#{key}", 'Array is mandatory!'))
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
# Iterates through mandatory collection
|
119
|
-
# @param key [String] Name of collection
|
120
|
-
# @yield [] Block of actions for entered context
|
121
|
-
def each_index!(key, &block)
|
122
|
-
each_index(key, true) { block.call }
|
123
|
-
end
|
124
|
-
|
125
|
-
# Iterates through fields of object
|
126
|
-
# @param key [String] Name of object
|
127
|
-
# @param man [Bool] Determines whether this section is mandatory
|
128
|
-
# @yield [idx] Block of actions for entered context
|
129
|
-
# @yieldparam idx [String] Name of field
|
130
|
-
def each_field(key, man = false, &block)
|
131
|
-
if not @def and @obj.key?(key)
|
132
|
-
ctx = @obj[key]
|
133
|
-
raise(KXI::Exceptions::ConfigurationException.new(@file, "#{@pth}/#{key}", 'Field must be object!')) unless ctx.is_a?(Hash)
|
134
|
-
ctx.each_pair do |idx, itm|
|
135
|
-
enter("#{key}/#{idx}", itm) do
|
136
|
-
block.call(idx)
|
137
|
-
end
|
138
|
-
end
|
139
|
-
elsif man
|
140
|
-
raise(KXI::Exceptions::ConfigurationException.new(@file, "#{@pth}/#{key}", 'Object is mandatory!'))
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
# Iterates through fields of mandatory object
|
145
|
-
# @param key [String] Name of object
|
146
|
-
# @yield [idx] Block of actions for entered context
|
147
|
-
# @yieldparam idx [String] Name of field
|
148
|
-
def each_field!(key, &block)
|
149
|
-
each_field(key, true) { |itm| block.call(itm) }
|
150
|
-
end
|
151
|
-
|
152
|
-
def enter(key, ctx, &block)
|
153
|
-
obj = @obj
|
154
|
-
pth = @pth
|
155
|
-
@obj = ctx
|
156
|
-
@pth = "#{@pth}/#{key}"
|
157
|
-
block.call
|
158
|
-
ensure
|
159
|
-
@pth = pth
|
160
|
-
@obj = obj
|
161
|
-
end
|
162
|
-
|
163
|
-
def validate(key, ctx, &validator)
|
164
|
-
begin
|
165
|
-
enter(key, ctx) do
|
166
|
-
validator.call(ctx)
|
167
|
-
end
|
168
|
-
return ctx
|
169
|
-
rescue Exception => ex
|
170
|
-
raise(KXI::Exceptions::ConfigurationException.new(@file, "#{@pth}/#{key}", ex.message))
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
protected :context, :path, :get, :get!, :inside, :inside!, :each_index, :each_index!, :each_field, :each_field!
|
175
|
-
private :enter, :validate
|
176
|
-
end
|
177
|
-
end
|
1
|
+
# Created by Matyáš Pokorný on 2018-01-24.
|
2
|
+
|
3
|
+
module KXI
|
4
|
+
module Application
|
5
|
+
# Represents configuration file
|
6
|
+
class Config
|
7
|
+
# Gets configuration file
|
8
|
+
# @return [String] Path to configuration file
|
9
|
+
def file
|
10
|
+
@file
|
11
|
+
end
|
12
|
+
|
13
|
+
# Instantiates the {KXI::Application::Config} file
|
14
|
+
# @param file [String] Configuration file to read
|
15
|
+
# @param reader [KXI::Application::ConfigReader] Readers used to parse configuration
|
16
|
+
def initialize(file, reader)
|
17
|
+
@file = file
|
18
|
+
@obj = reader.parse(File.read(file))
|
19
|
+
@pth = ''
|
20
|
+
@def = false
|
21
|
+
end
|
22
|
+
|
23
|
+
# Gets current context
|
24
|
+
# @return [Object] Current context
|
25
|
+
def context
|
26
|
+
@obj
|
27
|
+
end
|
28
|
+
|
29
|
+
# Gets path of current context
|
30
|
+
# @return [String] Path of current context
|
31
|
+
def path
|
32
|
+
@pth
|
33
|
+
end
|
34
|
+
|
35
|
+
# Gets value or default from current context
|
36
|
+
# @param key [String] Name of value
|
37
|
+
# @param default [Object, nil] Default value
|
38
|
+
# @yield [val] Validator function
|
39
|
+
# @yieldparam val [Object, nil] Value to validate
|
40
|
+
# @return [Object, nil] Value or default
|
41
|
+
def get(key, default = nil, &validator)
|
42
|
+
if not @def and @obj.key?(key)
|
43
|
+
ctx = @obj[key]
|
44
|
+
return ctx if validator == nil
|
45
|
+
return validate(key, ctx, &validator)
|
46
|
+
else
|
47
|
+
return default
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Gets value from current context
|
52
|
+
# @param key [String] Name of value
|
53
|
+
# @yield [val] Validator function
|
54
|
+
# @yieldparam val [Object, nil] Value to validate
|
55
|
+
# @return [Object, nil] Value
|
56
|
+
# @raise [KXI::Exceptions::ConfigurationException] Raised when field is not found
|
57
|
+
def get!(key, &validator)
|
58
|
+
if not @def and @obj.key?(key)
|
59
|
+
ctx = @obj[key]
|
60
|
+
return ctx if validator == nil
|
61
|
+
return validate(key, ctx, &validator)
|
62
|
+
else
|
63
|
+
raise(KXI::Exceptions::ConfigurationException.new(@file, "#{@pth}/#{key}", 'Field is mandatory!'))
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# Enters named section of configuration file
|
68
|
+
# @param key [String] Name of section
|
69
|
+
# @param man [Bool] Determines whether this section is mandatory
|
70
|
+
# @yield [] Block of actions for entered context
|
71
|
+
def inside(key, man = false, &block)
|
72
|
+
if not @def and @obj.key?(key)
|
73
|
+
ctx = @obj[key]
|
74
|
+
raise(KXI::Exceptions::ConfigurationException.new(@file, "#{@pth}/#{key}", 'Field must be object!')) unless ctx.is_a?(Hash)
|
75
|
+
enter(key, ctx) do
|
76
|
+
block.call
|
77
|
+
end
|
78
|
+
elsif man
|
79
|
+
raise(KXI::Exceptions::ConfigurationException.new(@file, "#{@pth}/#{key}", 'Object is mandatory!'))
|
80
|
+
else
|
81
|
+
enter(key, nil) do
|
82
|
+
if @def
|
83
|
+
block.call
|
84
|
+
else
|
85
|
+
@def = true
|
86
|
+
block.call
|
87
|
+
@def = false
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# Enters mandatory named section of configuration file
|
94
|
+
# @param key [String] Name of section
|
95
|
+
# @yield [] Block of actions for entered context
|
96
|
+
def inside!(key, &block)
|
97
|
+
inside(key, true) { block.call }
|
98
|
+
end
|
99
|
+
|
100
|
+
# Iterates through collection
|
101
|
+
# @param key [String] Name of collection
|
102
|
+
# @param man [Bool] Determines whether this section is mandatory
|
103
|
+
# @yield [] Block of actions for entered context
|
104
|
+
def each_index(key, man = false, &block)
|
105
|
+
if not @def and @obj.key?(key)
|
106
|
+
ctx = @obj[key]
|
107
|
+
raise(KXI::Exceptions::ConfigurationException.new(@file, "#{@pth}/#{key}", 'Field must be array!')) unless ctx.is_a?(Array)
|
108
|
+
ctx.each_with_index do |itm, idx|
|
109
|
+
enter("#{key}[#{idx}]", itm) do
|
110
|
+
block.call
|
111
|
+
end
|
112
|
+
end
|
113
|
+
elsif man
|
114
|
+
raise(KXI::Exceptions::ConfigurationException.new(@file, "#{@pth}/#{key}", 'Array is mandatory!'))
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
# Iterates through mandatory collection
|
119
|
+
# @param key [String] Name of collection
|
120
|
+
# @yield [] Block of actions for entered context
|
121
|
+
def each_index!(key, &block)
|
122
|
+
each_index(key, true) { block.call }
|
123
|
+
end
|
124
|
+
|
125
|
+
# Iterates through fields of object
|
126
|
+
# @param key [String] Name of object
|
127
|
+
# @param man [Bool] Determines whether this section is mandatory
|
128
|
+
# @yield [idx] Block of actions for entered context
|
129
|
+
# @yieldparam idx [String] Name of field
|
130
|
+
def each_field(key, man = false, &block)
|
131
|
+
if not @def and @obj.key?(key)
|
132
|
+
ctx = @obj[key]
|
133
|
+
raise(KXI::Exceptions::ConfigurationException.new(@file, "#{@pth}/#{key}", 'Field must be object!')) unless ctx.is_a?(Hash)
|
134
|
+
ctx.each_pair do |idx, itm|
|
135
|
+
enter("#{key}/#{idx}", itm) do
|
136
|
+
block.call(idx)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
elsif man
|
140
|
+
raise(KXI::Exceptions::ConfigurationException.new(@file, "#{@pth}/#{key}", 'Object is mandatory!'))
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
# Iterates through fields of mandatory object
|
145
|
+
# @param key [String] Name of object
|
146
|
+
# @yield [idx] Block of actions for entered context
|
147
|
+
# @yieldparam idx [String] Name of field
|
148
|
+
def each_field!(key, &block)
|
149
|
+
each_field(key, true) { |itm| block.call(itm) }
|
150
|
+
end
|
151
|
+
|
152
|
+
def enter(key, ctx, &block)
|
153
|
+
obj = @obj
|
154
|
+
pth = @pth
|
155
|
+
@obj = ctx
|
156
|
+
@pth = "#{@pth}/#{key}"
|
157
|
+
block.call
|
158
|
+
ensure
|
159
|
+
@pth = pth
|
160
|
+
@obj = obj
|
161
|
+
end
|
162
|
+
|
163
|
+
def validate(key, ctx, &validator)
|
164
|
+
begin
|
165
|
+
enter(key, ctx) do
|
166
|
+
validator.call(ctx)
|
167
|
+
end
|
168
|
+
return ctx
|
169
|
+
rescue Exception => ex
|
170
|
+
raise(KXI::Exceptions::ConfigurationException.new(@file, "#{@pth}/#{key}", ex.message))
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
protected :context, :path, :get, :get!, :inside, :inside!, :each_index, :each_index!, :each_field, :each_field!
|
175
|
+
private :enter, :validate
|
176
|
+
end
|
177
|
+
end
|
178
178
|
end
|