danica 2.4.3 → 2.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/danica/common.rb +5 -0
- data/lib/danica/function.rb +7 -2
- data/lib/danica/function/name.rb +33 -0
- data/lib/danica/operator/chained.rb +5 -3
- data/lib/danica/variables_holder.rb +16 -4
- data/lib/danica/variables_holder/variables_builder.rb +8 -2
- data/lib/danica/version.rb +1 -1
- data/lib/danica/wrapper.rb +19 -8
- data/lib/danica/wrapper/container.rb +23 -0
- data/spec/lib/danica/function/name_spec.rb +34 -0
- data/spec/lib/danica/function_spec.rb +27 -1
- data/spec/lib/danica/variables_holder_spec.rb +52 -4
- data/spec/lib/danica/wrapper/variable_spec.rb +12 -0
- data/spec/lib/danica/wrapper_spec.rb +2 -2
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e650cc12cd4ccaaf7eaebd6f8084ae46211f0cf
|
4
|
+
data.tar.gz: 7b9cef3c43db7851160e95f6a2700dfde13f5a28
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0acaff19e60a377126d74cfa90441098329f19603b7467e208f672e1ba7a95242beed67125028cd8c1979f5fb9b4443b877aa27ec24bf8e421f6f44970f983b3
|
7
|
+
data.tar.gz: 3d5be06b0da8ea1569f17354b711ce328f0577b169af1a8a191f6de883d6cbb2b3aab38fe3c2f03511f0f1aa5f72d819146d3bac3107e32364d9e6030d0ace14
|
data/lib/danica/common.rb
CHANGED
@@ -12,6 +12,7 @@ module Danica
|
|
12
12
|
|
13
13
|
default_value :constant?, false
|
14
14
|
default_value :signaled?, false
|
15
|
+
default_value :container?, false
|
15
16
|
end
|
16
17
|
|
17
18
|
def to_f
|
@@ -43,6 +44,10 @@ module Danica
|
|
43
44
|
false
|
44
45
|
end
|
45
46
|
|
47
|
+
def content
|
48
|
+
self
|
49
|
+
end
|
50
|
+
|
46
51
|
private
|
47
52
|
|
48
53
|
def wrap_as_group(value)
|
data/lib/danica/function.rb
CHANGED
@@ -4,6 +4,9 @@ module Danica
|
|
4
4
|
include VariablesHolder
|
5
5
|
include DSL
|
6
6
|
|
7
|
+
autoload :Gauss, 'danica/function/gauss'
|
8
|
+
autoload :Name, 'danica/function/name'
|
9
|
+
|
7
10
|
attr_accessor :name
|
8
11
|
|
9
12
|
default_value :priority, 3
|
@@ -49,7 +52,7 @@ module Danica
|
|
49
52
|
end
|
50
53
|
|
51
54
|
def describe(format)
|
52
|
-
"#{name
|
55
|
+
"#{name.to(format)} = #{to(format)}"
|
53
56
|
end
|
54
57
|
|
55
58
|
def describe_tex
|
@@ -60,7 +63,9 @@ module Danica
|
|
60
63
|
describe(:gnu)
|
61
64
|
end
|
62
65
|
|
63
|
-
|
66
|
+
def name
|
67
|
+
@name_object ||= Name.new(name: @name, variables: containers)
|
68
|
+
end
|
64
69
|
|
65
70
|
private
|
66
71
|
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Danica
|
2
|
+
class Function::Name
|
3
|
+
include Common
|
4
|
+
attr_reader :name, :containers
|
5
|
+
|
6
|
+
def initialize(name:, variables:)
|
7
|
+
@name = name
|
8
|
+
@containers = variables.map do |v|
|
9
|
+
v = wrap_value(v)
|
10
|
+
v = Wrapper::Container.new(v) unless v.container?
|
11
|
+
v
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def to(format)
|
16
|
+
"#{name}(#{description_variables(format)})"
|
17
|
+
end
|
18
|
+
|
19
|
+
def variables
|
20
|
+
containers.map(&:content)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def description_variables(format)
|
26
|
+
non_constant_variables.map { |v| v.to(format) }.join(', ')
|
27
|
+
end
|
28
|
+
|
29
|
+
def non_constant_variables
|
30
|
+
variables.reject(&:constant?)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,8 +1,6 @@
|
|
1
1
|
module Danica
|
2
2
|
class Operator
|
3
3
|
class Chained < Operator
|
4
|
-
attr_reader :variables
|
5
|
-
|
6
4
|
def variables=(vars)
|
7
5
|
@variables = vars.map { |v| wrap_value(v) }
|
8
6
|
end
|
@@ -13,7 +11,7 @@ module Danica
|
|
13
11
|
|
14
12
|
def include?(value)
|
15
13
|
value = wrap_value(value)
|
16
|
-
variables.include?(value)
|
14
|
+
variables.include?(value.content)
|
17
15
|
end
|
18
16
|
|
19
17
|
def to(format)
|
@@ -21,6 +19,10 @@ module Danica
|
|
21
19
|
variables.procedural_join(extractor, &join_proc(symbol(format)))
|
22
20
|
end
|
23
21
|
|
22
|
+
def variables
|
23
|
+
@variables.map(&:content)
|
24
|
+
end
|
25
|
+
|
24
26
|
private
|
25
27
|
|
26
28
|
def symbol(format)
|
@@ -20,16 +20,28 @@ module Danica
|
|
20
20
|
|
21
21
|
def variables=(vars)
|
22
22
|
vars = vars.as_hash(self.class.variables_names).compact unless vars.is_a? Hash
|
23
|
-
vars = vars.change_values(skip_inner: false) { |v| wrap_value(v) }
|
24
|
-
|
23
|
+
vars = vars.dup.change_values!(skip_inner: false) { |v| wrap_value(v) }
|
24
|
+
vars.each do |k, v|
|
25
|
+
public_send("#{k}=", v)
|
26
|
+
end
|
25
27
|
end
|
26
28
|
|
27
29
|
def variables
|
28
|
-
|
30
|
+
containers.map(&:content)
|
31
|
+
end
|
32
|
+
|
33
|
+
def containers
|
34
|
+
containers_hash.values
|
35
|
+
end
|
36
|
+
|
37
|
+
def containers_hash
|
38
|
+
@containers_hash ||= {}.merge(self.class.variables_hash.change_values do |value|
|
39
|
+
Wrapper::Container.new(value)
|
40
|
+
end)
|
29
41
|
end
|
30
42
|
|
31
43
|
def variables_hash
|
32
|
-
|
44
|
+
containers_hash.change_values(&:content)
|
33
45
|
end
|
34
46
|
|
35
47
|
def variables_value_hash
|
@@ -30,13 +30,19 @@ module Danica::VariablesHolder
|
|
30
30
|
|
31
31
|
def add_setter(name)
|
32
32
|
instance.send(:define_method, "#{name}=") do |value|
|
33
|
-
|
33
|
+
if(containers_hash[name.to_sym].try(:container?))
|
34
|
+
containers_hash[name.to_sym].content = wrap_value(value)
|
35
|
+
else
|
36
|
+
value = wrap_value(value)
|
37
|
+
value = Danica::Wrapper::Container.new value unless value.container?
|
38
|
+
containers_hash[name.to_sym] = value
|
39
|
+
end
|
34
40
|
end
|
35
41
|
end
|
36
42
|
|
37
43
|
def add_reader(name)
|
38
44
|
instance.send(:define_method, name) do
|
39
|
-
|
45
|
+
containers_hash[name.to_sym]
|
40
46
|
end
|
41
47
|
end
|
42
48
|
end
|
data/lib/danica/version.rb
CHANGED
data/lib/danica/wrapper.rb
CHANGED
@@ -1,27 +1,38 @@
|
|
1
1
|
module Danica
|
2
2
|
module Wrapper
|
3
3
|
def wrap_value(value)
|
4
|
+
Wrapper.wrap_value(value)
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.wrap_value(value)
|
4
8
|
case value
|
5
9
|
when Numeric
|
6
|
-
|
7
|
-
number(value)
|
10
|
+
wrap_numeric(value)
|
8
11
|
when Hash
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
variable(name: value)
|
13
|
-
when NilClass
|
14
|
-
variable
|
12
|
+
wrap_hash(value)
|
13
|
+
when String, Symbol, NilClass
|
14
|
+
Variable.new(name: value)
|
15
15
|
else
|
16
16
|
value
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
def self.wrap_numeric(number)
|
21
|
+
return Negative.new(Number.new(-number)) if number < 0
|
22
|
+
Number.new(number)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.wrap_hash(hash)
|
26
|
+
return Constant.new(hash) if hash.keys.map(&:to_sym).sort == %i(gnu latex value)
|
27
|
+
Variable.new(hash)
|
28
|
+
end
|
29
|
+
|
20
30
|
autoload :Number, 'danica/wrapper/number'
|
21
31
|
autoload :Group, 'danica/wrapper/group'
|
22
32
|
autoload :Negative, 'danica/wrapper/negative'
|
23
33
|
autoload :PlusMinus, 'danica/wrapper/plus_minus'
|
24
34
|
autoload :Constant, 'danica/wrapper/constant'
|
25
35
|
autoload :Variable, 'danica/wrapper/variable'
|
36
|
+
autoload :Container, 'danica/wrapper/container'
|
26
37
|
end
|
27
38
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Danica
|
2
|
+
class Wrapper::Container
|
3
|
+
include Common
|
4
|
+
attr_accessor :content
|
5
|
+
|
6
|
+
delegate :to_f, :contentd?, :to, :to_tex, :to_gnu, :priority, :grouped?,
|
7
|
+
:signaled?, :constant?, :valued?, :*, :+, :-, :/, :**, to: :content
|
8
|
+
|
9
|
+
default_value :container?, true
|
10
|
+
|
11
|
+
def initialize(content)
|
12
|
+
@content = content
|
13
|
+
end
|
14
|
+
|
15
|
+
def ==(other)
|
16
|
+
return content == other unless other.is_a?(self.class)
|
17
|
+
content == other.content
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Danica::Function::Name do
|
4
|
+
let(:x) { Danica::Wrapper::Variable.new(name: :x, latex: '\mu', gnu: 'u')}
|
5
|
+
let(:subject) { described_class.new(name: :f, variables: [x]) }
|
6
|
+
|
7
|
+
describe '#to_tex' do
|
8
|
+
it 'returns the name of the function with tex variables' do
|
9
|
+
expect(subject.to_tex).to eq('f(\mu)')
|
10
|
+
end
|
11
|
+
|
12
|
+
context 'when initializing variables from scratch' do
|
13
|
+
let(:x) { :x }
|
14
|
+
|
15
|
+
it 'returns the name of the function with tex variables' do
|
16
|
+
expect(subject.to_tex).to eq('f(x)')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#to_tex' do
|
22
|
+
it 'returns the name of the function with tex variables' do
|
23
|
+
expect(subject.to_gnu).to eq('f(u)')
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'when initializing variables from scratch' do
|
27
|
+
let(:x) { :x }
|
28
|
+
|
29
|
+
it 'returns the name of the function with tex variables' do
|
30
|
+
expect(subject.to_gnu).to eq('f(x)')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -110,6 +110,24 @@ describe Danica::Function do
|
|
110
110
|
it_behaves_like 'a generically generated function'
|
111
111
|
end
|
112
112
|
|
113
|
+
describe '#name' do
|
114
|
+
let(:function) do
|
115
|
+
function_class.new(name: :f)
|
116
|
+
end
|
117
|
+
|
118
|
+
it do
|
119
|
+
expect(function.name).to be_a(Danica::Function::Name)
|
120
|
+
end
|
121
|
+
|
122
|
+
context 'when changing the function variables' do
|
123
|
+
it 'changes the name variables' do
|
124
|
+
expect do
|
125
|
+
function.x = 2
|
126
|
+
end.to change { function.name.variables.map(&:content) }
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
113
131
|
describe '#describe_tex' do
|
114
132
|
context 'when function has a name' do
|
115
133
|
let(:function) do
|
@@ -119,6 +137,14 @@ describe Danica::Function do
|
|
119
137
|
it 'returns the full function description' do
|
120
138
|
expect(function.describe_tex).to eq('f(x, y) = x^{y}')
|
121
139
|
end
|
140
|
+
|
141
|
+
context 'and one of the variables is changed' do
|
142
|
+
it 'uses the new variable value' do
|
143
|
+
expect do
|
144
|
+
function.y = 2
|
145
|
+
end.to change(function, :describe_tex).to('f(x, 2) = x^{2}')
|
146
|
+
end
|
147
|
+
end
|
122
148
|
end
|
123
149
|
|
124
150
|
context 'when a variable is set as a constant' do
|
@@ -328,7 +354,7 @@ describe Danica::Function do
|
|
328
354
|
describe '#variables' do
|
329
355
|
context 'when initialized with an array of variables' do
|
330
356
|
subject { described_class::Spatial.new(variables: variables.values) }
|
331
|
-
let(:expected) { variables.values.map { |v|
|
357
|
+
let(:expected) { variables.values.map { |v| Danica::Wrapper::Variable.new(v.is_a?(Hash) ? v : { name: v }) } }
|
332
358
|
it do
|
333
359
|
expect(subject.variables.compact).to eq(expected)
|
334
360
|
end
|
@@ -20,6 +20,15 @@ shared_examples 'an object that returns the default variables' do
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
+
shared_examples 'an variable set that does not change the class variables' do
|
24
|
+
it 'does not change the the class variables' do
|
25
|
+
expect do
|
26
|
+
subject.variables = variables
|
27
|
+
end.not_to change { clazz.variables_hash }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
23
32
|
describe Danica::VariablesHolder do
|
24
33
|
class Danica::VariablesHolder::Dummy
|
25
34
|
include Danica::Common
|
@@ -47,11 +56,32 @@ describe Danica::VariablesHolder do
|
|
47
56
|
end
|
48
57
|
|
49
58
|
describe '#variables=' do
|
50
|
-
|
51
|
-
|
59
|
+
context 'when changing the variables of the object' do
|
60
|
+
context 'when all the variables are set with value' do
|
61
|
+
let(:variables) { [1, 2, 3] }
|
62
|
+
it_behaves_like 'an variable set that does not change the class variables'
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'setting the variables through a hash' do
|
66
|
+
let(:variables) { { x: 1, y: 2, z: 3 } }
|
67
|
+
it_behaves_like 'an variable set that does not change the class variables'
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'when none of the variables are set with values' do
|
71
|
+
let(:variables) { [] }
|
72
|
+
it_behaves_like 'an variable set that does not change the class variables'
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'when the variables are set through an empty hash' do
|
76
|
+
let(:variables) { {} }
|
77
|
+
it_behaves_like 'an variable set that does not change the class variables'
|
78
|
+
end
|
52
79
|
end
|
53
80
|
|
54
81
|
context 'when setting the variables using a list' do
|
82
|
+
before do
|
83
|
+
subject.variables = variables
|
84
|
+
end
|
55
85
|
let(:variables) { [1, 2, 3] }
|
56
86
|
|
57
87
|
it 'changes the values of the variables' do
|
@@ -60,12 +90,15 @@ describe Danica::VariablesHolder do
|
|
60
90
|
|
61
91
|
context 'but the array is empty' do
|
62
92
|
let(:variables) { [] }
|
63
|
-
|
64
93
|
it_behaves_like 'an object that returns the default variables hash'
|
65
94
|
end
|
66
95
|
end
|
67
96
|
|
68
97
|
context 'when setting the variales using a hash' do
|
98
|
+
before do
|
99
|
+
subject.variables = variables
|
100
|
+
end
|
101
|
+
|
69
102
|
let(:variables) { { x: 1, y: 2, z: 3 } }
|
70
103
|
|
71
104
|
it 'changes the values of the variables' do
|
@@ -74,7 +107,6 @@ describe Danica::VariablesHolder do
|
|
74
107
|
|
75
108
|
context 'but the hash is empty' do
|
76
109
|
let(:variables) { {} }
|
77
|
-
|
78
110
|
it_behaves_like 'an object that returns the default variables hash'
|
79
111
|
end
|
80
112
|
end
|
@@ -147,4 +179,20 @@ describe Danica::VariablesHolder do
|
|
147
179
|
end
|
148
180
|
end
|
149
181
|
end
|
182
|
+
|
183
|
+
describe '#containers' do
|
184
|
+
it 'is an array of Containers' do
|
185
|
+
expect(subject.containers.first).to be_a(Danica::Wrapper::Container)
|
186
|
+
end
|
187
|
+
|
188
|
+
context 'when changing the variable on the object' do
|
189
|
+
let(:containers) { subject.containers }
|
190
|
+
|
191
|
+
it 'changes the variables in the containers' do
|
192
|
+
expect do
|
193
|
+
subject.x = 2
|
194
|
+
end.to change { containers.map(&:content) }
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
150
198
|
end
|
@@ -7,6 +7,18 @@ describe Danica::Wrapper::Variable do
|
|
7
7
|
subject { described_class.new(value: 100) }
|
8
8
|
end
|
9
9
|
|
10
|
+
it 'can be initialize from nil value' do
|
11
|
+
expect do
|
12
|
+
described_class.new(nil)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'can be initialize from nil name' do
|
17
|
+
expect do
|
18
|
+
described_class.new(name: nil)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
10
22
|
describe '#to_f' do
|
11
23
|
context 'when variable has no value' do
|
12
24
|
it { expect { subject.to_f }.to raise_error(Danica::Exception::NotDefined) }
|
@@ -17,7 +17,7 @@ shared_examples 'a value wrapper' do |examples|
|
|
17
17
|
let(:value) { val }
|
18
18
|
|
19
19
|
it do
|
20
|
-
expect(subject.wrapped_value).to be_a(expected)
|
20
|
+
expect(subject.wrapped_value.content).to be_a(expected)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -41,7 +41,7 @@ describe Danica::Wrapper do
|
|
41
41
|
let(:value) { { value: 10, latex: :x, gnu: :X } }
|
42
42
|
|
43
43
|
it do
|
44
|
-
expect(subject.wrapped_value).to be_a(Danica::Wrapper::Constant)
|
44
|
+
expect(subject.wrapped_value.content).to be_a(Danica::Wrapper::Constant)
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: danica
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.4.
|
4
|
+
version: 2.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Darthjee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-10-
|
11
|
+
date: 2017-10-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -146,6 +146,7 @@ files:
|
|
146
146
|
- lib/danica/exception.rb
|
147
147
|
- lib/danica/function.rb
|
148
148
|
- lib/danica/function/gauss.rb
|
149
|
+
- lib/danica/function/name.rb
|
149
150
|
- lib/danica/operator.rb
|
150
151
|
- lib/danica/operator/addition.rb
|
151
152
|
- lib/danica/operator/chained.rb
|
@@ -162,6 +163,7 @@ files:
|
|
162
163
|
- lib/danica/version.rb
|
163
164
|
- lib/danica/wrapper.rb
|
164
165
|
- lib/danica/wrapper/constant.rb
|
166
|
+
- lib/danica/wrapper/container.rb
|
165
167
|
- lib/danica/wrapper/group.rb
|
166
168
|
- lib/danica/wrapper/negative.rb
|
167
169
|
- lib/danica/wrapper/number.rb
|
@@ -175,6 +177,7 @@ files:
|
|
175
177
|
- spec/lib/danica/common_spec.rb
|
176
178
|
- spec/lib/danica/dsl_spec.rb
|
177
179
|
- spec/lib/danica/function/gauss_spec.rb
|
180
|
+
- spec/lib/danica/function/name_spec.rb
|
178
181
|
- spec/lib/danica/function_spec.rb
|
179
182
|
- spec/lib/danica/operator/addition_spec.rb
|
180
183
|
- spec/lib/danica/operator/cos_spec.rb
|
@@ -237,6 +240,7 @@ test_files:
|
|
237
240
|
- spec/lib/danica/common_spec.rb
|
238
241
|
- spec/lib/danica/dsl_spec.rb
|
239
242
|
- spec/lib/danica/function/gauss_spec.rb
|
243
|
+
- spec/lib/danica/function/name_spec.rb
|
240
244
|
- spec/lib/danica/function_spec.rb
|
241
245
|
- spec/lib/danica/operator/addition_spec.rb
|
242
246
|
- spec/lib/danica/operator/cos_spec.rb
|