danica 2.0.3 → 2.0.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/README.md +0 -5
- data/circle.yml +10 -0
- data/danica.gemspec +0 -2
- data/lib/danica.rb +5 -0
- data/lib/danica/base_operations.rb +15 -1
- data/lib/danica/common.rb +2 -14
- data/lib/danica/constant.rb +0 -3
- data/lib/danica/function.rb +12 -0
- data/lib/danica/group.rb +21 -0
- data/lib/danica/negative.rb +31 -0
- data/lib/danica/number.rb +5 -1
- data/lib/danica/operator/chained.rb +10 -0
- data/lib/danica/product.rb +4 -0
- data/lib/danica/sum.rb +4 -0
- data/lib/danica/version.rb +1 -1
- data/spec/lib/danica/constant_spec.rb +2 -1
- data/spec/lib/danica/cos_spec.rb +4 -3
- data/spec/lib/danica/division_spec.rb +2 -1
- data/spec/lib/danica/exponential_spec.rb +2 -1
- data/spec/lib/danica/function_spec.rb +181 -178
- data/spec/lib/danica/negative_spec.rb +52 -0
- data/spec/lib/danica/number_spec.rb +5 -3
- data/spec/lib/danica/power_spec.rb +2 -1
- data/spec/lib/danica/product_spec.rb +13 -1
- data/spec/lib/danica/sin_spec.rb +2 -1
- data/spec/lib/danica/squared_root_spec.rb +2 -1
- data/spec/lib/danica/sum_spec.rb +17 -1
- data/spec/lib/danica/variable_spec.rb +3 -1
- data/spec/spec_helper.rb +0 -5
- data/spec/support/models/functions/gauss.rb +41 -0
- data/spec/support/models/functions/spatial.rb +32 -0
- data/spec/support/shared_examples/base_operations.rb +74 -1
- data/spec/support/shared_examples/common.rb +6 -0
- metadata +14 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c3aa11c78083f2cf4dbf106b5edc4ae7370dc2a
|
4
|
+
data.tar.gz: d16d37bfebfd039a1469dec4029f927cd5374fed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec1d1e75b021be3608dd5f2aae2662fc8104d9cbd4b10e27fb4d6ca8aeb8c5c09542e58443799284c30965f4d3d5b5d2d5f5dbd659645c7b36d87b143f1d933a
|
7
|
+
data.tar.gz: de6db957793d4f43a74b5c9c311ed82cafdd6f016dbe260b7d09d66418297d1d35eacf47a6909d8376efaf3ab33f3201c190d5bc48e40dcbe546b1a6d1729083
|
data/README.md
CHANGED
@@ -125,11 +125,6 @@ end
|
|
125
125
|
|
126
126
|
#### Sample
|
127
127
|
```ruby
|
128
|
-
require 'danica/operator/product'
|
129
|
-
require 'danica/operator/sum'
|
130
|
-
require 'danica/operator/division'
|
131
|
-
require 'danica/operator/power'
|
132
|
-
|
133
128
|
module Danica
|
134
129
|
class Function::Spatial < Function
|
135
130
|
variables :time, :acceleration, :initial_space, :initial_velocity
|
data/circle.yml
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
dependencies:
|
2
|
+
post:
|
3
|
+
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
4
|
+
- chmod +x ./cc-test-reporter
|
5
|
+
|
6
|
+
test:
|
7
|
+
pre:
|
8
|
+
- ./cc-test-reporter before-build
|
9
|
+
override:
|
10
|
+
- bundle exec rspec; ./cc-test-reporter after-build --exit-code $?
|
data/danica.gemspec
CHANGED
data/lib/danica.rb
CHANGED
@@ -4,6 +4,8 @@ module Danica
|
|
4
4
|
autoload :BaseOperations, 'danica/base_operations'
|
5
5
|
autoload :Common, 'danica/common'
|
6
6
|
autoload :Number, 'danica/number'
|
7
|
+
autoload :Negative, 'danica/negative'
|
8
|
+
autoload :Group, 'danica/group'
|
7
9
|
autoload :Variable, 'danica/variable'
|
8
10
|
autoload :Operator, 'danica/operator'
|
9
11
|
autoload :Function, 'danica/function'
|
@@ -18,5 +20,8 @@ module Danica
|
|
18
20
|
autoload :Exponential, 'danica/exponential'
|
19
21
|
autoload :Sin, 'danica/sin'
|
20
22
|
autoload :Cos, 'danica/cos'
|
23
|
+
|
24
|
+
E = Constant.new(Math::E, :e, 'exp(1)')
|
25
|
+
PI = Constant.new(Math::PI, '\pi', :pi)
|
21
26
|
end
|
22
27
|
|
@@ -1,7 +1,21 @@
|
|
1
1
|
module Danica
|
2
2
|
module BaseOperations
|
3
3
|
def +(other)
|
4
|
-
return
|
4
|
+
return other + self if other.is_a?(Sum)
|
5
|
+
Sum.new(self, other)
|
6
|
+
end
|
7
|
+
|
8
|
+
def *(other)
|
9
|
+
return other * self if other.is_a?(Product)
|
10
|
+
Product.new(self, other)
|
11
|
+
end
|
12
|
+
|
13
|
+
def /(other)
|
14
|
+
Division.new(self, other)
|
15
|
+
end
|
16
|
+
|
17
|
+
def -(other)
|
18
|
+
self + Negative.new(other)
|
5
19
|
end
|
6
20
|
end
|
7
21
|
end
|
data/lib/danica/common.rb
CHANGED
@@ -5,22 +5,10 @@ module Danica
|
|
5
5
|
require 'danica/common/variables_builder'
|
6
6
|
|
7
7
|
attr_accessor :variables
|
8
|
-
|
8
|
+
|
9
9
|
def to_f
|
10
10
|
raise 'Not IMplemented yet'
|
11
11
|
end
|
12
|
-
|
13
|
-
def calculate(*args)
|
14
|
-
vars_map = args.extract_options!
|
15
|
-
vars_map = variables_value_hash.merge(vars_map)
|
16
|
-
vars_map.each do |k, v|
|
17
|
-
unless v && (v.is_a?(Integer) || v.valued?)
|
18
|
-
vars_map[k] = args.shift
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
self.class.new(vars_map).to_f
|
23
|
-
end
|
24
12
|
|
25
13
|
def to_tex
|
26
14
|
Number.new(to_f).to_tex
|
@@ -74,7 +62,7 @@ module Danica
|
|
74
62
|
return Number.new(value) if value.is_a?(Numeric)
|
75
63
|
return Variable.new(value) if value.is_a?(Hash)
|
76
64
|
return Variable.new(name: value) if [ String, Symbol ].any? { |c| value.is_a?(c) }
|
77
|
-
return Variable.new if value
|
65
|
+
return Variable.new if value.nil?
|
78
66
|
value
|
79
67
|
end
|
80
68
|
end
|
data/lib/danica/constant.rb
CHANGED
data/lib/danica/function.rb
CHANGED
@@ -9,5 +9,17 @@ module Danica
|
|
9
9
|
|
10
10
|
super({ variables: args.flatten }.merge(options))
|
11
11
|
end
|
12
|
+
|
13
|
+
def calculate(*args)
|
14
|
+
vars_map = args.extract_options!
|
15
|
+
vars_map = variables_value_hash.merge(vars_map)
|
16
|
+
vars_map.each do |k, v|
|
17
|
+
unless v && (v.is_a?(Integer) || v.valued?)
|
18
|
+
vars_map[k] = args.shift
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
self.class.new(vars_map).to_f
|
23
|
+
end
|
12
24
|
end
|
13
25
|
end
|
data/lib/danica/group.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module Danica
|
2
|
+
class Group < Common
|
3
|
+
include ActiveModel::Model
|
4
|
+
|
5
|
+
attr_accessor :value
|
6
|
+
|
7
|
+
delegate :to_f, :valued?, to: :value
|
8
|
+
|
9
|
+
def initialize(value)
|
10
|
+
@value = wrap_value(value)
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_tex
|
14
|
+
"(#{value.to_tex})"
|
15
|
+
end
|
16
|
+
|
17
|
+
alias_method :to_gnu, :to_tex
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Danica
|
2
|
+
class Negative < Common
|
3
|
+
include ActiveModel::Model
|
4
|
+
|
5
|
+
attr_accessor :value
|
6
|
+
|
7
|
+
delegate :valued?, to: :value
|
8
|
+
|
9
|
+
def initialize(value)
|
10
|
+
@value = wrap_value(value)
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_f
|
14
|
+
-value.to_f
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_tex
|
18
|
+
"-#{value.to_tex}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_gnu
|
22
|
+
"-#{value.to_gnu}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def ==(other)
|
26
|
+
return false unless other.class == self.class
|
27
|
+
value == other.value
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
data/lib/danica/number.rb
CHANGED
@@ -5,8 +5,18 @@ module Danica
|
|
5
5
|
chain(variables.map(&:to_f))
|
6
6
|
end
|
7
7
|
|
8
|
+
def include?(value)
|
9
|
+
value = wrap_value(value)
|
10
|
+
variables.include?(value)
|
11
|
+
end
|
12
|
+
|
8
13
|
private
|
9
14
|
|
15
|
+
def repack(other)
|
16
|
+
other_variables = other.is_a?(self.class) ? other.variables : [ other ]
|
17
|
+
self.class.new(variables + other_variables)
|
18
|
+
end
|
19
|
+
|
10
20
|
def tex_string
|
11
21
|
(numeric_to_tex + non_numeric_variables.map(&:to_tex)).join(" #{tex_symbol} ")
|
12
22
|
end
|
data/lib/danica/product.rb
CHANGED
data/lib/danica/sum.rb
CHANGED
data/lib/danica/version.rb
CHANGED
@@ -4,7 +4,8 @@ describe Danica::Constant do
|
|
4
4
|
subject { described_class.new(2.5, :M, :m) }
|
5
5
|
let(:other) { described_class.new(3, :N, :n) }
|
6
6
|
|
7
|
-
it_behaves_like 'an object
|
7
|
+
it_behaves_like 'an object that respond to basic_methods'
|
8
|
+
it_behaves_like 'an object with basic operation'
|
8
9
|
|
9
10
|
describe '#to_f' do
|
10
11
|
it 'has a value' do
|
data/spec/lib/danica/cos_spec.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Danica::Cos do
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
subject { described_class.new(:x) }
|
5
|
+
|
6
|
+
it_behaves_like 'an object that respond to basic_methods'
|
7
|
+
it_behaves_like 'an object with basic operation'
|
7
8
|
|
8
9
|
it_behaves_like 'a operator with a single input value', {
|
9
10
|
variable_value: Math::PI,
|
@@ -4,7 +4,8 @@ describe Danica::Division do
|
|
4
4
|
let(:variables) { [2, 4] }
|
5
5
|
subject { described_class.new(*variables) }
|
6
6
|
|
7
|
-
it_behaves_like 'an object
|
7
|
+
it_behaves_like 'an object that respond to basic_methods'
|
8
|
+
it_behaves_like 'an object with basic operation'
|
8
9
|
|
9
10
|
it_behaves_like 'a operator that has two terms', :division, {
|
10
11
|
values: [ 2, 4 ],
|
@@ -3,7 +3,8 @@ require 'spec_helper'
|
|
3
3
|
describe Danica::Exponential do
|
4
4
|
subject { described_class.new(2) }
|
5
5
|
|
6
|
-
it_behaves_like 'an object
|
6
|
+
it_behaves_like 'an object that respond to basic_methods'
|
7
|
+
it_behaves_like 'an object with basic operation'
|
7
8
|
|
8
9
|
it_behaves_like 'a operator with a single input value', {
|
9
10
|
variable_value: 2,
|
@@ -1,247 +1,250 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Danica::Function do
|
4
|
-
|
5
|
-
|
6
|
-
variables :time, :acceleration, :initial_space, :initial_velocity
|
7
|
-
delegate :to_f, :to_tex, :to_gnu, to: :sum
|
8
|
-
|
9
|
-
private
|
10
|
-
|
11
|
-
def sum
|
12
|
-
@sum ||= Sum.new(parcels)
|
13
|
-
end
|
14
|
-
|
15
|
-
def parcels
|
16
|
-
[
|
17
|
-
initial_space,
|
18
|
-
spatial_velocity,
|
19
|
-
spatial_acceleration
|
20
|
-
]
|
21
|
-
end
|
22
|
-
|
23
|
-
def spatial_velocity
|
24
|
-
Product.new(initial_velocity, time)
|
25
|
-
end
|
26
|
-
|
27
|
-
def spatial_acceleration
|
28
|
-
Division.new(Product.new(acceleration, time_squared), 2)
|
29
|
-
end
|
30
|
-
|
31
|
-
def time_squared
|
32
|
-
Power.new(time, 2)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
let(:variables) do
|
38
|
-
{
|
39
|
-
time: :t,
|
40
|
-
acceleration: 'a',
|
41
|
-
initial_space: { name: :S0, latex: 'S_0' },
|
42
|
-
initial_velocity: { name: :V0, latex: 'V_0' }
|
43
|
-
}
|
44
|
-
end
|
45
|
-
|
46
|
-
subject { described_class::Spatial.new(variables) }
|
47
|
-
|
48
|
-
describe '#to_tex' do
|
49
|
-
context 'when creating the spatial operator for constantly accelerated movement' do
|
50
|
-
let(:expected) { 'S_0 + V_0 \cdot t + \frac{a \cdot t^{2}}{2}' }
|
51
|
-
|
52
|
-
it 'return the latex format CAM' do
|
53
|
-
expect(subject.to_tex).to eq(expected)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
describe '#to_gnu' do
|
59
|
-
context 'when creating the spatial operator for constantly accelerated movement' do
|
60
|
-
let(:expected) { 'S0 + V0 * t + a * t**2/2' }
|
61
|
-
|
62
|
-
it 'return the latex format CAM' do
|
63
|
-
expect(subject.to_gnu).to eq(expected)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
describe '#variables_hash' do
|
69
|
-
let(:expected) do
|
4
|
+
describe 'spatial' do
|
5
|
+
let(:variables) do
|
70
6
|
{
|
71
|
-
time:
|
72
|
-
acceleration:
|
73
|
-
initial_space:
|
74
|
-
initial_velocity:
|
7
|
+
time: :t,
|
8
|
+
acceleration: 'a',
|
9
|
+
initial_space: { name: :S0, latex: 'S_0' },
|
10
|
+
initial_velocity: { name: :V0, latex: 'V_0' }
|
75
11
|
}
|
76
12
|
end
|
77
13
|
|
78
|
-
|
79
|
-
|
80
|
-
it 'returns a hash with the variabels' do
|
81
|
-
expect(subject.variables_hash).to eq(expected)
|
82
|
-
end
|
83
|
-
end
|
14
|
+
subject { described_class::Spatial.new(variables) }
|
15
|
+
it_behaves_like 'an object that respond to basic_methods'
|
84
16
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
end
|
17
|
+
describe '#to_tex' do
|
18
|
+
context 'when creating the spatial operator for constantly accelerated movement' do
|
19
|
+
let(:expected) { 'S_0 + V_0 \cdot t + \frac{a \cdot t^{2}}{2}' }
|
89
20
|
|
90
|
-
|
91
|
-
|
21
|
+
it 'return the latex format CAM' do
|
22
|
+
expect(subject.to_tex).to eq(expected)
|
23
|
+
end
|
92
24
|
end
|
93
25
|
end
|
94
26
|
|
95
|
-
|
96
|
-
|
97
|
-
|
27
|
+
describe '#to_gnu' do
|
28
|
+
context 'when creating the spatial operator for constantly accelerated movement' do
|
29
|
+
let(:expected) { 'S0 + V0 * t + a * t**2/2' }
|
30
|
+
|
31
|
+
it 'return the latex format CAM' do
|
32
|
+
expect(subject.to_gnu).to eq(expected)
|
33
|
+
end
|
98
34
|
end
|
99
35
|
end
|
100
36
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
37
|
+
describe '#variables_hash' do
|
38
|
+
let(:expected) do
|
39
|
+
{
|
40
|
+
time: Danica::Variable.new(name: :t),
|
41
|
+
acceleration: Danica::Variable.new(name: 'a'),
|
42
|
+
initial_space: Danica::Variable.new( name: :S0, latex: 'S_0' ),
|
43
|
+
initial_velocity: Danica::Variable.new( name: :V0, latex: 'V_0' )
|
44
|
+
}
|
105
45
|
end
|
106
46
|
|
107
|
-
|
108
|
-
|
47
|
+
context 'when variables are already wrapped with DanicaVariable' do
|
48
|
+
let(:variables) { expected }
|
49
|
+
it 'returns a hash with the variabels' do
|
50
|
+
expect(subject.variables_hash).to eq(expected)
|
51
|
+
end
|
109
52
|
end
|
110
|
-
end
|
111
53
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
54
|
+
context 'when variables have been defined with string name' do
|
55
|
+
before do
|
56
|
+
variables.change_keys!(&:to_s)
|
57
|
+
end
|
116
58
|
|
117
59
|
it 'returns a hash with the variabels' do
|
118
60
|
expect(subject.variables_hash).to eq(expected)
|
119
61
|
end
|
120
62
|
end
|
121
|
-
end
|
122
|
-
|
123
|
-
context 'when initializing with sequence' do
|
124
|
-
context 'as hash' do
|
125
|
-
let(:variables) { [ :t, 'a', {name: :S0, latex: 'S_0'}, { name: :V0, latex: 'V_0' } ] }
|
126
|
-
subject { described_class::Spatial.new(*variables, {}) }
|
127
63
|
|
64
|
+
context 'when variables are not wrapped yet' do
|
128
65
|
it 'returns a hash with the variabels' do
|
129
66
|
expect(subject.variables_hash).to eq(expected)
|
130
67
|
end
|
131
68
|
end
|
132
|
-
end
|
133
69
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
70
|
+
context 'when changing a variable' do
|
71
|
+
before do
|
72
|
+
subject.time = :x
|
73
|
+
expected[:time] = Danica::Variable.new(name: :x)
|
74
|
+
end
|
138
75
|
|
139
|
-
it
|
76
|
+
it do
|
140
77
|
expect(subject.variables_hash).to eq(expected)
|
141
78
|
end
|
142
79
|
end
|
143
|
-
end
|
144
|
-
end
|
145
80
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
81
|
+
context 'when initializing with array' do
|
82
|
+
context 'as hash' do
|
83
|
+
let(:variables) { [ :t, 'a', {name: :S0, latex: 'S_0'}, { name: :V0, latex: 'V_0' } ] }
|
84
|
+
subject { described_class::Spatial.new(variables) }
|
85
|
+
|
86
|
+
it 'returns a hash with the variabels' do
|
87
|
+
expect(subject.variables_hash).to eq(expected)
|
88
|
+
end
|
89
|
+
end
|
152
90
|
end
|
153
|
-
end
|
154
91
|
|
155
|
-
|
156
|
-
|
157
|
-
|
92
|
+
context 'when initializing with sequence' do
|
93
|
+
context 'as hash' do
|
94
|
+
let(:variables) { [ :t, 'a', {name: :S0, latex: 'S_0'}, { name: :V0, latex: 'V_0' } ] }
|
95
|
+
subject { described_class::Spatial.new(*variables, {}) }
|
158
96
|
|
159
|
-
|
160
|
-
|
161
|
-
|
97
|
+
it 'returns a hash with the variabels' do
|
98
|
+
expect(subject.variables_hash).to eq(expected)
|
99
|
+
end
|
162
100
|
end
|
163
101
|
end
|
164
102
|
|
165
|
-
context 'when
|
166
|
-
|
167
|
-
|
103
|
+
context 'when initializing with variables array' do
|
104
|
+
context 'as hash' do
|
105
|
+
let(:variables) { [ :t, 'a', {name: :S0, latex: 'S_0'}, { name: :V0, latex: 'V_0' } ] }
|
106
|
+
subject { described_class::Spatial.new(variables: variables) }
|
107
|
+
|
108
|
+
it 'returns a hash with the variabels' do
|
109
|
+
expect(subject.variables_hash).to eq(expected)
|
110
|
+
end
|
168
111
|
end
|
112
|
+
end
|
113
|
+
end
|
169
114
|
|
170
|
-
|
171
|
-
|
115
|
+
describe '#variables' do
|
116
|
+
context 'when initialized with an array of variables' do
|
117
|
+
subject { described_class::Spatial.new(variables: variables.values) }
|
118
|
+
let(:expected) { variables.values.map { |v| subject.send(:wrap_value, v)} }
|
119
|
+
it do
|
120
|
+
expect(subject.variables.compact).to eq(expected)
|
172
121
|
end
|
173
122
|
end
|
174
123
|
|
175
|
-
context 'when initializing
|
176
|
-
|
177
|
-
|
124
|
+
context 'when not initializing all variables' do
|
125
|
+
subject { described_class::Spatial.new }
|
126
|
+
let(:time) { Danica::Variable.new(name: :t) }
|
178
127
|
|
179
|
-
|
180
|
-
|
128
|
+
context 'when initialized with an empty variable set' do
|
129
|
+
it do
|
130
|
+
expect(subject.variables.compact).to be_empty
|
131
|
+
end
|
181
132
|
end
|
182
133
|
|
183
|
-
context 'when
|
184
|
-
|
185
|
-
|
186
|
-
initial_velocity: :v0,
|
187
|
-
initial_space: :s0,
|
188
|
-
acceleration: :a,
|
189
|
-
time: :t
|
190
|
-
}
|
134
|
+
context 'when changing a variable' do
|
135
|
+
before do
|
136
|
+
subject.time = time
|
191
137
|
end
|
192
|
-
subject { described_class::Spatial.new variables }
|
193
138
|
|
194
|
-
it 'returns the
|
139
|
+
it 'returns the list of variables' do
|
140
|
+
expect(subject.variables.compact).to eq([ time ])
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
context 'when initializing with a variable set' do
|
145
|
+
let(:names) { [ :t, :a, :s0, :v0 ] }
|
146
|
+
subject { described_class::Spatial.new *names }
|
147
|
+
|
148
|
+
it 'returns the variables given oin initialization' do
|
195
149
|
expect(subject.variables.map(&:name)).to eq(names)
|
196
150
|
end
|
151
|
+
|
152
|
+
context 'when initializing variables with a hash out of order' do
|
153
|
+
let(:variables) do
|
154
|
+
{
|
155
|
+
initial_velocity: :v0,
|
156
|
+
initial_space: :s0,
|
157
|
+
acceleration: :a,
|
158
|
+
time: :t
|
159
|
+
}
|
160
|
+
end
|
161
|
+
subject { described_class::Spatial.new variables }
|
162
|
+
|
163
|
+
it 'returns the variables given on initialization' do
|
164
|
+
expect(subject.variables.map(&:name)).to eq(names)
|
165
|
+
end
|
166
|
+
end
|
197
167
|
end
|
198
168
|
end
|
199
169
|
end
|
200
|
-
end
|
201
170
|
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
171
|
+
describe '#calculate' do
|
172
|
+
context 'when all variables have value' do
|
173
|
+
let(:time_value) { 2 }
|
174
|
+
let(:time) { time_value }
|
175
|
+
let(:acceleration) { 3 }
|
176
|
+
let(:initial_space) { 1 }
|
177
|
+
let(:initial_velocity) { 1 }
|
178
|
+
subject { described_class::Spatial.new(time, acceleration, initial_space, initial_velocity) }
|
179
|
+
let(:expected) { initial_space + initial_velocity * time_value + acceleration * (time_value ** 2) / 2.0 }
|
180
|
+
|
181
|
+
it 'retuirns the calculated value' do
|
182
|
+
expect(subject.calculate).to eq(expected)
|
183
|
+
end
|
215
184
|
|
216
|
-
|
217
|
-
|
185
|
+
context 'when not all variables have value' do
|
186
|
+
let(:time) { :t }
|
218
187
|
|
219
|
-
|
220
|
-
|
221
|
-
|
188
|
+
it do
|
189
|
+
expect { subject.calculate }.to raise_error(Danica::Exception::NotDefined)
|
190
|
+
end
|
222
191
|
|
223
|
-
|
224
|
-
|
225
|
-
|
192
|
+
context 'but calling calculate with a value for the variables' do
|
193
|
+
it 'calculate using the given value' do
|
194
|
+
expect(subject.calculate(time_value)).to eq(expected)
|
195
|
+
end
|
196
|
+
|
197
|
+
it 'does not change the values of then valued variables' do
|
198
|
+
expect do
|
199
|
+
subject.calculate(time_value)
|
200
|
+
end.not_to change(subject.time, :valued?)
|
201
|
+
end
|
226
202
|
end
|
227
203
|
|
228
|
-
|
229
|
-
|
230
|
-
subject.calculate(time_value)
|
231
|
-
end
|
204
|
+
context 'when calling with a hash for the values' do
|
205
|
+
it 'calculate using the given value' do
|
206
|
+
expect(subject.calculate(time: time_value)).to eq(expected)
|
207
|
+
end
|
208
|
+
|
209
|
+
it 'does not change the values of then valued variables' do
|
210
|
+
expect do
|
211
|
+
subject.calculate(time: time_value)
|
212
|
+
end.not_to change(subject.time, :valued?)
|
213
|
+
end
|
232
214
|
end
|
233
215
|
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
234
219
|
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
220
|
+
describe 'gauss' do
|
221
|
+
let(:variables) do
|
222
|
+
{
|
223
|
+
x: :x,
|
224
|
+
median: :u,
|
225
|
+
variance_root: :v
|
226
|
+
}
|
227
|
+
end
|
239
228
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
229
|
+
subject { described_class::Gauss.new(variables) }
|
230
|
+
it_behaves_like 'an object that respond to basic_methods'
|
231
|
+
|
232
|
+
describe '#to_tex' do
|
233
|
+
context 'when creating the spatial operator for constantly accelerated movement' do
|
234
|
+
let(:expected) { '\frac{1}{\sqrt{6.283185307179586 \cdot v^{2}}} \cdot e^{-\frac{(x + -u)^{2}}{2 \cdot v^{2}}}' }
|
235
|
+
|
236
|
+
it 'return the latex format CAM' do
|
237
|
+
expect(subject.to_tex).to eq(expected)
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
describe '#to_gnu' do
|
243
|
+
context 'when creating the spatial operator for constantly accelerated movement' do
|
244
|
+
let(:expected) { '1/sqrt(6.283185307179586 * v**2) * exp(-(x + -u)**2/2 * v**2)' }
|
245
|
+
|
246
|
+
it 'return the latex format CAM' do
|
247
|
+
expect(subject.to_gnu).to eq(expected)
|
245
248
|
end
|
246
249
|
end
|
247
250
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Danica::Negative do
|
4
|
+
let(:value) { Danica::Number.new(10) }
|
5
|
+
subject { described_class.new(value) }
|
6
|
+
|
7
|
+
it_behaves_like 'an object that respond to basic_methods'
|
8
|
+
|
9
|
+
describe '#to_f' do
|
10
|
+
it 'returns the float of value' do
|
11
|
+
expect(subject.to_f).to eq(-10)
|
12
|
+
end
|
13
|
+
|
14
|
+
it { expect(subject.to_f).to be_a(Float) }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#to_tex' do
|
18
|
+
context 'when value should be integer' do
|
19
|
+
let(:value) { 10.0 }
|
20
|
+
|
21
|
+
it 'returns the value integer string' do
|
22
|
+
expect(subject.to_tex).to eq('-10')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'when value should be float' do
|
27
|
+
let(:value) { 10.5 }
|
28
|
+
|
29
|
+
it 'returns the value float string' do
|
30
|
+
expect(subject.to_tex).to eq('-10.5')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#to_gnu' do
|
36
|
+
context 'when value should be integer' do
|
37
|
+
let(:value) { 10.0 }
|
38
|
+
|
39
|
+
it 'returns the value integer string' do
|
40
|
+
expect(subject.to_gnu).to eq('-10')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when value should be a float' do
|
45
|
+
let(:value) { 10.5 }
|
46
|
+
|
47
|
+
it 'returns the value float string' do
|
48
|
+
expect(subject.to_gnu).to eq('-10.5')
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -4,7 +4,9 @@ describe Danica::Number do
|
|
4
4
|
let(:value) { 10 }
|
5
5
|
subject { described_class.new(value) }
|
6
6
|
|
7
|
-
it_behaves_like 'an object
|
7
|
+
it_behaves_like 'an object that respond to basic_methods'
|
8
|
+
|
9
|
+
it_behaves_like 'an object with basic operation'
|
8
10
|
|
9
11
|
describe '#to_f' do
|
10
12
|
it 'returns the float of value' do
|
@@ -23,10 +25,10 @@ describe Danica::Number do
|
|
23
25
|
end
|
24
26
|
end
|
25
27
|
|
26
|
-
context 'when value should be
|
28
|
+
context 'when value should be a float' do
|
27
29
|
let(:value) { 10.5 }
|
28
30
|
|
29
|
-
it 'returns the value
|
31
|
+
it 'returns the value float string' do
|
30
32
|
expect(subject.to_tex).to eq('10.5')
|
31
33
|
end
|
32
34
|
end
|
@@ -4,7 +4,8 @@ describe Danica::Power do
|
|
4
4
|
let(:variables) { [2, 4] }
|
5
5
|
subject { described_class.new(*variables) }
|
6
6
|
|
7
|
-
it_behaves_like 'an object
|
7
|
+
it_behaves_like 'an object that respond to basic_methods'
|
8
|
+
it_behaves_like 'an object with basic operation'
|
8
9
|
|
9
10
|
it_behaves_like 'a operator that has two terms', :power, {
|
10
11
|
values: [ 3, 2 ],
|
@@ -2,8 +2,20 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Danica::Product do
|
4
4
|
subject { described_class.new(2,4) }
|
5
|
+
it_behaves_like 'an object that respond to basic_methods'
|
5
6
|
|
6
|
-
it_behaves_like 'an object with
|
7
|
+
it_behaves_like 'an object with * operation' do
|
8
|
+
let(:subject_included) { 4 }
|
9
|
+
|
10
|
+
context 'when other is also a sum' do
|
11
|
+
let(:other) { described_class.new(200, 5) }
|
12
|
+
|
13
|
+
it 'includes the sum parcels' do
|
14
|
+
expect(result).to include(200)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
it_behaves_like 'an object with basic operation', ignore: :*
|
7
19
|
|
8
20
|
it_behaves_like 'a operator that joins many variables with same operation', {
|
9
21
|
calculated: 24,
|
data/spec/lib/danica/sin_spec.rb
CHANGED
@@ -3,7 +3,8 @@ require 'spec_helper'
|
|
3
3
|
describe Danica::Sin do
|
4
4
|
subject { described_class.new(10) }
|
5
5
|
|
6
|
-
it_behaves_like 'an object
|
6
|
+
it_behaves_like 'an object that respond to basic_methods'
|
7
|
+
it_behaves_like 'an object with basic operation'
|
7
8
|
|
8
9
|
it_behaves_like 'a operator with a single input value', {
|
9
10
|
variable_value: Math::PI / 2.0,
|
@@ -3,7 +3,8 @@ require 'spec_helper'
|
|
3
3
|
describe Danica::SquaredRoot do
|
4
4
|
subject { described_class.new(9) }
|
5
5
|
|
6
|
-
it_behaves_like 'an object
|
6
|
+
it_behaves_like 'an object that respond to basic_methods'
|
7
|
+
it_behaves_like 'an object with basic operation'
|
7
8
|
|
8
9
|
it_behaves_like 'a operator with a single input value', {
|
9
10
|
variable_value: 9,
|
data/spec/lib/danica/sum_spec.rb
CHANGED
@@ -3,7 +3,23 @@ require 'spec_helper'
|
|
3
3
|
describe Danica::Sum do
|
4
4
|
subject { described_class.new(10, 2) }
|
5
5
|
|
6
|
-
it_behaves_like 'an object
|
6
|
+
it_behaves_like 'an object that respond to basic_methods'
|
7
|
+
|
8
|
+
it_behaves_like 'an object with basic operation', operations: %i(* /)
|
9
|
+
it_behaves_like 'an object with + operation' do
|
10
|
+
let(:subject_included) { 10 }
|
11
|
+
|
12
|
+
context 'when other is also a sum' do
|
13
|
+
let(:other) { described_class.new(200, 5) }
|
14
|
+
|
15
|
+
it 'includes the sum parcels' do
|
16
|
+
expect(result).to include(200)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
it_behaves_like 'an object with - operation' do
|
21
|
+
let(:subject_included) { 10 }
|
22
|
+
end
|
7
23
|
|
8
24
|
it_behaves_like 'a operator that joins many variables with same operation', {
|
9
25
|
calculated: 10,
|
@@ -1,7 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Danica::Variable do
|
4
|
-
it_behaves_like 'an object
|
4
|
+
it_behaves_like 'an object that respond to basic_methods'
|
5
|
+
|
6
|
+
it_behaves_like 'an object with basic operation' do
|
5
7
|
subject { described_class.new(value: 100) }
|
6
8
|
end
|
7
9
|
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,41 @@
|
|
1
|
+
module Danica
|
2
|
+
class Function::Gauss < Function
|
3
|
+
variables :x, :median, :variance_root
|
4
|
+
delegate :to_f, :to_tex, :to_gnu, to: :product
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def product
|
9
|
+
@sum ||= Product.new(parcels)
|
10
|
+
end
|
11
|
+
|
12
|
+
def parcels
|
13
|
+
[
|
14
|
+
Division.new(1, denominator),
|
15
|
+
Exponential.new(exponential)
|
16
|
+
]
|
17
|
+
end
|
18
|
+
|
19
|
+
def denominator
|
20
|
+
SquaredRoot.new(
|
21
|
+
Product.new(2, PI, variance),
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def exponential
|
26
|
+
Negative.new(
|
27
|
+
Division.new(
|
28
|
+
Power.new(Group.new(
|
29
|
+
Sum.new(x, Negative.new(median))
|
30
|
+
), 2),
|
31
|
+
Product.new(2, variance)
|
32
|
+
)
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
def variance
|
37
|
+
@variance ||= Power.new(variance_root, 2)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Danica
|
2
|
+
class Function::Spatial < Function
|
3
|
+
variables :time, :acceleration, :initial_space, :initial_velocity
|
4
|
+
delegate :to_f, :to_tex, :to_gnu, to: :sum
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def sum
|
9
|
+
@sum ||= Sum.new(parcels)
|
10
|
+
end
|
11
|
+
|
12
|
+
def parcels
|
13
|
+
[
|
14
|
+
initial_space,
|
15
|
+
spatial_velocity,
|
16
|
+
spatial_acceleration
|
17
|
+
]
|
18
|
+
end
|
19
|
+
|
20
|
+
def spatial_velocity
|
21
|
+
Product.new(initial_velocity, time)
|
22
|
+
end
|
23
|
+
|
24
|
+
def spatial_acceleration
|
25
|
+
Division.new(Product.new(acceleration, time_squared), 2)
|
26
|
+
end
|
27
|
+
|
28
|
+
def time_squared
|
29
|
+
Power.new(time, 2)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,4 +1,77 @@
|
|
1
|
+
shared_examples 'an object with basic operation' do |operations:%i(+ - * /), ignore:[]|
|
2
|
+
(operations - [ ignore ].flatten).each do |operation|
|
3
|
+
it_behaves_like "an object with #{operation} operation"
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
shared_examples 'an object with an operation' do |clazz|
|
8
|
+
it { expect(result).to be_a(clazz) }
|
9
|
+
|
10
|
+
it 'includes other as parcel' do
|
11
|
+
expect(result).to be_include(other)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'includes the subject as parcel' do
|
15
|
+
expect(result).to be_include(subject_included)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
1
19
|
shared_examples 'an object with + operation' do
|
2
20
|
let(:other) { 104 }
|
3
|
-
|
21
|
+
let(:result) { subject + other }
|
22
|
+
let(:subject_included) { subject }
|
23
|
+
|
24
|
+
it_behaves_like 'an object with an operation', Danica::Sum
|
25
|
+
|
26
|
+
context 'when operating as reverse' do
|
27
|
+
let(:result) { Danica::Number.new(other) + subject }
|
28
|
+
it_behaves_like 'an object with an operation', Danica::Sum
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
shared_examples 'an object with * operation' do
|
33
|
+
let(:other) { 104 }
|
34
|
+
let(:result) { subject * other }
|
35
|
+
let(:subject_included) { subject }
|
36
|
+
|
37
|
+
it_behaves_like 'an object with an operation', Danica::Product
|
38
|
+
|
39
|
+
context 'when operating as reverse' do
|
40
|
+
let(:result) { Danica::Number.new(other) * subject }
|
41
|
+
it_behaves_like 'an object with an operation', Danica::Product
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
shared_examples 'an object with / operation' do
|
46
|
+
let(:other) { 104 }
|
47
|
+
let(:other_number) { Danica::Number.new(104) }
|
48
|
+
let(:result) { subject / other }
|
49
|
+
|
50
|
+
it { expect(result).to be_a(Danica::Division) }
|
51
|
+
|
52
|
+
it 'includes other as denominator' do
|
53
|
+
expect(result.denominator).to eq(other_number)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'includes the subject as numerator' do
|
57
|
+
expect(result.numerator).to eq(subject)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
shared_examples 'an object with - operation' do
|
62
|
+
let(:other) { 104 }
|
63
|
+
let(:negative_other) { Danica::Negative.new(other) }
|
64
|
+
let(:result) { subject - other }
|
65
|
+
let(:subject_included) { subject }
|
66
|
+
|
67
|
+
it { expect(result).to be_a(Danica::Sum) }
|
68
|
+
|
69
|
+
it 'includes other as negative parcel' do
|
70
|
+
expect(result).to be_include(negative_other)
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'includes the subject as parcel' do
|
74
|
+
expect(result).to be_include(subject_included)
|
75
|
+
end
|
4
76
|
end
|
77
|
+
|
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.0.
|
4
|
+
version: 2.0.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-09-
|
11
|
+
date: 2017-09-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -150,20 +150,6 @@ dependencies:
|
|
150
150
|
- - ">="
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
|
-
- !ruby/object:Gem::Dependency
|
154
|
-
name: codeclimate-test-reporter
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
- - ">="
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: '0'
|
160
|
-
type: :development
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - ">="
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: '0'
|
167
153
|
description:
|
168
154
|
email:
|
169
155
|
- darthjee@gmail.com
|
@@ -176,6 +162,7 @@ files:
|
|
176
162
|
- Gemfile
|
177
163
|
- README.md
|
178
164
|
- Rakefile
|
165
|
+
- circle.yml
|
179
166
|
- danica.gemspec
|
180
167
|
- docker-compose.yml
|
181
168
|
- lib/danica.rb
|
@@ -190,6 +177,8 @@ files:
|
|
190
177
|
- lib/danica/exception/not_defined.rb
|
191
178
|
- lib/danica/exponential.rb
|
192
179
|
- lib/danica/function.rb
|
180
|
+
- lib/danica/group.rb
|
181
|
+
- lib/danica/negative.rb
|
193
182
|
- lib/danica/number.rb
|
194
183
|
- lib/danica/operator.rb
|
195
184
|
- lib/danica/operator/chained.rb
|
@@ -205,6 +194,7 @@ files:
|
|
205
194
|
- spec/lib/danica/division_spec.rb
|
206
195
|
- spec/lib/danica/exponential_spec.rb
|
207
196
|
- spec/lib/danica/function_spec.rb
|
197
|
+
- spec/lib/danica/negative_spec.rb
|
208
198
|
- spec/lib/danica/number_spec.rb
|
209
199
|
- spec/lib/danica/power_spec.rb
|
210
200
|
- spec/lib/danica/product_spec.rb
|
@@ -213,8 +203,11 @@ files:
|
|
213
203
|
- spec/lib/danica/sum_spec.rb
|
214
204
|
- spec/lib/danica/variable_spec.rb
|
215
205
|
- spec/spec_helper.rb
|
206
|
+
- spec/support/models/functions/gauss.rb
|
207
|
+
- spec/support/models/functions/spatial.rb
|
216
208
|
- spec/support/shared_contexts/common.rb
|
217
209
|
- spec/support/shared_examples/base_operations.rb
|
210
|
+
- spec/support/shared_examples/common.rb
|
218
211
|
- spec/support/shared_examples/operator/chained.rb
|
219
212
|
- spec/support/shared_examples/operator/dual_term.rb
|
220
213
|
- spec/support/shared_examples/operator/single_input.rb
|
@@ -238,7 +231,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
238
231
|
version: '0'
|
239
232
|
requirements: []
|
240
233
|
rubyforge_project:
|
241
|
-
rubygems_version: 2.6.
|
234
|
+
rubygems_version: 2.6.8
|
242
235
|
signing_key:
|
243
236
|
specification_version: 4
|
244
237
|
summary: Danica
|
@@ -248,6 +241,7 @@ test_files:
|
|
248
241
|
- spec/lib/danica/division_spec.rb
|
249
242
|
- spec/lib/danica/exponential_spec.rb
|
250
243
|
- spec/lib/danica/function_spec.rb
|
244
|
+
- spec/lib/danica/negative_spec.rb
|
251
245
|
- spec/lib/danica/number_spec.rb
|
252
246
|
- spec/lib/danica/power_spec.rb
|
253
247
|
- spec/lib/danica/product_spec.rb
|
@@ -256,8 +250,11 @@ test_files:
|
|
256
250
|
- spec/lib/danica/sum_spec.rb
|
257
251
|
- spec/lib/danica/variable_spec.rb
|
258
252
|
- spec/spec_helper.rb
|
253
|
+
- spec/support/models/functions/gauss.rb
|
254
|
+
- spec/support/models/functions/spatial.rb
|
259
255
|
- spec/support/shared_contexts/common.rb
|
260
256
|
- spec/support/shared_examples/base_operations.rb
|
257
|
+
- spec/support/shared_examples/common.rb
|
261
258
|
- spec/support/shared_examples/operator/chained.rb
|
262
259
|
- spec/support/shared_examples/operator/dual_term.rb
|
263
260
|
- spec/support/shared_examples/operator/single_input.rb
|