danica 2.1.1 → 2.2.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/README.md +13 -22
- data/lib/danica.rb +10 -0
- data/lib/danica/builder.rb +9 -0
- data/lib/danica/dsl.rb +21 -0
- data/lib/danica/function.rb +4 -3
- data/lib/danica/operator.rb +5 -0
- data/lib/danica/version.rb +1 -1
- data/spec/lib/danica/dsl_spec.rb +42 -0
- data/spec/lib/danica/function_spec.rb +10 -0
- data/spec/lib/danica_spec.rb +57 -0
- data/spec/support/models/functions/baskara.rb +5 -5
- data/spec/support/models/functions/gauss.rb +13 -13
- data/spec/support/models/functions/spatial.rb +5 -5
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1a4ece25f84b8d2b7cadc2b68fbd1a6ee4e7d82d
|
4
|
+
data.tar.gz: 00476bd0e01921256126c28be5b08781ed223137
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 430fa8144c3d9ef83f41c1a9c0a5d63699d5d8cac5c89c2ed79d97835ebec39a1beb4da6f1cbd68a9540846e93174ec1acfd82ca2c4c50bf90cace854beac782
|
7
|
+
data.tar.gz: '09317ebf09542e77ca54afb320e495143b796689052e5541d532de58b1e12a00fe6879fe663c0481dce008e0c554fe643d14b2bf419734719d9e6bb1be9a5e42'
|
data/README.md
CHANGED
@@ -38,29 +38,19 @@ class MyOperator < Danica::Operator
|
|
38
38
|
def to_gnu
|
39
39
|
#optionaly implement custom to_gnu method
|
40
40
|
end
|
41
|
-
|
42
|
-
private
|
43
|
-
|
44
|
-
def to_tex
|
45
|
-
#implement to_tex here
|
46
|
-
end
|
47
|
-
|
48
|
-
def to_gnu
|
49
|
-
#implement to_gnu here
|
50
|
-
end
|
51
41
|
end
|
52
42
|
```
|
43
|
+
|
53
44
|
#### Sample
|
54
45
|
```ruby
|
55
|
-
class Danica::Inverse
|
46
|
+
class Danica::Inverse < Danica::Operator
|
47
|
+
|
56
48
|
variables :value
|
57
49
|
|
58
50
|
def to_f
|
59
51
|
value.to_f ** -1 #Do not worry with nil value as this has been implemented already raising Danica::Exception::NotDefined
|
60
52
|
end
|
61
53
|
|
62
|
-
private
|
63
|
-
|
64
54
|
def to_tex
|
65
55
|
"(#{value.to_tex})^{-1}"
|
66
56
|
end
|
@@ -119,7 +109,9 @@ as the base of the power operator and the y variable is present on both power an
|
|
119
109
|
class MyFunction
|
120
110
|
variables :variables_list
|
121
111
|
|
122
|
-
|
112
|
+
def function_block
|
113
|
+
# code of operators composition
|
114
|
+
end
|
123
115
|
end
|
124
116
|
```
|
125
117
|
|
@@ -128,12 +120,11 @@ end
|
|
128
120
|
module Danica
|
129
121
|
class Function::Spatial < Function
|
130
122
|
variables :time, :acceleration, :initial_space, :initial_velocity
|
131
|
-
delegate :to_tex, :to_gnu, to: :sum
|
132
123
|
|
133
124
|
private
|
134
125
|
|
135
|
-
def
|
136
|
-
@
|
126
|
+
def function_block
|
127
|
+
@function_block ||= sum(parcels)
|
137
128
|
end
|
138
129
|
|
139
130
|
def parcels
|
@@ -145,15 +136,15 @@ module Danica
|
|
145
136
|
end
|
146
137
|
|
147
138
|
def spatial_velocity
|
148
|
-
|
139
|
+
product(initial_velocity, time)
|
149
140
|
end
|
150
141
|
|
151
142
|
def spatial_acceleration
|
152
|
-
|
143
|
+
division(product(acceleration, time_squared), 2)
|
153
144
|
end
|
154
145
|
|
155
146
|
def time_squared
|
156
|
-
|
147
|
+
power(time, 2)
|
157
148
|
end
|
158
149
|
end
|
159
150
|
end
|
@@ -173,7 +164,7 @@ fx.to_tex
|
|
173
164
|
|
174
165
|
returns
|
175
166
|
```string
|
176
|
-
S_0 + V_0 \cdot t + \frac{a \cdot t^2}{2}
|
167
|
+
S_0 + V_0 \cdot t + \frac{a \cdot t^{2}}{2}
|
177
168
|
```
|
178
169
|
|
179
170
|
##### to_gnu
|
@@ -183,7 +174,7 @@ fx.to_gnu
|
|
183
174
|
|
184
175
|
returns
|
185
176
|
```string
|
186
|
-
S0 + V0 * t + a * t**2/2
|
177
|
+
S0 + V0 * t + (a * t**(2))/(2)
|
187
178
|
```
|
188
179
|
|
189
180
|
##### calculate / to_f
|
data/lib/danica.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'active_model'
|
2
2
|
|
3
3
|
module Danica
|
4
|
+
autoload :Builder, 'danica/builder'
|
4
5
|
autoload :BaseOperations, 'danica/base_operations'
|
5
6
|
autoload :VariablesHolder, 'danica/variables_holder'
|
6
7
|
autoload :Common, 'danica/common'
|
@@ -22,6 +23,15 @@ module Danica
|
|
22
23
|
autoload :Exponential, 'danica/exponential'
|
23
24
|
autoload :Sin, 'danica/sin'
|
24
25
|
autoload :Cos, 'danica/cos'
|
26
|
+
autoload :DSL, 'danica/dsl'
|
27
|
+
|
28
|
+
class << self
|
29
|
+
delegate :build, to: :builder
|
30
|
+
|
31
|
+
def builder
|
32
|
+
@builder ||= Builder.new
|
33
|
+
end
|
34
|
+
end
|
25
35
|
|
26
36
|
E = Constant.new(Math::E, :e, 'exp(1)')
|
27
37
|
PI = Constant.new(Math::PI, '\pi', :pi)
|
data/lib/danica/dsl.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module Danica
|
2
|
+
module DSL
|
3
|
+
def self.register(method, clazz=nil)
|
4
|
+
define_method method do |*args|
|
5
|
+
clazz = "Danica::#{method.to_s.camelize}".constantize unless clazz
|
6
|
+
clazz.new(*args)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def function(*variables, &block)
|
11
|
+
Function.build(*variables, &block).new
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
%i(
|
16
|
+
sum product division sin cos power number
|
17
|
+
squared_root exponential group negative
|
18
|
+
).each do |method|
|
19
|
+
DSL.register(method)
|
20
|
+
end
|
21
|
+
end
|
data/lib/danica/function.rb
CHANGED
@@ -3,12 +3,13 @@ module Danica
|
|
3
3
|
include Common
|
4
4
|
include VariablesHolder
|
5
5
|
include ActiveModel::Model
|
6
|
+
include DSL
|
6
7
|
|
7
8
|
attr_accessor :name
|
8
9
|
|
9
10
|
default_value :priority, 3
|
10
11
|
default_value :is_grouped?, false
|
11
|
-
delegate :to_f, :to_tex, :to_gnu, to: :
|
12
|
+
delegate :to_f, :to_tex, :to_gnu, to: :function_block
|
12
13
|
|
13
14
|
def self.build(*vars, &block)
|
14
15
|
Class.new(self) do
|
@@ -16,8 +17,8 @@ module Danica
|
|
16
17
|
|
17
18
|
private
|
18
19
|
|
19
|
-
define_method :
|
20
|
-
@
|
20
|
+
define_method :function_block do
|
21
|
+
@function_block ||= instance_eval(&block) if block
|
21
22
|
end
|
22
23
|
end
|
23
24
|
end
|
data/lib/danica/operator.rb
CHANGED
data/lib/danica/version.rb
CHANGED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
shared_context 'a class with alias to a clazz' do |aliaz, clazz, *variables|
|
4
|
+
it do
|
5
|
+
expect(subject).to respond_to(aliaz)
|
6
|
+
end
|
7
|
+
|
8
|
+
it "has an alias #{aliaz} for #{clazz}" do
|
9
|
+
expect(subject.public_send(aliaz, *variables)).to eq(clazz.new(*variables))
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
shared_context 'a class with mapped dsl' do
|
14
|
+
{
|
15
|
+
sum: Danica::Sum,
|
16
|
+
product: Danica::Product,
|
17
|
+
division: Danica::Division,
|
18
|
+
sin: Danica::Sin,
|
19
|
+
cos: Danica::Cos,
|
20
|
+
power: Danica::Power
|
21
|
+
}.each do |aliaz, clazz|
|
22
|
+
it_behaves_like 'a class with alias to a clazz', aliaz, clazz, 2, 3
|
23
|
+
end
|
24
|
+
{
|
25
|
+
squared_root: Danica::SquaredRoot,
|
26
|
+
exponential: Danica::Exponential,
|
27
|
+
group: Danica::Group,
|
28
|
+
negative: Danica::Negative,
|
29
|
+
number: Danica::Number
|
30
|
+
}.each do |aliaz, clazz|
|
31
|
+
it_behaves_like 'a class with alias to a clazz', aliaz, clazz, 9
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe Danica::DSL do
|
36
|
+
class Danica::DSL::Dummy
|
37
|
+
include Danica::DSL
|
38
|
+
end
|
39
|
+
|
40
|
+
let(:subject) { described_class::Dummy.new }
|
41
|
+
it_behaves_like 'a class with mapped dsl'
|
42
|
+
end
|
@@ -33,6 +33,16 @@ describe Danica::Function do
|
|
33
33
|
it 'returns a function thtat knows how to calculate' do
|
34
34
|
expect(function.calculate(x: 2, y: 3)).to eq(8)
|
35
35
|
end
|
36
|
+
|
37
|
+
context 'when no block is given' do
|
38
|
+
let(:function_class) do
|
39
|
+
described_class.build(*variables)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'returns a function class' do
|
43
|
+
expect(function_class.superclass).to eq(described_class)
|
44
|
+
end
|
45
|
+
end
|
36
46
|
end
|
37
47
|
|
38
48
|
describe 'spatial' do
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Danica do
|
4
|
+
describe '.build' do
|
5
|
+
let(:result) { described_class.build(&block) }
|
6
|
+
|
7
|
+
context 'when creating a sum' do
|
8
|
+
let(:block) do
|
9
|
+
proc { sum(1, 2) }
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'returns the expected sum' do
|
13
|
+
expect(result).to eq(Danica::Sum.new(1,2))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'when creating a power of sum and product' do
|
18
|
+
let(:block) do
|
19
|
+
proc { power(sum(1, 2), product(2,3)) }
|
20
|
+
end
|
21
|
+
let(:expected) do
|
22
|
+
Danica::Power.new(
|
23
|
+
Danica::Sum.new(1, 2),
|
24
|
+
Danica::Product.new(2, 3)
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'returns the expected power' do
|
29
|
+
expect(result).to eq(expected)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when defining a function' do
|
34
|
+
let(:block) do
|
35
|
+
proc do
|
36
|
+
function(:x) do
|
37
|
+
power(x, 2)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
let(:function) do
|
42
|
+
Danica::Function.build(:x) do
|
43
|
+
Danica::Power.new(x, 2)
|
44
|
+
end.new
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'returns the expected function with variables' do
|
48
|
+
expect(result.variables_hash).to eq(function.variables_hash)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'returns the expected function with block' do
|
52
|
+
expect(result.to_tex).to eq(function.to_tex)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
@@ -4,20 +4,20 @@ module Danica
|
|
4
4
|
|
5
5
|
private
|
6
6
|
|
7
|
-
def
|
8
|
-
@
|
7
|
+
def function_block
|
8
|
+
@function_block ||= numerator / denominator
|
9
9
|
end
|
10
10
|
|
11
11
|
def numerator
|
12
|
-
|
12
|
+
negative(b) + PositiveNegative.new(squared_root(delta))
|
13
13
|
end
|
14
14
|
|
15
15
|
def denominator
|
16
|
-
|
16
|
+
number(2) * a
|
17
17
|
end
|
18
18
|
|
19
19
|
def delta
|
20
|
-
|
20
|
+
power(b, 2) - product(4, a, c)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -4,36 +4,36 @@ module Danica
|
|
4
4
|
|
5
5
|
private
|
6
6
|
|
7
|
-
def
|
8
|
-
@
|
7
|
+
def function_block
|
8
|
+
@function_block ||= product(parcels)
|
9
9
|
end
|
10
10
|
|
11
11
|
def parcels
|
12
12
|
[
|
13
|
-
|
14
|
-
|
13
|
+
division(1, denominator),
|
14
|
+
exponential(exp)
|
15
15
|
]
|
16
16
|
end
|
17
17
|
|
18
18
|
def denominator
|
19
|
-
|
20
|
-
|
19
|
+
squared_root(
|
20
|
+
product(2, PI, variance),
|
21
21
|
)
|
22
22
|
end
|
23
23
|
|
24
|
-
def
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
24
|
+
def exp
|
25
|
+
negative(
|
26
|
+
division(
|
27
|
+
power(group(
|
28
|
+
sum(x, negative(median))
|
29
29
|
), 2),
|
30
|
-
|
30
|
+
product(2, variance)
|
31
31
|
)
|
32
32
|
)
|
33
33
|
end
|
34
34
|
|
35
35
|
def variance
|
36
|
-
@variance ||=
|
36
|
+
@variance ||= power(variance_root, 2)
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
@@ -4,8 +4,8 @@ module Danica
|
|
4
4
|
|
5
5
|
private
|
6
6
|
|
7
|
-
def
|
8
|
-
@
|
7
|
+
def function_block
|
8
|
+
@function_block ||= sum(parcels)
|
9
9
|
end
|
10
10
|
|
11
11
|
def parcels
|
@@ -17,15 +17,15 @@ module Danica
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def spatial_velocity
|
20
|
-
|
20
|
+
product(initial_velocity, time)
|
21
21
|
end
|
22
22
|
|
23
23
|
def spatial_acceleration
|
24
|
-
|
24
|
+
division(product(acceleration, time_squared), 2)
|
25
25
|
end
|
26
26
|
|
27
27
|
def time_squared
|
28
|
-
|
28
|
+
power(time, 2)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: danica
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Darthjee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-10-
|
11
|
+
date: 2017-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -153,10 +153,12 @@ files:
|
|
153
153
|
- docker-compose.yml
|
154
154
|
- lib/danica.rb
|
155
155
|
- lib/danica/base_operations.rb
|
156
|
+
- lib/danica/builder.rb
|
156
157
|
- lib/danica/common.rb
|
157
158
|
- lib/danica/constant.rb
|
158
159
|
- lib/danica/cos.rb
|
159
160
|
- lib/danica/division.rb
|
161
|
+
- lib/danica/dsl.rb
|
160
162
|
- lib/danica/exception.rb
|
161
163
|
- lib/danica/exception/not_defined.rb
|
162
164
|
- lib/danica/exponential.rb
|
@@ -184,6 +186,7 @@ files:
|
|
184
186
|
- spec/lib/danica/constant_spec.rb
|
185
187
|
- spec/lib/danica/cos_spec.rb
|
186
188
|
- spec/lib/danica/division_spec.rb
|
189
|
+
- spec/lib/danica/dsl_spec.rb
|
187
190
|
- spec/lib/danica/exponential_spec.rb
|
188
191
|
- spec/lib/danica/function_spec.rb
|
189
192
|
- spec/lib/danica/negative_spec.rb
|
@@ -195,6 +198,7 @@ files:
|
|
195
198
|
- spec/lib/danica/squared_root_spec.rb
|
196
199
|
- spec/lib/danica/sum_spec.rb
|
197
200
|
- spec/lib/danica/variable_spec.rb
|
201
|
+
- spec/lib/danica_spec.rb
|
198
202
|
- spec/spec_helper.rb
|
199
203
|
- spec/support/models/functions/baskara.rb
|
200
204
|
- spec/support/models/functions/gauss.rb
|
@@ -238,6 +242,7 @@ test_files:
|
|
238
242
|
- spec/lib/danica/constant_spec.rb
|
239
243
|
- spec/lib/danica/cos_spec.rb
|
240
244
|
- spec/lib/danica/division_spec.rb
|
245
|
+
- spec/lib/danica/dsl_spec.rb
|
241
246
|
- spec/lib/danica/exponential_spec.rb
|
242
247
|
- spec/lib/danica/function_spec.rb
|
243
248
|
- spec/lib/danica/negative_spec.rb
|
@@ -249,6 +254,7 @@ test_files:
|
|
249
254
|
- spec/lib/danica/squared_root_spec.rb
|
250
255
|
- spec/lib/danica/sum_spec.rb
|
251
256
|
- spec/lib/danica/variable_spec.rb
|
257
|
+
- spec/lib/danica_spec.rb
|
252
258
|
- spec/spec_helper.rb
|
253
259
|
- spec/support/models/functions/baskara.rb
|
254
260
|
- spec/support/models/functions/gauss.rb
|