danica 2.7.4 → 2.7.5

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.
Files changed (121) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +28 -0
  3. data/.gitignore +6 -1
  4. data/.rubocop.yml +9 -0
  5. data/.rubocop_todo.yml +100 -0
  6. data/Dockerfile +26 -0
  7. data/Gemfile +2 -1
  8. data/Rakefile +4 -0
  9. data/config/rubycritc.rb +12 -0
  10. data/config/yardstick.rb +13 -0
  11. data/config/yardstick.yml +33 -0
  12. data/danica.gemspec +14 -7
  13. data/docker-compose.yml +14 -9
  14. data/lib/danica.rb +2 -1
  15. data/lib/danica/base_operations.rb +2 -0
  16. data/lib/danica/builder.rb +2 -0
  17. data/lib/danica/common.rb +5 -2
  18. data/lib/danica/dsl.rb +8 -6
  19. data/lib/danica/dsl/builder.rb +3 -1
  20. data/lib/danica/equation.rb +3 -3
  21. data/lib/danica/equation/builder.rb +2 -0
  22. data/lib/danica/exception.rb +3 -2
  23. data/lib/danica/expressable.rb +14 -8
  24. data/lib/danica/expression.rb +4 -2
  25. data/lib/danica/expression/gauss.rb +5 -5
  26. data/lib/danica/formatted.rb +4 -2
  27. data/lib/danica/function.rb +5 -3
  28. data/lib/danica/function/name.rb +2 -0
  29. data/lib/danica/operator.rb +12 -9
  30. data/lib/danica/operator/addition.rb +4 -3
  31. data/lib/danica/operator/chained.rb +4 -3
  32. data/lib/danica/operator/cos.rb +2 -1
  33. data/lib/danica/operator/division.rb +2 -1
  34. data/lib/danica/operator/exponential.rb +2 -1
  35. data/lib/danica/operator/functional.rb +3 -2
  36. data/lib/danica/operator/multiplication.rb +4 -2
  37. data/lib/danica/operator/power.rb +4 -3
  38. data/lib/danica/operator/sin.rb +2 -1
  39. data/lib/danica/operator/squared_root.rb +2 -1
  40. data/lib/danica/variables_holder.rb +7 -4
  41. data/lib/danica/variables_holder/alias_builder.rb +4 -4
  42. data/lib/danica/variables_holder/calculator.rb +2 -0
  43. data/lib/danica/variables_holder/store.rb +3 -2
  44. data/lib/danica/variables_holder/variables_builder.rb +2 -1
  45. data/lib/danica/version.rb +3 -1
  46. data/lib/danica/wrapper.rb +11 -9
  47. data/lib/danica/wrapper/constant.rb +9 -14
  48. data/lib/danica/wrapper/container.rb +2 -3
  49. data/lib/danica/wrapper/group.rb +2 -2
  50. data/lib/danica/wrapper/negative.rb +2 -1
  51. data/lib/danica/wrapper/number.rb +4 -3
  52. data/lib/danica/wrapper/plus_minus.rb +2 -1
  53. data/lib/danica/wrapper/variable.rb +10 -8
  54. data/scripts/check_readme.sh +6 -0
  55. data/scripts/rubycritic.sh +10 -0
  56. data/spec/integration/global/danica/formatted_spec.rb +87 -0
  57. data/spec/integration/global/danica/operator/addition_spec.rb +32 -0
  58. data/spec/integration/{multiplication_spec.rb → global/danica/operator/multiplication_spec.rb} +12 -9
  59. data/spec/integration/{power_spec.rb → global/danica/operator/power_spec.rb} +4 -2
  60. data/spec/integration/{negative_spec.rb → global/danica/wrapper/negative_spec.rb} +9 -8
  61. data/spec/integration/{plus_minus_spec.rb → global/danica/wrapper/plus_minus_spec.rb} +5 -4
  62. data/spec/integration/readme/constant_spec.rb +4 -1
  63. data/spec/integration/readme/danica/formatted_spec.rb +24 -0
  64. data/spec/integration/readme/danica_spec.rb +20 -4
  65. data/spec/integration/readme/equation_spec.rb +4 -2
  66. data/spec/integration/readme/expression_spec.rb +11 -8
  67. data/spec/integration/readme/function_spec.rb +11 -7
  68. data/spec/integration/readme/number_spec.rb +9 -8
  69. data/spec/integration/readme/operator_spec.rb +3 -1
  70. data/spec/integration/readme/variables_spec.rb +8 -6
  71. data/spec/lib/danica/common_spec.rb +23 -9
  72. data/spec/lib/danica/dsl_spec.rb +5 -2
  73. data/spec/lib/danica/equation_spec.rb +10 -8
  74. data/spec/lib/danica/expressable_spec.rb +5 -2
  75. data/spec/lib/danica/expression/gauss_spec.rb +6 -3
  76. data/spec/lib/danica/expression_spec.rb +48 -26
  77. data/spec/lib/danica/formatted_spec.rb +20 -14
  78. data/spec/lib/danica/function/name_spec.rb +3 -1
  79. data/spec/lib/danica/function_spec.rb +14 -10
  80. data/spec/lib/danica/operator/addition_spec.rb +16 -15
  81. data/spec/lib/danica/operator/cos_spec.rb +9 -8
  82. data/spec/lib/danica/operator/division_spec.rb +18 -17
  83. data/spec/lib/danica/operator/exponential_spec.rb +9 -8
  84. data/spec/lib/danica/operator/multiplication_spec.rb +16 -15
  85. data/spec/lib/danica/operator/power_spec.rb +17 -16
  86. data/spec/lib/danica/operator/sin_spec.rb +9 -8
  87. data/spec/lib/danica/operator/squared_root_spec.rb +9 -8
  88. data/spec/lib/danica/operator_spec.rb +13 -4
  89. data/spec/lib/danica/variables_holder/store_spec.rb +19 -13
  90. data/spec/lib/danica/variables_holder_spec.rb +76 -59
  91. data/spec/lib/danica/wrapper/constant_spec.rb +9 -2
  92. data/spec/lib/danica/wrapper/group_spec.rb +4 -1
  93. data/spec/lib/danica/wrapper/negative_spec.rb +4 -1
  94. data/spec/lib/danica/wrapper/number_spec.rb +8 -3
  95. data/spec/lib/danica/wrapper/plus_minus_spec.rb +4 -1
  96. data/spec/lib/danica/wrapper/variable_spec.rb +6 -3
  97. data/spec/lib/danica/wrapper_spec.rb +14 -12
  98. data/spec/lib/danica_spec.rb +6 -5
  99. data/spec/spec_helper.rb +2 -1
  100. data/spec/support/models/expression/baskara.rb +3 -3
  101. data/spec/support/models/expression/parabole.rb +2 -0
  102. data/spec/support/models/expression/quadratic_sum.rb +3 -1
  103. data/spec/support/models/expression/spatial.rb +2 -1
  104. data/spec/support/models/function/my_function.rb +3 -1
  105. data/spec/support/models/function/parabole.rb +1 -1
  106. data/spec/support/models/function/quadratic_sum.rb +2 -0
  107. data/spec/support/models/function/spatial.rb +2 -0
  108. data/spec/support/models/operator/inverse.rb +3 -1
  109. data/spec/support/models/operator/my_operator.rb +3 -1
  110. data/spec/support/models/variables_holder/dummy.rb +3 -1
  111. data/spec/support/shared_contexts/common.rb +4 -2
  112. data/spec/support/shared_examples/base_operations.rb +7 -4
  113. data/spec/support/shared_examples/common.rb +3 -1
  114. data/spec/support/shared_examples/operator/chained.rb +12 -6
  115. data/spec/support/shared_examples/operator/dual_term.rb +9 -8
  116. data/spec/support/shared_examples/operator/single_input.rb +7 -2
  117. data/spec/support/shared_examples/variable.rb +8 -4
  118. metadata +109 -30
  119. data/spec/integration/addition_spec.rb +0 -28
  120. data/spec/integration/formatted_spec.rb +0 -75
  121. data/spec/integration/readme/formatting_spec.rb +0 -34
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Wrapper::Constant
3
5
  include BaseOperations
@@ -12,10 +14,10 @@ module Danica
12
14
 
13
15
  def initialize(*args)
14
16
  attrs = args.extract_options!
15
- attrs = args.as_hash(%i(value latex gnuplot)).merge(attrs)
17
+ attrs = args.as_hash(%i[value latex gnuplot]).merge(attrs)
16
18
 
17
19
  attrs.each do |key, value|
18
- self.send("#{key}=", value)
20
+ send("#{key}=", value)
19
21
  end
20
22
  end
21
23
 
@@ -28,30 +30,23 @@ module Danica
28
30
  gnuplot == other.gnuplot && latex == other.latex && value == other.value
29
31
  end
30
32
 
31
- def to_tex(**_)
33
+ def to_tex(**_options)
32
34
  latex.to_s
33
35
  end
34
36
 
35
- def to_gnu(**_)
37
+ def to_gnu(**_options)
36
38
  gnuplot.to_s
37
39
  end
38
40
 
39
41
  private
40
42
 
41
- def value=(value)
42
- @value = value
43
- end
43
+ attr_writer :value
44
44
 
45
- def latex=(latex)
46
- @latex = latex
47
- end
45
+ attr_writer :latex
48
46
 
49
- def gnuplot=(gnuplot)
50
- @gnuplot = gnuplot
51
- end
47
+ attr_writer :gnuplot
52
48
  end
53
49
 
54
50
  E = Wrapper::Constant.new(Math::E, :e, 'exp(1)')
55
51
  PI = Wrapper::Constant.new(Math::PI, '\pi', :pi)
56
52
  end
57
-
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Wrapper::Container
3
5
  include Common
@@ -19,6 +21,3 @@ module Danica
19
21
  end
20
22
  end
21
23
  end
22
-
23
-
24
-
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Wrapper::Group
3
5
  include Common
@@ -28,5 +30,3 @@ module Danica
28
30
  end
29
31
  end
30
32
  end
31
-
32
-
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Wrapper::Negative
3
5
  include BaseOperations
@@ -29,4 +31,3 @@ module Danica
29
31
  end
30
32
  end
31
33
  end
32
-
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Wrapper::Number
3
5
  include BaseOperations
@@ -13,9 +15,9 @@ module Danica
13
15
  @value = value
14
16
  end
15
17
 
16
- def to(_, decimals: nil, **__)
18
+ def to(_format, decimals: nil, **_options)
17
19
  return value.to_i.to_s if value.to_i == value
18
- return ("%.#{decimals}f" % value).to_f.to_s if decimals
20
+ return format("%.#{decimals}f", value).to_f.to_s if decimals
19
21
  value.to_s
20
22
  end
21
23
 
@@ -33,4 +35,3 @@ module Danica
33
35
  end
34
36
  end
35
37
  end
36
-
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Wrapper::PlusMinus
3
5
  include BaseOperations
@@ -33,4 +35,3 @@ module Danica
33
35
  end
34
36
  end
35
37
  end
36
-
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Wrapper::Variable
3
5
  include BaseOperations
4
6
  include Common
5
7
 
6
- attr_accessor :value, :name, :latex, :gnuplot
8
+ attr_accessor :name, :latex, :gnuplot
9
+ attr_reader :value
7
10
 
8
11
  default_value :priority, 10
9
12
  default_value :is_grouped?, false
@@ -11,10 +14,10 @@ module Danica
11
14
 
12
15
  def initialize(*args)
13
16
  attrs = args.extract_options!
14
- attrs = args.as_hash(%i(name value latex gnuplot)).merge(attrs)
17
+ attrs = args.as_hash(%i[name value latex gnuplot]).merge(attrs)
15
18
 
16
19
  attrs.each do |key, value|
17
- self.public_send("#{key}=", value)
20
+ public_send("#{key}=", value)
18
21
  end
19
22
  end
20
23
 
@@ -24,10 +27,10 @@ module Danica
24
27
 
25
28
  def ==(other)
26
29
  return false unless other.class == self.class
27
- return other.value == value &&
28
- other.name == name &&
29
- other.latex == latex &&
30
- other.gnuplot == gnuplot
30
+ other.value == value &&
31
+ other.name == name &&
32
+ other.latex == latex &&
33
+ other.gnuplot == gnuplot
31
34
  end
32
35
 
33
36
  def to_tex(**options)
@@ -45,4 +48,3 @@ module Danica
45
48
  end
46
49
  end
47
50
  end
48
-
@@ -0,0 +1,6 @@
1
+ #! /bin/bash
2
+
3
+ PROJECT=danica
4
+ VERSION=$(grep VERSION lib/$PROJECT/version.rb | sed -e "s/.*'\(.*\)'/\1/g")
5
+
6
+ grep https://www.rubydoc.info/gems/$PROJECT/$VERSION README.md
@@ -0,0 +1,10 @@
1
+ #!/bin/bash
2
+
3
+ DIFF_LIST=$(git diff --name-only $CIRCLE_SHA1 $(git merge-base $CIRCLE_SHA1 origin/master) | grep "^lib/")
4
+
5
+ if [ ! -z "$DIFF_LIST" ]; then
6
+ mkdir -p tmp/rubycritic/compare
7
+ bundle exec rubycritic --format console --branch origin/master -t 0 --maximum-decrease 1 $DIFF_LIST
8
+ else
9
+ echo "No changes detected. Skipping rubycritic..."
10
+ fi
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Danica::Formatted do
6
+ describe 'integration of formatted objects' do
7
+ subject do
8
+ variable.tex
9
+ end
10
+
11
+ let(:variable) { Danica.build(:v) { v } }
12
+
13
+ context 'when interacting with a multiplication' do
14
+ let(:other) do
15
+ Danica.build(:x, :y) { x * y }
16
+ end
17
+
18
+ context 'when multipling another multiplication' do
19
+ let(:result) { subject * other }
20
+
21
+ it do
22
+ expect(result).to be_a(described_class)
23
+ end
24
+
25
+ it 'knows how to convert it to string' do
26
+ expect(result.to_s).to eq('v \\cdot x \\cdot y')
27
+ end
28
+ end
29
+
30
+ context 'when multiplicated by another multiplication' do
31
+ let(:result) { other * subject }
32
+
33
+ it do
34
+ expect(result).to be_a(described_class)
35
+ end
36
+
37
+ it 'knows how to convert it to string' do
38
+ expect(result.to_s).to eq('x \\cdot y \\cdot v')
39
+ end
40
+ end
41
+ end
42
+
43
+ context 'when interacting with a sum' do
44
+ let(:other) do
45
+ Danica.build(:x, :y) { x + y }
46
+ end
47
+
48
+ context 'when summing another sum' do
49
+ let(:result) { subject + other }
50
+
51
+ it do
52
+ expect(result).to be_a(described_class)
53
+ end
54
+
55
+ it 'knows how to convert it to string' do
56
+ expect(result.to_s).to eq('v + x + y')
57
+ end
58
+ end
59
+
60
+ context 'when added by another sum' do
61
+ let(:result) { other + subject }
62
+
63
+ it do
64
+ expect(result).to be_a(described_class)
65
+ end
66
+
67
+ it 'knows how to convert it to string' do
68
+ expect(result.to_s).to eq('x + y + v')
69
+ end
70
+ end
71
+ end
72
+
73
+ context 'when operating multiplication and subtraction all toguether' do
74
+ let(:variable) { Danica::Wrapper::Variable.new(:v) }
75
+ let(:x) { Danica::Wrapper::Variable.new(:x) }
76
+ let(:result) { x * -subject }
77
+
78
+ it do
79
+ expect(result).to be_a(described_class)
80
+ end
81
+
82
+ it 'knows how to convert it to string' do
83
+ expect(result.to_s).to eq('x \cdot \left(-v\right)')
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Danica::Operator::Addition do
6
+ describe 'integration' do
7
+ describe 'with negative and positivenegative (+/-) numbers' do
8
+ subject do
9
+ described_class.new(
10
+ Danica::Wrapper::Negative.new(1),
11
+ 2,
12
+ -3,
13
+ 4,
14
+ Danica::Wrapper::PlusMinus.new(5),
15
+ Danica::Wrapper::Number.new(-6)
16
+ )
17
+ end
18
+
19
+ describe '#to_gnu' do
20
+ it 'returns the correct string' do
21
+ expect(subject.to_gnu).to eq('-1 + 2 -3 + 4 + 5 -6')
22
+ end
23
+ end
24
+
25
+ describe '#to_tex' do
26
+ it 'returns the correct string' do
27
+ expect(subject.to_tex).to eq('-1 + 2 -3 + 4 \pm 5 -6')
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
- describe 'integration of multiplication' do
5
+ describe Danica::Operator::Multiplication do
4
6
  describe 'of number and addition' do
5
7
  subject do
6
- Danica::Operator::Multiplication.new(
8
+ described_class.new(
7
9
  3, Danica::Operator::Addition.new(2, 4)
8
10
  )
9
11
  end
@@ -23,9 +25,9 @@ describe 'integration of multiplication' do
23
25
 
24
26
  describe 'of additions' do
25
27
  subject do
26
- Danica::Operator::Multiplication.new(
27
- Danica::Operator::Addition.new(1,2),
28
- Danica::Operator::Addition.new(3,4)
28
+ described_class.new(
29
+ Danica::Operator::Addition.new(1, 2),
30
+ Danica::Operator::Addition.new(3, 4)
29
31
  )
30
32
  end
31
33
 
@@ -44,13 +46,14 @@ describe 'integration of multiplication' do
44
46
 
45
47
  describe 'when calling * operator' do
46
48
  subject do
47
- Danica::Operator::Multiplication.new(:x, :y)
49
+ described_class.new(:x, :y)
48
50
  end
51
+
49
52
  let(:variable) { Danica::Wrapper::Variable.new(:v) }
50
53
  let(:result) { subject * variable }
51
54
 
52
55
  it do
53
- expect(result).to be_a(Danica::Operator::Multiplication)
56
+ expect(result).to be_a(described_class)
54
57
  end
55
58
 
56
59
  it 'knows how to order variables' do
@@ -61,7 +64,7 @@ describe 'integration of multiplication' do
61
64
  let(:result) { variable * subject }
62
65
 
63
66
  it do
64
- expect(result).to be_a(Danica::Operator::Multiplication)
67
+ expect(result).to be_a(described_class)
65
68
  end
66
69
 
67
70
  it 'knows how to order variables' do
@@ -77,7 +80,7 @@ describe 'integration of multiplication' do
77
80
  let(:result) { x * negative }
78
81
 
79
82
  it do
80
- expect(result).to be_a(Danica::Operator::Multiplication)
83
+ expect(result).to be_a(described_class)
81
84
  end
82
85
 
83
86
  it 'knows how to order variables' do
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
- describe 'integration of power' do
5
+ describe Danica::Operator::Power do
4
6
  describe 'of additions' do
5
7
  subject do
6
- Danica::Operator::Power.new(
8
+ described_class.new(
7
9
  Danica::Operator::Addition.new(3, 4),
8
10
  Danica::Operator::Addition.new(5, 6)
9
11
  )
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
- describe 'integration of negative' do
5
+ describe Danica::Wrapper::Negative do
4
6
  describe 'with a addition' do
5
7
  subject do
6
- Danica::Wrapper::Negative.new(
7
- Danica::Operator::Addition.new(1,2,3)
8
+ described_class.new(
9
+ Danica::Operator::Addition.new(1, 2, 3)
8
10
  )
9
11
  end
10
12
 
@@ -21,13 +23,14 @@ describe 'integration of negative' do
21
23
  end
22
24
 
23
25
  describe 'when it is the result of an expression' do
26
+ subject do
27
+ x - negative_parcel
28
+ end
29
+
24
30
  let(:x) { Danica::Wrapper::Variable.new(:x) }
25
31
  let(:y) { Danica::Wrapper::Variable.new(:y) }
26
32
  let(:z) { Danica::Wrapper::Variable.new(:z) }
27
33
  let(:negative_parcel) { y + z }
28
- subject do
29
- x - negative_parcel
30
- end
31
34
 
32
35
  it 'wraps parcel into a group' do
33
36
  expect(subject.to_gnu).to eq('x -(y + z)')
@@ -51,5 +54,3 @@ describe 'integration of negative' do
51
54
  end
52
55
  end
53
56
  end
54
-
55
-
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
- describe 'integration of positive negative' do
5
+ describe Danica::Wrapper::PlusMinus do
4
6
  describe 'with a addition' do
5
7
  subject do
6
- Danica::Wrapper::PlusMinus.new(
7
- Danica::Operator::Addition.new(1,2,3)
8
+ described_class.new(
9
+ Danica::Operator::Addition.new(1, 2, 3)
8
10
  )
9
11
  end
10
12
 
@@ -21,4 +23,3 @@ describe 'integration of positive negative' do
21
23
  end
22
24
  end
23
25
  end
24
-