danica 1.2.0 → 2.0.0
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/Gemfile.lock +1 -1
- data/README.md +136 -6
- data/lib/danica.rb +2 -0
- data/lib/danica/common.rb +80 -0
- data/lib/danica/{function → common}/class_methods.rb +1 -1
- data/lib/danica/{function → common}/variables_builder.rb +1 -1
- data/lib/danica/division.rb +20 -0
- data/lib/danica/exponential.rb +21 -0
- data/lib/danica/function.rb +2 -83
- data/lib/danica/operator.rb +9 -0
- data/lib/danica/{function → operator}/chained.rb +2 -2
- data/lib/danica/power.rb +20 -0
- data/lib/danica/product.rb +19 -0
- data/lib/danica/square_root.rb +20 -0
- data/lib/danica/sum.rb +20 -0
- data/lib/danica/version.rb +1 -1
- data/spec/lib/danica/{function/division_spec.rb → division_spec.rb} +3 -3
- data/spec/lib/danica/exponential_spec.rb +11 -0
- data/spec/lib/danica/function_spec.rb +4 -4
- data/spec/lib/danica/{function/power_spec.rb → power_spec.rb} +3 -3
- data/spec/lib/danica/{function/product_spec.rb → product_spec.rb} +2 -2
- data/spec/lib/danica/square_root_spec.rb +11 -0
- data/spec/lib/danica/{function/sum_spec.rb → sum_spec.rb} +2 -2
- data/spec/spec_helper.rb +7 -0
- data/spec/support/shared_contexts/common.rb +5 -0
- data/spec/support/shared_examples/{function → operator}/chained.rb +14 -18
- data/spec/support/shared_examples/{function → operator}/dual_term.rb +12 -16
- data/spec/{lib/danica/function/square_root_spec.rb → support/shared_examples/operator/single_input.rb} +13 -15
- metadata +33 -24
- data/lib/danica/function/division.rb +0 -22
- data/lib/danica/function/power.rb +0 -22
- data/lib/danica/function/product.rb +0 -19
- data/lib/danica/function/square_root.rb +0 -22
- data/lib/danica/function/sum.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0cbd63065be86cd93d10bf1a1d2fc624775e3331
|
4
|
+
data.tar.gz: bf977f09ed4bdb576aad2a2683fd6758a017a2d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 43d21db5bc46b37c41fda6a23f8fbeee6e147b1c55eb256e31951175a7bab6d75770b8f2c9feeb335f15da068647cb5409a5b64d1076d40cf16df7e30cc6f33c
|
7
|
+
data.tar.gz: e3aff36c623f3a9548c643985faf82e94a13e1bc2f2a0630cfa47dce5c41abd0805ec01414f2bad43fa5df91ff3799bec16cfc478f03c469ef9aae50f77d761e
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -17,25 +17,121 @@ bundle install danica
|
|
17
17
|
|
18
18
|
Now you can use in your project
|
19
19
|
|
20
|
+
### Operators
|
21
|
+
Operators are much like function, but they do not have a name.
|
22
|
+
|
23
|
+
While a function would be something in the format ```f(x) = x + 1```, an operator would just represent the sum ```x + 1```
|
24
|
+
|
25
|
+
Operators are to be composed to create a Function (see below) being their difference almost semantic
|
20
26
|
|
21
27
|
```ruby
|
22
|
-
class
|
28
|
+
class MyOperator < Danica::Operator
|
29
|
+
variables :elements_list
|
23
30
|
def to_f
|
24
31
|
#implement to float method
|
25
32
|
end
|
26
33
|
|
27
34
|
def to_tex
|
28
|
-
#implement
|
35
|
+
#optionaly implement custom to_tex method
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_gnu
|
39
|
+
#optionaly implement custom to_gnu method
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def tex_string
|
45
|
+
#implement tex_string here
|
46
|
+
end
|
47
|
+
|
48
|
+
def gnu_string
|
49
|
+
#implement gnu_string here
|
50
|
+
end
|
51
|
+
end
|
52
|
+
```
|
53
|
+
#### Sample
|
54
|
+
```ruby
|
55
|
+
class Danica::Inverse
|
56
|
+
variables :value
|
57
|
+
|
58
|
+
def to_f
|
59
|
+
value.to_f ** -1 #Do not worry with nil value as this has been implemented already raising Danica::Exception::NotDefined
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def tex_string
|
65
|
+
"(#{value.to_tex})^{-1}"
|
66
|
+
end
|
67
|
+
|
68
|
+
def gnu_string
|
69
|
+
"(#{value.to_gnu}) ** -1"
|
29
70
|
end
|
30
71
|
end
|
72
|
+
|
73
|
+
fx = Danica::Inverse.new(:x)
|
74
|
+
```
|
75
|
+
|
76
|
+
##### to_tex
|
77
|
+
```ruby
|
78
|
+
fx.to_tex
|
79
|
+
```
|
80
|
+
|
81
|
+
returns
|
82
|
+
```string
|
83
|
+
(x)^{-1}
|
84
|
+
```
|
85
|
+
|
86
|
+
##### to_gnu
|
87
|
+
```ruby
|
88
|
+
fx.to_gnu
|
89
|
+
```
|
90
|
+
|
91
|
+
returns
|
92
|
+
```string
|
93
|
+
(x) ** -1
|
94
|
+
```
|
95
|
+
|
96
|
+
##### calculate / to_f
|
97
|
+
```ruby
|
98
|
+
fx.calculate(2)
|
99
|
+
```
|
100
|
+
or
|
101
|
+
```ruby
|
102
|
+
Danica::Inverse.new(2).to_f
|
103
|
+
```
|
104
|
+
|
105
|
+
both return
|
106
|
+
```string
|
107
|
+
0.5
|
31
108
|
```
|
32
109
|
|
110
|
+
### Functions
|
33
111
|
|
34
|
-
|
112
|
+
Functions are composition of operators threating their variables input.
|
113
|
+
|
114
|
+
Example of function could be ```f(x,y) = x ^ y + y / 2``` which is composed of an operator sum of 2 parcels,
|
115
|
+
being the first an operator power and the second an operator division, while the variable ```x``` is only used
|
116
|
+
as the base of the power operator and the y variable is present on both power and division operator
|
35
117
|
|
36
118
|
```ruby
|
37
|
-
class
|
38
|
-
|
119
|
+
class MyFunction
|
120
|
+
variables :variables_list
|
121
|
+
|
122
|
+
# code of operators composition
|
123
|
+
end
|
124
|
+
```
|
125
|
+
|
126
|
+
#### Sample
|
127
|
+
```ruby
|
128
|
+
require 'danica/operator/product'
|
129
|
+
require 'danica/operator/sum'
|
130
|
+
require 'danica/operator/division'
|
131
|
+
require 'danica/operator/power'
|
132
|
+
|
133
|
+
module Danica
|
134
|
+
class Function::Spatial < Function
|
39
135
|
variables :time, :acceleration, :initial_space, :initial_velocity
|
40
136
|
delegate :to_tex, :to_gnu, to: :sum
|
41
137
|
|
@@ -67,7 +163,7 @@ class Danica::Function
|
|
67
163
|
end
|
68
164
|
end
|
69
165
|
|
70
|
-
fx = Danica::Function.new(
|
166
|
+
fx = Danica::Function::Spatial.new(
|
71
167
|
time: :t,
|
72
168
|
acceleration: 'a',
|
73
169
|
initial_space: { name: :S0, latex: 'S_0', gnu: 'S0' },
|
@@ -75,6 +171,7 @@ fx = Danica::Function.new(
|
|
75
171
|
)
|
76
172
|
```
|
77
173
|
|
174
|
+
##### to_tex
|
78
175
|
```ruby
|
79
176
|
fx.to_tex
|
80
177
|
```
|
@@ -84,6 +181,7 @@ returns
|
|
84
181
|
S_0 + V_0 \cdot t + \frac{a \cdot t^2}{2}
|
85
182
|
```
|
86
183
|
|
184
|
+
##### to_gnu
|
87
185
|
```ruby
|
88
186
|
fx.to_gnu
|
89
187
|
```
|
@@ -93,3 +191,35 @@ returns
|
|
93
191
|
S0 + V0 * t + a * t**2/2
|
94
192
|
```
|
95
193
|
|
194
|
+
##### to_gnu
|
195
|
+
```ruby
|
196
|
+
fx = Danica::Function::Spatial.new(
|
197
|
+
time: :t,
|
198
|
+
acceleration: :a,
|
199
|
+
initial_space: 1,
|
200
|
+
initial_velocity: 2
|
201
|
+
)
|
202
|
+
```
|
203
|
+
|
204
|
+
```ruby
|
205
|
+
fx.calculate(10, 3)
|
206
|
+
```
|
207
|
+
|
208
|
+
or
|
209
|
+
|
210
|
+
|
211
|
+
```ruby
|
212
|
+
fx.calculate(time: 10, acceleration: 3)
|
213
|
+
```
|
214
|
+
|
215
|
+
or
|
216
|
+
|
217
|
+
```ruby
|
218
|
+
Danica::Function::Spatial.new(10, 3, 1, 2).to_f
|
219
|
+
```
|
220
|
+
|
221
|
+
all return
|
222
|
+
|
223
|
+
```ruby
|
224
|
+
171.0
|
225
|
+
```
|
data/lib/danica.rb
CHANGED
@@ -0,0 +1,80 @@
|
|
1
|
+
module Danica
|
2
|
+
class Common
|
3
|
+
require 'danica/common/class_methods'
|
4
|
+
require 'danica/common/variables_builder'
|
5
|
+
|
6
|
+
attr_accessor :variables
|
7
|
+
|
8
|
+
def to_f
|
9
|
+
raise 'Not IMplemented yet'
|
10
|
+
end
|
11
|
+
|
12
|
+
def calculate(*args)
|
13
|
+
vars_map = args.extract_options!
|
14
|
+
vars_map = variables_value_hash.merge(vars_map)
|
15
|
+
vars_map.each do |k, v|
|
16
|
+
unless v && (v.is_a?(Fixnum) || v.valued?)
|
17
|
+
vars_map[k] = args.shift
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
self.class.new(vars_map).to_f
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_tex
|
25
|
+
Number.new(to_f).to_tex
|
26
|
+
rescue Exception::NotDefined
|
27
|
+
tex_string
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_gnu
|
31
|
+
Number.new(to_f).to_gnu
|
32
|
+
rescue Exception::NotDefined
|
33
|
+
gnu_string
|
34
|
+
end
|
35
|
+
|
36
|
+
def variables=(variables)
|
37
|
+
@variables = variables.map { |v| wrap_value(v) }
|
38
|
+
end
|
39
|
+
|
40
|
+
def valued?
|
41
|
+
to_f.present?
|
42
|
+
rescue Exception::NotDefined
|
43
|
+
false
|
44
|
+
end
|
45
|
+
|
46
|
+
def variables
|
47
|
+
@variables ||= variables_hash.values
|
48
|
+
end
|
49
|
+
|
50
|
+
def variables_hash
|
51
|
+
@variabels_map ||= (@variables || []).as_hash(self.class.variables_names)
|
52
|
+
end
|
53
|
+
|
54
|
+
def variables_value_hash
|
55
|
+
variables.map(&:value).as_hash(self.class.variables_names)
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def non_valued_variables
|
61
|
+
variables.reject(&:valued?)
|
62
|
+
end
|
63
|
+
|
64
|
+
def tex_string
|
65
|
+
raise 'Not IMplemented yet'
|
66
|
+
end
|
67
|
+
|
68
|
+
def gnu_string
|
69
|
+
raise 'Not IMplemented yet'
|
70
|
+
end
|
71
|
+
|
72
|
+
def wrap_value(value)
|
73
|
+
return Number.new(value) if value.is_a?(Numeric)
|
74
|
+
return Variable.new(value) if value.is_a?(Hash)
|
75
|
+
return Variable.new(name: value) if [ String, Symbol ].any? { |c| value.is_a?(c) }
|
76
|
+
return Variable.new if value == nil
|
77
|
+
value
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Danica
|
2
|
+
class Division < Operator
|
3
|
+
variables :numerator, :denominator
|
4
|
+
|
5
|
+
def to_f
|
6
|
+
numerator.to_f / denominator.to_f
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def tex_string
|
12
|
+
"\\frac{#{numerator.to_tex}}{#{denominator.to_tex}}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def gnu_string
|
16
|
+
"#{numerator.to_gnu}/#{denominator.to_gnu}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Danica
|
2
|
+
class Exponential < Operator
|
3
|
+
variables :exponent
|
4
|
+
|
5
|
+
def to_f
|
6
|
+
Math.exp(exponent.to_f)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def tex_string
|
12
|
+
"e^{#{exponent.to_tex}}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def gnu_string
|
16
|
+
"exp(#{exponent.to_gnu})"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
data/lib/danica/function.rb
CHANGED
@@ -1,94 +1,13 @@
|
|
1
1
|
module Danica
|
2
|
-
class Function
|
2
|
+
class Function < Common
|
3
3
|
include ActiveModel::Model
|
4
4
|
|
5
|
-
|
6
|
-
require 'danica/function/class_methods'
|
7
|
-
require 'danica/function/chained'
|
8
|
-
require 'danica/function/product'
|
9
|
-
require 'danica/function/sum'
|
10
|
-
require 'danica/function/division'
|
11
|
-
require 'danica/function/power'
|
12
|
-
require 'danica/function/square_root'
|
13
|
-
|
14
|
-
attr_accessor :name, :variables
|
5
|
+
attr_accessor :name
|
15
6
|
|
16
7
|
def initialize(*args)
|
17
8
|
options = args.extract_options!
|
18
9
|
|
19
10
|
super({ variables: args.flatten }.merge(options))
|
20
11
|
end
|
21
|
-
|
22
|
-
def to_f
|
23
|
-
raise 'Not IMplemented yet'
|
24
|
-
end
|
25
|
-
|
26
|
-
def calculate(*args)
|
27
|
-
vars_map = args.extract_options!
|
28
|
-
vars_map = variables_value_hash.merge(vars_map)
|
29
|
-
vars_map.each do |k, v|
|
30
|
-
unless v && (v.is_a?(Fixnum) || v.valued?)
|
31
|
-
vars_map[k] = args.shift
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
self.class.new(vars_map).to_f
|
36
|
-
end
|
37
|
-
|
38
|
-
def to_tex
|
39
|
-
Number.new(to_f).to_tex
|
40
|
-
rescue Exception::NotDefined
|
41
|
-
tex_string
|
42
|
-
end
|
43
|
-
|
44
|
-
def to_gnu
|
45
|
-
Number.new(to_f).to_gnu
|
46
|
-
rescue Exception::NotDefined
|
47
|
-
gnu_string
|
48
|
-
end
|
49
|
-
|
50
|
-
def variables=(variables)
|
51
|
-
@variables = variables.map { |v| wrap_value(v) }
|
52
|
-
end
|
53
|
-
|
54
|
-
def valued?
|
55
|
-
to_f.present?
|
56
|
-
rescue Exception::NotDefined
|
57
|
-
false
|
58
|
-
end
|
59
|
-
|
60
|
-
def variables
|
61
|
-
@variables ||= variables_hash.values
|
62
|
-
end
|
63
|
-
|
64
|
-
def variables_hash
|
65
|
-
@variabels_map ||= (@variables || []).as_hash(self.class.variables_names)
|
66
|
-
end
|
67
|
-
|
68
|
-
def variables_value_hash
|
69
|
-
variables.map(&:value).as_hash(self.class.variables_names)
|
70
|
-
end
|
71
|
-
|
72
|
-
private
|
73
|
-
|
74
|
-
def non_valued_variables
|
75
|
-
variables.reject(&:valued?)
|
76
|
-
end
|
77
|
-
|
78
|
-
def tex_string
|
79
|
-
raise 'Not IMplemented yet'
|
80
|
-
end
|
81
|
-
|
82
|
-
def gnu_string
|
83
|
-
raise 'Not IMplemented yet'
|
84
|
-
end
|
85
|
-
|
86
|
-
def wrap_value(value)
|
87
|
-
return Number.new(value) if value.is_a?(Numeric)
|
88
|
-
return Variable.new(value) if value.is_a?(Hash)
|
89
|
-
return Variable.new(name: value) if [ String, Symbol ].any? { |c| value.is_a?(c) }
|
90
|
-
return Variable.new if value == nil
|
91
|
-
value
|
92
|
-
end
|
93
12
|
end
|
94
13
|
end
|
data/lib/danica/power.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Danica
|
2
|
+
class Power < Operator
|
3
|
+
variables :base, :exponent
|
4
|
+
|
5
|
+
def to_f
|
6
|
+
base.to_f ** exponent.to_f
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def tex_string
|
12
|
+
"#{base.to_tex}^{#{exponent.to_tex}}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def gnu_string
|
16
|
+
"#{base.to_gnu}**#{exponent.to_gnu}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Danica
|
2
|
+
class SquareRoot < Operator
|
3
|
+
variables :variable
|
4
|
+
|
5
|
+
def to_f
|
6
|
+
Math.sqrt(variable.to_f)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def tex_string
|
12
|
+
"\\sqrt{#{variable.to_tex}}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def gnu_string
|
16
|
+
"sqrt(#{variable.to_gnu})"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
data/lib/danica/sum.rb
ADDED
data/lib/danica/version.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Danica::
|
3
|
+
describe Danica::Division do
|
4
4
|
let(:subject) do
|
5
|
-
described_class.new(
|
5
|
+
described_class.new(*variables)
|
6
6
|
end
|
7
7
|
|
8
|
-
it_behaves_like 'a
|
8
|
+
it_behaves_like 'a operator that has two terms', :division, {
|
9
9
|
values: [ 2, 4 ],
|
10
10
|
calculated: 1.0 / 2.0,
|
11
11
|
to_tex: {
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Danica::Exponential do
|
4
|
+
it_behaves_like 'a operator with a single input value', {
|
5
|
+
variable_value: 2,
|
6
|
+
expected_number: Math.exp(2),
|
7
|
+
expected_number_text: Math.exp(2).to_s,
|
8
|
+
expected_tex: 'e^{X}',
|
9
|
+
expected_gnu: 'exp(X)'
|
10
|
+
}
|
11
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Danica::Function do
|
4
|
-
|
5
|
-
class Spatial <
|
4
|
+
module Danica
|
5
|
+
class Function::Spatial < Function
|
6
6
|
variables :time, :acceleration, :initial_space, :initial_velocity
|
7
7
|
delegate :to_f, :to_tex, :to_gnu, to: :sum
|
8
8
|
|
@@ -46,7 +46,7 @@ describe Danica::Function do
|
|
46
46
|
let(:subject) { described_class::Spatial.new(variables) }
|
47
47
|
|
48
48
|
describe '#to_tex' do
|
49
|
-
context 'when creating the spatial
|
49
|
+
context 'when creating the spatial operator for constantly accelerated movement' do
|
50
50
|
let(:expected) { 'S_0 + V_0 \cdot t + \frac{a \cdot t^{2}}{2}' }
|
51
51
|
|
52
52
|
it 'return the latex format CAM' do
|
@@ -56,7 +56,7 @@ describe Danica::Function do
|
|
56
56
|
end
|
57
57
|
|
58
58
|
describe '#to_gnu' do
|
59
|
-
context 'when creating the spatial
|
59
|
+
context 'when creating the spatial operator for constantly accelerated movement' do
|
60
60
|
let(:expected) { 'S0 + V0 * t + a * t**2/2' }
|
61
61
|
|
62
62
|
it 'return the latex format CAM' do
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Danica::
|
3
|
+
describe Danica::Power do
|
4
4
|
let(:subject) do
|
5
|
-
described_class.new(
|
5
|
+
described_class.new(*variables)
|
6
6
|
end
|
7
7
|
|
8
|
-
it_behaves_like 'a
|
8
|
+
it_behaves_like 'a operator that has two terms', :power, {
|
9
9
|
values: [ 3, 2 ],
|
10
10
|
calculated: 9.0,
|
11
11
|
to_tex: {
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Danica::
|
4
|
-
it_behaves_like 'a
|
3
|
+
describe Danica::Product do
|
4
|
+
it_behaves_like 'a operator that joins many variables with same operation', {
|
5
5
|
calculated: 24,
|
6
6
|
numeric_variables: [ 1.5, 2, 3.5 ],
|
7
7
|
to_tex: {
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Danica::
|
4
|
-
it_behaves_like 'a
|
3
|
+
describe Danica::Sum do
|
4
|
+
it_behaves_like 'a operator that joins many variables with same operation', {
|
5
5
|
calculated: 10,
|
6
6
|
numeric_variables: [ 1.5, 2.5, 3.5 ],
|
7
7
|
to_tex: {
|
data/spec/spec_helper.rb
CHANGED
@@ -13,6 +13,13 @@ SimpleCov.start 'gem'
|
|
13
13
|
require 'pry-nav'
|
14
14
|
require 'danica'
|
15
15
|
|
16
|
+
require 'danica/product'
|
17
|
+
require 'danica/sum'
|
18
|
+
require 'danica/division'
|
19
|
+
require 'danica/power'
|
20
|
+
require 'danica/square_root'
|
21
|
+
require 'danica/exponential'
|
22
|
+
|
16
23
|
# This file was generated by the `rspec --init` command. Conventionally, all
|
17
24
|
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
18
25
|
# Require this file using `require "spec_helper"` to ensure that it is only
|
@@ -1,13 +1,11 @@
|
|
1
|
-
shared_examples 'a
|
2
|
-
it_behaves_like 'a
|
3
|
-
it_behaves_like 'a
|
4
|
-
it_behaves_like 'a
|
1
|
+
shared_examples 'a operator that joins many variables with same operation' do |arguments|
|
2
|
+
it_behaves_like 'a operator that knows how to calculate', arguments
|
3
|
+
it_behaves_like 'a operator that knows how to write to tex', arguments
|
4
|
+
it_behaves_like 'a operator that knows how to write to gnu', arguments
|
5
5
|
end
|
6
6
|
|
7
|
-
shared_examples 'a
|
8
|
-
|
9
|
-
let(key) { arguments[key.to_sym] }
|
10
|
-
end
|
7
|
+
shared_examples 'a operator that knows how to calculate' do |arguments|
|
8
|
+
include_context 'variables are initialized', arguments, 'calculated'
|
11
9
|
let(:variables) do
|
12
10
|
(1..4).map do |i|
|
13
11
|
{ name: "X#{i}", value: numeric_variables[i-1] }
|
@@ -15,7 +13,7 @@ shared_examples 'a function that knows how to calculate' do |arguments|
|
|
15
13
|
end
|
16
14
|
let(:numeric_variables){ (1..4).to_a }
|
17
15
|
let(:subject) do
|
18
|
-
described_class.new(variables
|
16
|
+
described_class.new(*variables)
|
19
17
|
end
|
20
18
|
|
21
19
|
describe 'to_f' do
|
@@ -41,21 +39,19 @@ shared_examples 'a function that knows how to calculate' do |arguments|
|
|
41
39
|
end
|
42
40
|
end
|
43
41
|
|
44
|
-
shared_examples 'a
|
45
|
-
it_behaves_like 'a
|
42
|
+
shared_examples 'a operator that knows how to write to tex' do |arguments|
|
43
|
+
it_behaves_like 'a operator that knows how to write to a string', :to_tex, arguments
|
46
44
|
end
|
47
45
|
|
48
|
-
shared_examples 'a
|
49
|
-
it_behaves_like 'a
|
46
|
+
shared_examples 'a operator that knows how to write to gnu' do |arguments|
|
47
|
+
it_behaves_like 'a operator that knows how to write to a string', :to_gnu, arguments
|
50
48
|
end
|
51
49
|
|
52
|
-
shared_examples 'a
|
50
|
+
shared_examples 'a operator that knows how to write to a string' do |command, arguments|
|
53
51
|
let(:numeric_variables) { arguments[:numeric_variables] }
|
54
|
-
|
55
|
-
let(key) { arguments[command][key.to_sym] }
|
56
|
-
end
|
52
|
+
include_context 'variables are initialized', arguments[command], *%w(integer_expected string_expected float_expected)
|
57
53
|
let(:subject) do
|
58
|
-
described_class.new(variables
|
54
|
+
described_class.new(*variables)
|
59
55
|
end
|
60
56
|
|
61
57
|
describe "#{command}" do
|
@@ -1,13 +1,11 @@
|
|
1
|
-
shared_examples 'a
|
2
|
-
it_behaves_like 'a
|
3
|
-
it_behaves_like 'a
|
4
|
-
it_behaves_like 'a
|
1
|
+
shared_examples 'a operator that has two terms' do |name, arguments|
|
2
|
+
it_behaves_like 'a operator that has two terms and knows how to calculate it', name, arguments
|
3
|
+
it_behaves_like 'a operator that has two terms and knows how to call to_tex', arguments
|
4
|
+
it_behaves_like 'a operator that has two terms and knows how to call to_gnu', arguments
|
5
5
|
end
|
6
6
|
|
7
|
-
shared_examples 'a
|
8
|
-
|
9
|
-
let(key) { arguments[key.to_sym] }
|
10
|
-
end
|
7
|
+
shared_examples 'a operator that has two terms and knows how to calculate it' do |name, arguments|
|
8
|
+
include_context 'variables are initialized', arguments, *%w(values calculated)
|
11
9
|
|
12
10
|
let(:variables) do
|
13
11
|
[ 1, 2 ].map do |i|
|
@@ -54,20 +52,18 @@ shared_examples 'a function that has two terms and knows how to calculate it' do
|
|
54
52
|
end
|
55
53
|
end
|
56
54
|
|
57
|
-
shared_examples 'a
|
58
|
-
it_behaves_like 'a
|
55
|
+
shared_examples 'a operator that has two terms and knows how to call to_tex' do |arguments|
|
56
|
+
it_behaves_like 'a operator that has two terms and knows how to return a string out of it', :to_tex, arguments
|
59
57
|
end
|
60
58
|
|
61
|
-
shared_examples 'a
|
62
|
-
it_behaves_like 'a
|
59
|
+
shared_examples 'a operator that has two terms and knows how to call to_gnu' do |arguments|
|
60
|
+
it_behaves_like 'a operator that has two terms and knows how to return a string out of it', :to_gnu, arguments
|
63
61
|
end
|
64
62
|
|
65
|
-
shared_examples 'a
|
63
|
+
shared_examples 'a operator that has two terms and knows how to return a string out of it' do |command, arguments|
|
66
64
|
let(:values) { arguments[:values] }
|
67
65
|
|
68
|
-
|
69
|
-
let(key) { arguments[command][key.to_sym] }
|
70
|
-
end
|
66
|
+
include_context 'variables are initialized', arguments[command], *%w(string_expected numeric_string_expected partial_string_expected)
|
71
67
|
describe "##{command}" do
|
72
68
|
let(:variables) do
|
73
69
|
[ 1, 2 ].map do |i|
|
@@ -1,16 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
let(:variables_number) { 4 }
|
5
|
-
let(:variable) { { name: "X", value: 9 } }
|
1
|
+
shared_examples 'a operator with a single input value' do |arguments|
|
2
|
+
include_context 'variables are initialized', arguments, *%w(variable_value expected_number expected_tex expected_number_text expected_gnu)
|
3
|
+
let(:variable) { { name: "X", value: variable_value } }
|
6
4
|
let(:subject) do
|
7
|
-
described_class.new(variable
|
5
|
+
described_class.new(variable)
|
8
6
|
end
|
9
7
|
|
10
8
|
describe '#to_f' do
|
11
9
|
context 'when variables are not numbers but have value' do
|
12
10
|
it 'returns the division of the values' do
|
13
|
-
expect(subject.to_f).to eq(
|
11
|
+
expect(subject.to_f).to eq(expected_number)
|
14
12
|
end
|
15
13
|
|
16
14
|
it do
|
@@ -19,10 +17,10 @@ describe Danica::Function::SquareRoot do
|
|
19
17
|
end
|
20
18
|
|
21
19
|
context 'when the variable is a number' do
|
22
|
-
let(:variable) {
|
20
|
+
let(:variable) { variable_value }
|
23
21
|
|
24
22
|
it 'returns the squared root of the value' do
|
25
|
-
expect(subject.to_f).to eq(
|
23
|
+
expect(subject.to_f).to eq(expected_number)
|
26
24
|
end
|
27
25
|
|
28
26
|
it do
|
@@ -36,16 +34,16 @@ describe Danica::Function::SquareRoot do
|
|
36
34
|
let(:variable) { :X }
|
37
35
|
|
38
36
|
it 'returns a latex format fraction' do
|
39
|
-
expect(subject.to_tex).to eq(
|
37
|
+
expect(subject.to_tex).to eq(expected_tex)
|
40
38
|
end
|
41
39
|
end
|
42
40
|
|
43
41
|
context 'when the variable is numeric' do
|
44
42
|
before do
|
45
|
-
subject.
|
43
|
+
subject.variables[0].value = variable_value
|
46
44
|
end
|
47
45
|
it 'prints both numbers' do
|
48
|
-
expect(subject.to_tex).to eq(
|
46
|
+
expect(subject.to_tex).to eq(expected_number_text)
|
49
47
|
end
|
50
48
|
end
|
51
49
|
end
|
@@ -55,16 +53,16 @@ describe Danica::Function::SquareRoot do
|
|
55
53
|
let(:variable) { :X }
|
56
54
|
|
57
55
|
it 'returns a latex format fraction' do
|
58
|
-
expect(subject.to_gnu).to eq(
|
56
|
+
expect(subject.to_gnu).to eq(expected_gnu)
|
59
57
|
end
|
60
58
|
end
|
61
59
|
|
62
60
|
context 'when the variable is numeric' do
|
63
61
|
before do
|
64
|
-
subject.
|
62
|
+
subject.variables[0].value = variable_value
|
65
63
|
end
|
66
64
|
it 'prints both numbers' do
|
67
|
-
expect(subject.to_gnu).to eq(
|
65
|
+
expect(subject.to_gnu).to eq(expected_number_text)
|
68
66
|
end
|
69
67
|
end
|
70
68
|
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:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Darthjee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -179,31 +179,37 @@ files:
|
|
179
179
|
- Rakefile
|
180
180
|
- danica.gemspec
|
181
181
|
- lib/danica.rb
|
182
|
+
- lib/danica/common.rb
|
183
|
+
- lib/danica/common/class_methods.rb
|
184
|
+
- lib/danica/common/variables_builder.rb
|
185
|
+
- lib/danica/division.rb
|
182
186
|
- lib/danica/exception.rb
|
183
187
|
- lib/danica/exception/not_defined.rb
|
188
|
+
- lib/danica/exponential.rb
|
184
189
|
- lib/danica/function.rb
|
185
|
-
- lib/danica/function/chained.rb
|
186
|
-
- lib/danica/function/class_methods.rb
|
187
|
-
- lib/danica/function/division.rb
|
188
|
-
- lib/danica/function/power.rb
|
189
|
-
- lib/danica/function/product.rb
|
190
|
-
- lib/danica/function/square_root.rb
|
191
|
-
- lib/danica/function/sum.rb
|
192
|
-
- lib/danica/function/variables_builder.rb
|
193
190
|
- lib/danica/number.rb
|
191
|
+
- lib/danica/operator.rb
|
192
|
+
- lib/danica/operator/chained.rb
|
193
|
+
- lib/danica/power.rb
|
194
|
+
- lib/danica/product.rb
|
195
|
+
- lib/danica/square_root.rb
|
196
|
+
- lib/danica/sum.rb
|
194
197
|
- lib/danica/variable.rb
|
195
198
|
- lib/danica/version.rb
|
196
|
-
- spec/lib/danica/
|
197
|
-
- spec/lib/danica/
|
198
|
-
- spec/lib/danica/function/product_spec.rb
|
199
|
-
- spec/lib/danica/function/square_root_spec.rb
|
200
|
-
- spec/lib/danica/function/sum_spec.rb
|
199
|
+
- spec/lib/danica/division_spec.rb
|
200
|
+
- spec/lib/danica/exponential_spec.rb
|
201
201
|
- spec/lib/danica/function_spec.rb
|
202
202
|
- spec/lib/danica/number_spec.rb
|
203
|
+
- spec/lib/danica/power_spec.rb
|
204
|
+
- spec/lib/danica/product_spec.rb
|
205
|
+
- spec/lib/danica/square_root_spec.rb
|
206
|
+
- spec/lib/danica/sum_spec.rb
|
203
207
|
- spec/lib/danica/variable_spec.rb
|
204
208
|
- spec/spec_helper.rb
|
205
|
-
- spec/support/
|
206
|
-
- spec/support/shared_examples/
|
209
|
+
- spec/support/shared_contexts/common.rb
|
210
|
+
- spec/support/shared_examples/operator/chained.rb
|
211
|
+
- spec/support/shared_examples/operator/dual_term.rb
|
212
|
+
- spec/support/shared_examples/operator/single_input.rb
|
207
213
|
- spec/support/shared_examples/variable.rb
|
208
214
|
homepage:
|
209
215
|
licenses: []
|
@@ -229,15 +235,18 @@ signing_key:
|
|
229
235
|
specification_version: 4
|
230
236
|
summary: Danica
|
231
237
|
test_files:
|
232
|
-
- spec/lib/danica/
|
233
|
-
- spec/lib/danica/
|
234
|
-
- spec/lib/danica/function/product_spec.rb
|
235
|
-
- spec/lib/danica/function/square_root_spec.rb
|
236
|
-
- spec/lib/danica/function/sum_spec.rb
|
238
|
+
- spec/lib/danica/division_spec.rb
|
239
|
+
- spec/lib/danica/exponential_spec.rb
|
237
240
|
- spec/lib/danica/function_spec.rb
|
238
241
|
- spec/lib/danica/number_spec.rb
|
242
|
+
- spec/lib/danica/power_spec.rb
|
243
|
+
- spec/lib/danica/product_spec.rb
|
244
|
+
- spec/lib/danica/square_root_spec.rb
|
245
|
+
- spec/lib/danica/sum_spec.rb
|
239
246
|
- spec/lib/danica/variable_spec.rb
|
240
247
|
- spec/spec_helper.rb
|
241
|
-
- spec/support/
|
242
|
-
- spec/support/shared_examples/
|
248
|
+
- spec/support/shared_contexts/common.rb
|
249
|
+
- spec/support/shared_examples/operator/chained.rb
|
250
|
+
- spec/support/shared_examples/operator/dual_term.rb
|
251
|
+
- spec/support/shared_examples/operator/single_input.rb
|
243
252
|
- spec/support/shared_examples/variable.rb
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module Danica
|
2
|
-
class Function
|
3
|
-
class Division < Function
|
4
|
-
variables :numerator, :denominator
|
5
|
-
|
6
|
-
def to_f
|
7
|
-
numerator.to_f / denominator.to_f
|
8
|
-
end
|
9
|
-
|
10
|
-
private
|
11
|
-
|
12
|
-
def tex_string
|
13
|
-
"\\frac{#{numerator.to_tex}}{#{denominator.to_tex}}"
|
14
|
-
end
|
15
|
-
|
16
|
-
def gnu_string
|
17
|
-
"#{numerator.to_gnu}/#{denominator.to_gnu}"
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module Danica
|
2
|
-
class Function
|
3
|
-
class Power < Function
|
4
|
-
variables :base, :exponent
|
5
|
-
|
6
|
-
def to_f
|
7
|
-
base.to_f ** exponent.to_f
|
8
|
-
end
|
9
|
-
|
10
|
-
private
|
11
|
-
|
12
|
-
def tex_string
|
13
|
-
"#{base.to_tex}^{#{exponent.to_tex}}"
|
14
|
-
end
|
15
|
-
|
16
|
-
def gnu_string
|
17
|
-
"#{base.to_gnu}**#{exponent.to_gnu}"
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module Danica
|
2
|
-
class Function
|
3
|
-
class SquareRoot < Function
|
4
|
-
variables :variable
|
5
|
-
|
6
|
-
def to_f
|
7
|
-
Math.sqrt(variable.to_f)
|
8
|
-
end
|
9
|
-
|
10
|
-
private
|
11
|
-
|
12
|
-
def tex_string
|
13
|
-
"\\sqrt{#{variable.to_tex}}"
|
14
|
-
end
|
15
|
-
|
16
|
-
def gnu_string
|
17
|
-
"sqrt(#{variable.to_gnu})"
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|