danica 2.6.1 → 2.6.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a6ab0d9ea017c75592538650e87321f8223d1ae8
4
- data.tar.gz: 5ad1639d117735e732418131973c42a18f0c90fd
3
+ metadata.gz: d736e0ee01a6528dec7f12896f5c1338e00d51d6
4
+ data.tar.gz: ca775b26d49286a0822f90c8a75568da819deac2
5
5
  SHA512:
6
- metadata.gz: 252bf663163b2229951c1d1dcc5c261b48f7a6bd737d484036b08a052f0c9b68fb9efd973fa3e11acc07ba78e83e6b1a3a5e699197a6c0359f90a180f7b6daad
7
- data.tar.gz: cb75b81a3d39061fe4eaaaceafbcd8d9ba103ff746f98022d80c7fc8434276a94f347d031d49048d4df75ff39218f0916f3626c27c1c9984d9aee28a9fc20280
6
+ metadata.gz: 599da1c0739706613bf7b9b67fe6915ed08faa9229003f35742a8f6dbcd9a0e033fe11ce6d2c66022aeb21d6b47c5d16ff1a8a03a1964d8be854860403b7b82d
7
+ data.tar.gz: 3de9269044e1ed521210f137d95bf283d2ee9809de5b8db38ccd062e5c4e7eb404649fcf4bd6ff75c5ff11a1902af341fbbff8331ca01145dfe37ea19d90812e
data/README.md CHANGED
@@ -341,7 +341,6 @@ returns
341
341
  ```gnuplot
342
342
  x**(2) -y**(2)
343
343
  ```
344
-
345
344
  ### DSL and building
346
345
  An expression can be created using the DSL direct from ```Danica```
347
346
 
@@ -357,7 +356,7 @@ will result into a ```Danica::Operator::Power``` wrapped into an ```Danica::Expr
357
356
  Danica::Operator::Power.new(:x, -1)
358
357
  ```
359
358
 
360
- #### Operator registering on DSL
359
+ #### Operator registration on DSL
361
360
 
362
361
  Any operator created can be added to the DSL by running ```DSL.register_operator```
363
362
 
@@ -401,3 +400,156 @@ will result into a ```Danica::Operator::Inverse``` object
401
400
  ```ruby
402
401
  Danica::Operator::Inverse.new(:x)
403
402
  ```
403
+
404
+ ### Variables
405
+ Variables are instances of ```Danica::Wrapper::Variable``` having the optional attributes
406
+ ```name```, ```gnu``` , ```latex``` and ```value```
407
+
408
+ The initialization of the variable can be made through the class, DSL or when initializing an operator
409
+
410
+ ```ruby
411
+ Danica::Wrapper::Variable.new(:x)
412
+ ```
413
+
414
+ ```ruby
415
+ Danica::Wrapper::Variable.new(name: :x)
416
+ ```
417
+
418
+ ```ruby
419
+ Danica::DSL.build do
420
+ variable(:x)
421
+ end
422
+ ```
423
+
424
+ all will create the same variable that can be coverted ```#to_tex```
425
+
426
+ ```string
427
+ x
428
+ ```
429
+
430
+ When using it with function, operators or other ```Danica::Common``` objects, the variables are wrapped
431
+ automatically
432
+
433
+ ```ruby
434
+ Danica::DSL.build do
435
+ power(:x, { name: :y }) + :z
436
+ end
437
+ ```
438
+
439
+ will result in
440
+
441
+ ```ruby
442
+ Danica::Operator::Addition.new(
443
+ Danica::Operator::Power.new(
444
+ Danica::Wrapper::Variable.new(:x),
445
+ Danica::Wrapper::Variable.new(:y)
446
+ ),
447
+ Danica::Wrapper::Variable.new(:z)
448
+ )
449
+ ```
450
+
451
+ Variables can also behave differently when converting to tex or gnu
452
+
453
+ ```ruby
454
+ Danica::DSL.build do
455
+ variable(name: :frequency, latex: '\lambda', gnu: :f)
456
+ end
457
+ ```
458
+ would produce different ```#to_tex``` and ```#to_gnu``` results (```\lambda``` and ```f``` respectvly)
459
+
460
+ Also, valued variables will always use their value on string representation
461
+
462
+ ```ruby
463
+ Danica::DSL.build do
464
+ variable(name: :frequency, latex: '\lambda', gnu: :f, value: 2)
465
+ end
466
+ ```
467
+
468
+ will always return ```2``` for both ```to(:tex)``` and ```to(:gnu)``` calls
469
+
470
+ #### #to_f
471
+
472
+ Variables can be used to calculate the value of an expression by usage of the value attribute
473
+
474
+ ```ruby
475
+ Danica::DSL.build do
476
+ variable(name: :x, value: 2)
477
+ end
478
+ ```
479
+
480
+ with will respond to ```#tot_f``` as ```2```
481
+
482
+ It can be used when calculating an expression later
483
+
484
+ ```ruby
485
+ x = Danica::DSL.build do
486
+ variable(:x)
487
+ end
488
+
489
+ p = Danica::DSL.build do
490
+ power(x, 2)
491
+ end
492
+
493
+ x.value = 4
494
+ p.to_f
495
+ ```
496
+
497
+ which will return ```16```
498
+
499
+ ### Number
500
+ Numberss are simple wrappers using ```Danica::Wrapper::Number```
501
+
502
+ they can be initialized explicitly, through the DSL or whenever an operation is made with other ```Danica``` objects
503
+
504
+ ```ruby
505
+ Danica::Wrapper::Number.new(3)
506
+ ```
507
+
508
+ ```ruby
509
+ Danica::DSL.build do
510
+ number(3)
511
+ end
512
+ ```
513
+
514
+ will both return the number object that can be used to generate tex, gnu or float outputs (for calculation)
515
+
516
+ Other ways of creating instances of number is when using it as a right side element in basic operations such as sum
517
+ or when using it as the parameter of any other class such as functions and operators
518
+
519
+ ```ruby
520
+ Danica::DSL.build do
521
+ power(:x, 2) + 3
522
+ end
523
+ ```
524
+
525
+ will create
526
+
527
+ ```ruby
528
+ Danica::Operator::Addition.new(
529
+ Danica::Operator::Power.new(
530
+ Danica::Wrapper::Variable.new(:x),
531
+ Danica::Wrapper::Number.new(2)
532
+ ),
533
+ Danica::Wrapper::Number.new(3)
534
+ )
535
+ ```
536
+
537
+ ### Constant
538
+ Constant are pretty much like any other variable, except that they always have value,
539
+ and have a gnu and latex representation.
540
+
541
+ While variables with value have a numeric string representation, constants will always
542
+ be represented by their string attribute
543
+
544
+ ```ruby
545
+ Danica::Wrapper::Constant.new(gnu: 'pi', latex: '\pi', value: 3.141592)
546
+ ```
547
+ which will have the returns of ```#to(format)``` obeying the following
548
+
549
+ ```ruby
550
+ {
551
+ tex: '\pi',
552
+ gnu: 'pi',
553
+ f: 3.141592
554
+ }
555
+ ```
@@ -38,6 +38,8 @@ module Danica
38
38
  to_tex
39
39
  when :gnu
40
40
  to_gnu
41
+ when :f
42
+ to_f
41
43
  else
42
44
  raise Exception::FormatNotFound.new
43
45
  end
@@ -1,18 +1,32 @@
1
1
  module Danica
2
2
  module DSL
3
- def self.register_operator(method, clazz=nil)
4
- register(method, clazz, 'Danica::Operator')
5
- end
3
+ class << self
4
+ def register_operator(method, clazz=nil)
5
+ register(method, clazz, 'Danica::Operator')
6
+ end
6
7
 
7
- def self.register_wrapper(method, clazz=nil)
8
- register(method, clazz, 'Danica::Wrapper')
9
- end
8
+ def register_wrapper(method, clazz=nil)
9
+ register(method, clazz, 'Danica::Wrapper')
10
+ end
11
+
12
+ def register(method, clazz=nil, base=nil)
13
+ define_method method do |*args|
14
+ clazz = [base.to_s, method.to_s.camelize].compact.join('::').constantize unless clazz
15
+ clazz = [base, clazz.to_s].compact.join('::').constantize unless clazz.is_a? Class
16
+ clazz.new(*args)
17
+ end
18
+ end
19
+
20
+ def build(&block)
21
+ builder.instance_eval(&block)
22
+ end
23
+
24
+ private
10
25
 
11
- def self.register(method, clazz=nil, base=nil)
12
- define_method method do |*args|
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
15
- clazz.new(*args)
26
+ def builder
27
+ @builder ||= Class.new do
28
+ include DSL
29
+ end.new
16
30
  end
17
31
  end
18
32
 
@@ -1,3 +1,3 @@
1
1
  module Danica
2
- VERSION = '2.6.1'
2
+ VERSION = '2.6.2'
3
3
  end
@@ -11,7 +11,7 @@ module Danica
11
11
 
12
12
  def initialize(*args)
13
13
  attrs = args.extract_options!
14
- attrs = args.as_hash(%i(value name latex gnu)).merge(attrs)
14
+ attrs = args.as_hash(%i(name value latex gnu)).merge(attrs)
15
15
 
16
16
  attrs.each do |key, value|
17
17
  self.public_send("#{key}=", value)
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe Danica::Wrapper::Number do
4
+ let(:number) do
5
+ Danica::Wrapper::Number.new(3)
6
+ end
7
+
8
+ subject do
9
+ Danica::DSL.build do
10
+ number(3)
11
+ end
12
+ end
13
+
14
+ it do
15
+ expect(subject).to eq(number)
16
+ end
17
+
18
+ describe 'from basic operation' do
19
+ let(:sum) do
20
+ Danica::DSL.build do
21
+ power(:x, 2) + 3
22
+ end
23
+ end
24
+
25
+ let(:expected) do
26
+ Danica::Operator::Addition.new(
27
+ Danica::Operator::Power.new(
28
+ Danica::Wrapper::Variable.new(:x),
29
+ Danica::Wrapper::Number.new(2)
30
+ ),
31
+ Danica::Wrapper::Number.new(3)
32
+ )
33
+ end
34
+
35
+ it do
36
+ expect(sum).to eq(expected)
37
+ end
38
+ end
39
+ end
40
+
@@ -0,0 +1,123 @@
1
+ require 'spec_helper'
2
+
3
+ describe Danica::Wrapper::Variable do
4
+ describe '#to_tex' do
5
+ context 'when initializing with the name' do
6
+ subject do
7
+ Danica::Wrapper::Variable.new(:x)
8
+ end
9
+
10
+ it do
11
+ expect(subject.to_tex).to eq('x')
12
+ end
13
+ end
14
+
15
+ context 'when initializing with a hash' do
16
+ subject do
17
+ Danica::Wrapper::Variable.new(name: :x)
18
+ end
19
+
20
+ it do
21
+ expect(subject.to_tex).to eq('x')
22
+ end
23
+ end
24
+
25
+ context 'when initializing from DSL' do
26
+ subject do
27
+ Danica::DSL.build do
28
+ variable(:x)
29
+ end
30
+ end
31
+
32
+ it do
33
+ expect(subject.to_tex).to eq('x')
34
+ end
35
+ end
36
+
37
+ context 'when variable has value' do
38
+ subject do
39
+ Danica::DSL.build do
40
+ variable(name: :frequency, latex: '\lambda', gnu: :f, value: 2)
41
+ end
42
+ end
43
+
44
+ it do
45
+ expect(subject.to_tex).to eq('2')
46
+ end
47
+ end
48
+ end
49
+
50
+ describe '#to_f' do
51
+ subject do
52
+ Danica::DSL.build do
53
+ variable(name: :x, value: 2)
54
+ end
55
+ end
56
+
57
+ it do
58
+ expect(subject.to_f).to eq(2)
59
+ end
60
+
61
+ context 'when adding the value later' do
62
+ subject do
63
+ Danica::DSL.build do
64
+ variable(:x)
65
+ end
66
+ end
67
+
68
+ let(:power) do
69
+ variable = subject
70
+ Danica::DSL.build do
71
+ power(variable, 2)
72
+ end
73
+ end
74
+
75
+ it do
76
+ subject.value = 4
77
+ expect(power.to_f).to eq(16)
78
+ end
79
+ end
80
+ end
81
+
82
+ describe 'custom outputs' do
83
+ subject do
84
+ Danica::DSL.build do
85
+ variable(name: :frequency, latex: '\lambda', gnu: :f)
86
+ end
87
+ end
88
+
89
+ describe '#to_tex' do
90
+ it do
91
+ expect(subject.to_tex).to eq('\lambda')
92
+ end
93
+ end
94
+
95
+ describe '#to_gnu' do
96
+ it do
97
+ expect(subject.to_gnu).to eq('f')
98
+ end
99
+ end
100
+ end
101
+
102
+ describe 'automatic wrapp' do
103
+ let(:sum) do
104
+ Danica::DSL.build do
105
+ power(:x, { name: :y }) + :z
106
+ end
107
+ end
108
+
109
+ let(:expected) do
110
+ Danica::Operator::Addition.new(
111
+ Danica::Operator::Power.new(
112
+ Danica::Wrapper::Variable.new(:x),
113
+ Danica::Wrapper::Variable.new(:y)
114
+ ),
115
+ Danica::Wrapper::Variable.new(:z)
116
+ )
117
+ end
118
+
119
+ it do
120
+ expect(sum).to eq(expected)
121
+ end
122
+ end
123
+ end
@@ -45,4 +45,17 @@ describe Danica::DSL do
45
45
 
46
46
  let(:subject) { described_class::Dummy.new }
47
47
  it_behaves_like 'a class with mapped dsl'
48
+
49
+ describe '.build' do
50
+ let(:expected) do
51
+ Danica::Operator::Addition.new(
52
+ Danica::Wrapper::Number.new(2),
53
+ Danica::Wrapper::Variable.new(:x)
54
+ )
55
+ end
56
+
57
+ it 'executes the build block' do
58
+ expect(described_class.build { number(2) + variable(:x) }).to eq(expected)
59
+ end
60
+ end
48
61
  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.6.1
4
+ version: 2.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darthjee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-08 00:00:00.000000000 Z
11
+ date: 2018-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -185,7 +185,9 @@ files:
185
185
  - spec/integration/readme/equation_spec.rb
186
186
  - spec/integration/readme/expression_spec.rb
187
187
  - spec/integration/readme/function_spec.rb
188
+ - spec/integration/readme/number_spec.rb
188
189
  - spec/integration/readme/operator_spec.rb
190
+ - spec/integration/readme/variables_spec.rb
189
191
  - spec/lib/danica/common_spec.rb
190
192
  - spec/lib/danica/dsl_spec.rb
191
193
  - spec/lib/danica/equation_spec.rb
@@ -263,7 +265,9 @@ test_files:
263
265
  - spec/integration/readme/equation_spec.rb
264
266
  - spec/integration/readme/expression_spec.rb
265
267
  - spec/integration/readme/function_spec.rb
268
+ - spec/integration/readme/number_spec.rb
266
269
  - spec/integration/readme/operator_spec.rb
270
+ - spec/integration/readme/variables_spec.rb
267
271
  - spec/lib/danica/common_spec.rb
268
272
  - spec/lib/danica/dsl_spec.rb
269
273
  - spec/lib/danica/equation_spec.rb