danica 2.6.1 → 2.6.2

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 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