danica 2.2.1 → 2.3.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 +39 -15
- data/lib/danica.rb +3 -18
- data/lib/danica/base_operations.rb +6 -6
- data/lib/danica/common.rb +7 -5
- data/lib/danica/dsl.rb +21 -5
- data/lib/danica/exception.rb +1 -1
- data/lib/danica/operator.rb +11 -0
- data/lib/danica/{sum.rb → operator/addition.rb} +2 -4
- data/lib/danica/operator/cos.rb +5 -0
- data/lib/danica/{division.rb → operator/division.rb} +1 -1
- data/lib/danica/operator/exponential.rb +5 -0
- data/lib/danica/operator/functional.rb +29 -0
- data/lib/danica/{product.rb → operator/multiplication.rb} +1 -3
- data/lib/danica/{power.rb → operator/power.rb} +1 -1
- data/lib/danica/operator/sin.rb +5 -0
- data/lib/danica/operator/squared_root.rb +5 -0
- data/lib/danica/variables_holder/variables_builder.rb +0 -2
- data/lib/danica/version.rb +1 -1
- data/lib/danica/wrapper.rb +10 -0
- data/lib/danica/{constant.rb → wrapper/constant.rb} +4 -1
- data/lib/danica/{group.rb → wrapper/group.rb} +2 -1
- data/lib/danica/{negative.rb → wrapper/negative.rb} +1 -1
- data/lib/danica/{number.rb → wrapper/number.rb} +1 -1
- data/lib/danica/{positive_negative.rb → wrapper/plus_minus.rb} +1 -1
- data/lib/danica/{variable.rb → wrapper/variable.rb} +3 -3
- data/spec/integration/negative_spec.rb +3 -3
- data/spec/integration/positive_negative_spec.rb +3 -3
- data/spec/integration/power_spec.rb +4 -4
- data/spec/integration/product_spec.rb +8 -8
- data/spec/integration/sum_spec.rb +5 -5
- data/spec/lib/danica/dsl_spec.rb +14 -11
- data/spec/lib/danica/function_spec.rb +8 -8
- data/spec/lib/danica/{sum_spec.rb → operator/addition_spec.rb} +3 -3
- data/spec/lib/danica/{cos_spec.rb → operator/cos_spec.rb} +1 -1
- data/spec/lib/danica/{division_spec.rb → operator/division_spec.rb} +6 -6
- data/spec/lib/danica/{exponential_spec.rb → operator/exponential_spec.rb} +1 -1
- data/spec/lib/danica/{product_spec.rb → operator/multiplication_spec.rb} +3 -3
- data/spec/lib/danica/{power_spec.rb → operator/power_spec.rb} +1 -1
- data/spec/lib/danica/{sin_spec.rb → operator/sin_spec.rb} +1 -1
- data/spec/lib/danica/{squared_root_spec.rb → operator/squared_root_spec.rb} +1 -1
- data/spec/lib/danica/{constant_spec.rb → wrapper/constant_spec.rb} +1 -1
- data/spec/lib/danica/wrapper/group_spec.rb +53 -0
- data/spec/lib/danica/{negative_spec.rb → wrapper/negative_spec.rb} +2 -2
- data/spec/lib/danica/{number_spec.rb → wrapper/number_spec.rb} +1 -1
- data/spec/lib/danica/{positive_negative_spec.rb → wrapper/plus_minus_spec.rb} +2 -2
- data/spec/lib/danica/{variable_spec.rb → wrapper/variable_spec.rb} +1 -1
- data/spec/lib/danica_spec.rb +10 -10
- data/spec/support/models/functions/baskara.rb +2 -2
- data/spec/support/models/functions/gauss.rb +4 -4
- data/spec/support/models/functions/spatial.rb +3 -3
- data/spec/support/shared_examples/base_operations.rb +10 -10
- data/spec/support/shared_examples/operator/chained.rb +1 -1
- metadata +46 -43
- data/lib/danica/cos.rb +0 -20
- data/lib/danica/exception/not_defined.rb +0 -2
- data/lib/danica/exponential.rb +0 -20
- data/lib/danica/sin.rb +0 -19
- data/lib/danica/squared_root.rb +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad28c3d7ea149780e400d116c83de57d427766fd
|
4
|
+
data.tar.gz: 03df4bd255f7bd7f3ea1574ff3d762ee79ebcbb5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d5df83e1861e86792509782fe1c79767ee032d93dfe5b50a353f38960e2897ff1740cfe0876bb958fc1e23a82eb7959df35f3237aa14bff19964755b9953a99
|
7
|
+
data.tar.gz: 239199aeb9ee44347f4721cb65b336926c9f38fef5678c384411c48bcbc57a41426d08aebebe896fbbb11abff5ac6764d8fed5927c58752a3693b5338a2ded6f
|
data/README.md
CHANGED
@@ -17,6 +17,30 @@ bundle install danica
|
|
17
17
|
|
18
18
|
Now you can use in your project
|
19
19
|
|
20
|
+
###Quick Use
|
21
|
+
Use Danica build to build and use your formula using ```Danica.build```
|
22
|
+
```ruby
|
23
|
+
formula = Danica.build do
|
24
|
+
(number(1) + 2) * power(3,4)
|
25
|
+
end
|
26
|
+
|
27
|
+
formula.to_tex
|
28
|
+
```
|
29
|
+
|
30
|
+
create and use functions
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
func = Danica.build do
|
34
|
+
formula(:x, :y) do
|
35
|
+
(number(1) + x) * power(3, y)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
func.to_gnu
|
40
|
+
```
|
41
|
+
|
42
|
+
create gnu or tex output strings to be used on yopur template
|
43
|
+
|
20
44
|
### Operators
|
21
45
|
Operators are much like function, but they do not have a name.
|
22
46
|
|
@@ -43,7 +67,7 @@ end
|
|
43
67
|
|
44
68
|
#### Sample
|
45
69
|
```ruby
|
46
|
-
class Danica::Inverse < Danica::Operator
|
70
|
+
class Danica::Operator::Inverse < Danica::Operator
|
47
71
|
|
48
72
|
variables :value
|
49
73
|
|
@@ -60,7 +84,7 @@ class Danica::Inverse < Danica::Operator
|
|
60
84
|
end
|
61
85
|
end
|
62
86
|
|
63
|
-
fx = Danica::Inverse.new(:x)
|
87
|
+
fx = Danica::Operator::Inverse.new(:x)
|
64
88
|
```
|
65
89
|
|
66
90
|
##### to_tex
|
@@ -89,7 +113,7 @@ fx.calculate(2)
|
|
89
113
|
```
|
90
114
|
or
|
91
115
|
```ruby
|
92
|
-
Danica::Inverse.new(2).to_f
|
116
|
+
Danica::Operator::Inverse.new(2).to_f
|
93
117
|
```
|
94
118
|
|
95
119
|
both return
|
@@ -124,7 +148,7 @@ module Danica
|
|
124
148
|
private
|
125
149
|
|
126
150
|
def function_block
|
127
|
-
@function_block ||=
|
151
|
+
@function_block ||= addition(parcels)
|
128
152
|
end
|
129
153
|
|
130
154
|
def parcels
|
@@ -136,11 +160,11 @@ module Danica
|
|
136
160
|
end
|
137
161
|
|
138
162
|
def spatial_velocity
|
139
|
-
|
163
|
+
multiplication(initial_velocity, time)
|
140
164
|
end
|
141
165
|
|
142
166
|
def spatial_acceleration
|
143
|
-
division(
|
167
|
+
division(multiplication(acceleration, time_squared), 2)
|
144
168
|
end
|
145
169
|
|
146
170
|
def time_squared
|
@@ -253,19 +277,19 @@ Danica.build do
|
|
253
277
|
end
|
254
278
|
```
|
255
279
|
|
256
|
-
will result into a ```Danica::Power``` object
|
280
|
+
will result into a ```Danica::Operator::Power``` object
|
257
281
|
|
258
282
|
```ruby
|
259
|
-
Danica::Power.new(:x, -1)
|
283
|
+
Danica::Operator::Power.new(:x, -1)
|
260
284
|
```
|
261
285
|
|
262
286
|
#### Operator registering on DSL
|
263
287
|
|
264
|
-
Any operator created can be added to the DSL by running ```DSL.
|
288
|
+
Any operator created can be added to the DSL by running ```DSL.register_operator```
|
265
289
|
|
266
290
|
```ruby
|
267
291
|
module Danica
|
268
|
-
class Inverse < Danica::Operator
|
292
|
+
class Operator::Inverse < Danica::Operator
|
269
293
|
include DSL
|
270
294
|
variables :value
|
271
295
|
|
@@ -278,16 +302,16 @@ module Danica
|
|
278
302
|
end
|
279
303
|
```
|
280
304
|
|
281
|
-
In order to add the new operator, DSL cna infer by the name ```inverse``` which results in ```Danica::Inverse```
|
305
|
+
In order to add the new operator, DSL cna infer by the name ```inverse``` which results in ```Danica::Operator::Inverse```
|
282
306
|
|
283
307
|
```ruby
|
284
|
-
Danica::DSL.
|
308
|
+
Danica::DSL.register_operator(:inverse)
|
285
309
|
```
|
286
310
|
|
287
311
|
or
|
288
312
|
|
289
313
|
```ruby
|
290
|
-
Danica::DSL.register(:inverse, Danica::
|
314
|
+
Danica::DSL.register(:inverse, Danica::Operator::Inverse)
|
291
315
|
```
|
292
316
|
|
293
317
|
This will allow the usage of the inverse function
|
@@ -298,8 +322,8 @@ Danica.build do
|
|
298
322
|
end
|
299
323
|
```
|
300
324
|
|
301
|
-
will result into a ```Danica::Inverse``` object
|
325
|
+
will result into a ```Danica::Operator::Inverse``` object
|
302
326
|
|
303
327
|
```ruby
|
304
|
-
Danica::Inverse.new(:x)
|
328
|
+
Danica::Operator::Inverse.new(:x)
|
305
329
|
```
|
data/lib/danica.rb
CHANGED
@@ -1,29 +1,17 @@
|
|
1
1
|
require 'active_model'
|
2
|
+
require 'darthjee/core_ext'
|
2
3
|
|
3
4
|
module Danica
|
4
5
|
autoload :Builder, 'danica/builder'
|
5
6
|
autoload :BaseOperations, 'danica/base_operations'
|
6
7
|
autoload :VariablesHolder, 'danica/variables_holder'
|
7
8
|
autoload :Common, 'danica/common'
|
8
|
-
autoload :Number, 'danica/number'
|
9
|
-
autoload :Negative, 'danica/negative'
|
10
|
-
autoload :PositiveNegative, 'danica/positive_negative'
|
11
|
-
autoload :Group, 'danica/group'
|
12
|
-
autoload :Variable, 'danica/variable'
|
13
|
-
autoload :Operator, 'danica/operator'
|
14
9
|
autoload :Function, 'danica/function'
|
15
10
|
autoload :Exception, 'danica/exception'
|
16
|
-
autoload :Constant, 'danica/constant'
|
17
11
|
|
18
|
-
autoload :Product, 'danica/product'
|
19
|
-
autoload :Sum, 'danica/sum'
|
20
|
-
autoload :Division, 'danica/division'
|
21
|
-
autoload :Power, 'danica/power'
|
22
|
-
autoload :SquaredRoot, 'danica/squared_root'
|
23
|
-
autoload :Exponential, 'danica/exponential'
|
24
|
-
autoload :Sin, 'danica/sin'
|
25
|
-
autoload :Cos, 'danica/cos'
|
26
12
|
autoload :DSL, 'danica/dsl'
|
13
|
+
autoload :Wrapper, 'danica/wrapper'
|
14
|
+
autoload :Operator, 'danica/operator'
|
27
15
|
|
28
16
|
class << self
|
29
17
|
delegate :build, to: :builder
|
@@ -32,8 +20,5 @@ module Danica
|
|
32
20
|
@builder ||= Builder.new
|
33
21
|
end
|
34
22
|
end
|
35
|
-
|
36
|
-
E = Constant.new(Math::E, :e, 'exp(1)')
|
37
|
-
PI = Constant.new(Math::PI, '\pi', :pi)
|
38
23
|
end
|
39
24
|
|
@@ -1,21 +1,21 @@
|
|
1
1
|
module Danica
|
2
2
|
module BaseOperations
|
3
3
|
def +(other)
|
4
|
-
return other + self if other.is_a?(
|
5
|
-
|
4
|
+
return other + self if other.is_a?(Operator::Addition)
|
5
|
+
addition(self, other)
|
6
6
|
end
|
7
7
|
|
8
8
|
def *(other)
|
9
|
-
return other * self if other.is_a?(
|
10
|
-
|
9
|
+
return other * self if other.is_a?(Operator::Multiplication)
|
10
|
+
multiplication(self, other)
|
11
11
|
end
|
12
12
|
|
13
13
|
def /(other)
|
14
|
-
|
14
|
+
division(self, other)
|
15
15
|
end
|
16
16
|
|
17
17
|
def -(other)
|
18
|
-
self +
|
18
|
+
self + negative(other)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
data/lib/danica/common.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module Danica
|
2
2
|
module Common extend ::ActiveSupport::Concern
|
3
3
|
included do
|
4
|
+
include DSL
|
5
|
+
|
4
6
|
class << self
|
5
7
|
def default_value(name, value)
|
6
8
|
define_method(name) { value }
|
@@ -21,16 +23,16 @@ module Danica
|
|
21
23
|
private
|
22
24
|
|
23
25
|
def wrap_value(value)
|
24
|
-
return wrap_value(
|
25
|
-
return wrap_value(
|
26
|
-
return wrap_value(
|
27
|
-
return wrap_value(
|
26
|
+
return wrap_value(number(value)) if value.is_a?(Numeric)
|
27
|
+
return wrap_value(variable(value)) if value.is_a?(Hash)
|
28
|
+
return wrap_value(variable(name: value)) if [ String, Symbol ].any? { |c| value.is_a?(c) }
|
29
|
+
return wrap_value(variable) if value.nil?
|
28
30
|
value
|
29
31
|
end
|
30
32
|
|
31
33
|
def wrap_as_group(value)
|
32
34
|
return value if is_grouped? || value.priority >= priority
|
33
|
-
|
35
|
+
group(value)
|
34
36
|
end
|
35
37
|
end
|
36
38
|
end
|
data/lib/danica/dsl.rb
CHANGED
@@ -1,8 +1,17 @@
|
|
1
1
|
module Danica
|
2
2
|
module DSL
|
3
|
-
def self.
|
3
|
+
def self.register_operator(method, clazz=nil)
|
4
|
+
register(method, clazz, 'Danica::Operator')
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.register_wrapper(method, clazz=nil)
|
8
|
+
register(method, clazz, 'Danica::Wrapper')
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.register(method, clazz=nil, base=nil)
|
4
12
|
define_method method do |*args|
|
5
|
-
clazz =
|
13
|
+
clazz = [base.to_s, method.to_s.camelize].compact.join('::').constantize unless clazz
|
14
|
+
clazz = [base, clazz.to_s].compact.join('::').constantize unless clazz.is_a? Class
|
6
15
|
clazz.new(*args)
|
7
16
|
end
|
8
17
|
end
|
@@ -13,9 +22,16 @@ module Danica
|
|
13
22
|
end
|
14
23
|
|
15
24
|
%i(
|
16
|
-
|
17
|
-
squared_root exponential
|
25
|
+
addition multiplication division sin cos power
|
26
|
+
squared_root exponential
|
18
27
|
).each do |method|
|
19
|
-
DSL.
|
28
|
+
DSL.register_operator(method)
|
20
29
|
end
|
30
|
+
|
31
|
+
%i(number group negative plus_minus variable).each do |method|
|
32
|
+
DSL.register_wrapper(method)
|
33
|
+
end
|
34
|
+
|
35
|
+
DSL.register_operator :sum, :Addition
|
36
|
+
DSL.register_operator :product, :Multiplication
|
21
37
|
end
|
data/lib/danica/exception.rb
CHANGED
data/lib/danica/operator.rb
CHANGED
@@ -16,5 +16,16 @@ module Danica
|
|
16
16
|
return false unless other.class == self.class
|
17
17
|
variables == other.variables
|
18
18
|
end
|
19
|
+
|
20
|
+
autoload :Functional, 'danica/operator/functional'
|
21
|
+
autoload :Chained, 'danica/operator/chained'
|
22
|
+
autoload :Multiplication, 'danica/operator/multiplication'
|
23
|
+
autoload :Addition, 'danica/operator/addition'
|
24
|
+
autoload :Division, 'danica/operator/division'
|
25
|
+
autoload :Power, 'danica/operator/power'
|
26
|
+
autoload :Cos, 'danica/operator/cos'
|
27
|
+
autoload :Sin, 'danica/operator/sin'
|
28
|
+
autoload :SquaredRoot, 'danica/operator/squared_root'
|
29
|
+
autoload :Exponential, 'danica/operator/exponential'
|
19
30
|
end
|
20
31
|
end
|
@@ -1,7 +1,5 @@
|
|
1
|
-
require 'danica/operator/chained'
|
2
|
-
|
3
1
|
module Danica
|
4
|
-
class
|
2
|
+
class Operator::Addition < Operator::Chained
|
5
3
|
default_value :priority, 1
|
6
4
|
|
7
5
|
def +(other)
|
@@ -22,7 +20,7 @@ module Danica
|
|
22
20
|
|
23
21
|
def join_proc(symbol)
|
24
22
|
proc do |_, value|
|
25
|
-
value.is_a?(Negative) || value.is_a?(
|
23
|
+
value.is_a?(Wrapper::Negative) || value.is_a?(Wrapper::PlusMinus) ? ' ' : " #{symbol} "
|
26
24
|
end
|
27
25
|
end
|
28
26
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Danica
|
2
|
+
class Operator::Functional < Operator
|
3
|
+
variables :value
|
4
|
+
default_value :is_grouped?, true
|
5
|
+
|
6
|
+
def self.build(operator:, text: nil, tex: nil, gnu: nil)
|
7
|
+
text = "#{operator}(:value:)" if text.nil?
|
8
|
+
tex = text if tex.nil?
|
9
|
+
gnu = text if gnu.nil?
|
10
|
+
|
11
|
+
Class.new(self) do
|
12
|
+
module_eval(%Q(
|
13
|
+
def to_f
|
14
|
+
Math.#{operator}(value.to_f)
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_tex
|
18
|
+
'#{tex.gsub(':value:', "' + value.to_tex + '")}'
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_gnu
|
22
|
+
'#{gnu.gsub(':value:', "' + value.to_gnu + '")}'
|
23
|
+
end
|
24
|
+
))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
data/lib/danica/version.rb
CHANGED
@@ -0,0 +1,10 @@
|
|
1
|
+
module Danica
|
2
|
+
module Wrapper
|
3
|
+
autoload :Number, 'danica/wrapper/number'
|
4
|
+
autoload :Group, 'danica/wrapper/group'
|
5
|
+
autoload :Negative, 'danica/wrapper/negative'
|
6
|
+
autoload :PlusMinus, 'danica/wrapper/plus_minus'
|
7
|
+
autoload :Constant, 'danica/wrapper/constant'
|
8
|
+
autoload :Variable, 'danica/wrapper/variable'
|
9
|
+
end
|
10
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Danica
|
2
|
-
class Constant
|
2
|
+
class Wrapper::Constant
|
3
3
|
include BaseOperations
|
4
4
|
include Common
|
5
5
|
|
@@ -32,5 +32,8 @@ module Danica
|
|
32
32
|
gnu.to_s
|
33
33
|
end
|
34
34
|
end
|
35
|
+
|
36
|
+
E = Wrapper::Constant.new(Math::E, :e, 'exp(1)')
|
37
|
+
PI = Wrapper::Constant.new(Math::PI, '\pi', :pi)
|
35
38
|
end
|
36
39
|
|