danica 2.0.3 → 2.0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|