danica 2.7.1 → 2.7.6

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 (123) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +71 -0
  3. data/.gitignore +6 -1
  4. data/.rubocop.yml +9 -0
  5. data/.rubocop_todo.yml +123 -0
  6. data/Dockerfile +22 -0
  7. data/Gemfile +2 -1
  8. data/README.md +9 -1
  9. data/Rakefile +4 -0
  10. data/config/check_specs.yml +13 -0
  11. data/config/rubycritc.rb +12 -0
  12. data/config/yardstick.rb +13 -0
  13. data/config/yardstick.yml +33 -0
  14. data/danica.gemspec +16 -9
  15. data/docker-compose.yml +14 -9
  16. data/lib/danica.rb +3 -1
  17. data/lib/danica/base_operations.rb +15 -7
  18. data/lib/danica/builder.rb +2 -0
  19. data/lib/danica/common.rb +24 -16
  20. data/lib/danica/dsl.rb +15 -9
  21. data/lib/danica/dsl/builder.rb +40 -0
  22. data/lib/danica/equation.rb +3 -3
  23. data/lib/danica/equation/builder.rb +2 -0
  24. data/lib/danica/exception.rb +14 -2
  25. data/lib/danica/expressable.rb +20 -16
  26. data/lib/danica/expression.rb +4 -2
  27. data/lib/danica/expression/gauss.rb +5 -5
  28. data/lib/danica/formatted.rb +34 -11
  29. data/lib/danica/function.rb +5 -3
  30. data/lib/danica/function/name.rb +2 -0
  31. data/lib/danica/operator.rb +13 -9
  32. data/lib/danica/operator/addition.rb +4 -7
  33. data/lib/danica/operator/chained.rb +4 -8
  34. data/lib/danica/operator/cos.rb +2 -1
  35. data/lib/danica/operator/division.rb +3 -2
  36. data/lib/danica/operator/exponential.rb +2 -1
  37. data/lib/danica/operator/functional.rb +3 -2
  38. data/lib/danica/operator/multiplication.rb +5 -7
  39. data/lib/danica/operator/power.rb +4 -3
  40. data/lib/danica/operator/sin.rb +2 -1
  41. data/lib/danica/operator/squared_root.rb +2 -1
  42. data/lib/danica/variables_holder.rb +27 -24
  43. data/lib/danica/variables_holder/alias_builder.rb +4 -4
  44. data/lib/danica/variables_holder/calculator.rb +2 -0
  45. data/lib/danica/variables_holder/store.rb +3 -2
  46. data/lib/danica/variables_holder/variables_builder.rb +2 -1
  47. data/lib/danica/version.rb +3 -1
  48. data/lib/danica/wrapper.rb +17 -9
  49. data/lib/danica/wrapper/constant.rb +10 -14
  50. data/lib/danica/wrapper/container.rb +4 -4
  51. data/lib/danica/wrapper/group.rb +3 -2
  52. data/lib/danica/wrapper/negative.rb +3 -1
  53. data/lib/danica/wrapper/number.rb +6 -3
  54. data/lib/danica/wrapper/plus_minus.rb +3 -1
  55. data/lib/danica/wrapper/variable.rb +13 -8
  56. data/scripts/check_readme.sh +6 -0
  57. data/scripts/rubycritic.sh +10 -0
  58. data/spec/integration/global/danica/formatted_spec.rb +87 -0
  59. data/spec/integration/global/danica/operator/addition_spec.rb +32 -0
  60. data/spec/integration/global/danica/operator/multiplication_spec.rb +106 -0
  61. data/spec/integration/{power_spec.rb → global/danica/operator/power_spec.rb} +4 -2
  62. data/spec/integration/global/danica/wrapper/negative_spec.rb +56 -0
  63. data/spec/integration/{plus_minus_spec.rb → global/danica/wrapper/plus_minus_spec.rb} +5 -4
  64. data/spec/integration/readme/constant_spec.rb +4 -1
  65. data/spec/integration/readme/danica/formatted_spec.rb +24 -0
  66. data/spec/integration/readme/danica_spec.rb +20 -4
  67. data/spec/integration/readme/equation_spec.rb +4 -2
  68. data/spec/integration/readme/expression_spec.rb +11 -8
  69. data/spec/integration/readme/function_spec.rb +11 -7
  70. data/spec/integration/readme/number_spec.rb +9 -8
  71. data/spec/integration/readme/operator_spec.rb +3 -1
  72. data/spec/integration/readme/variables_spec.rb +8 -6
  73. data/spec/lib/danica/common_spec.rb +79 -8
  74. data/spec/lib/danica/dsl_spec.rb +21 -18
  75. data/spec/lib/danica/equation_spec.rb +10 -8
  76. data/spec/lib/danica/expressable_spec.rb +5 -2
  77. data/spec/lib/danica/expression/gauss_spec.rb +6 -3
  78. data/spec/lib/danica/expression_spec.rb +48 -26
  79. data/spec/lib/danica/formatted_spec.rb +57 -24
  80. data/spec/lib/danica/function/name_spec.rb +3 -1
  81. data/spec/lib/danica/function_spec.rb +14 -10
  82. data/spec/lib/danica/operator/addition_spec.rb +18 -21
  83. data/spec/lib/danica/operator/cos_spec.rb +9 -8
  84. data/spec/lib/danica/operator/division_spec.rb +18 -17
  85. data/spec/lib/danica/operator/exponential_spec.rb +9 -8
  86. data/spec/lib/danica/operator/multiplication_spec.rb +19 -20
  87. data/spec/lib/danica/operator/power_spec.rb +17 -16
  88. data/spec/lib/danica/operator/sin_spec.rb +9 -8
  89. data/spec/lib/danica/operator/squared_root_spec.rb +9 -8
  90. data/spec/lib/danica/operator_spec.rb +13 -4
  91. data/spec/lib/danica/variables_holder/store_spec.rb +19 -13
  92. data/spec/lib/danica/variables_holder_spec.rb +76 -59
  93. data/spec/lib/danica/wrapper/constant_spec.rb +9 -2
  94. data/spec/lib/danica/wrapper/group_spec.rb +4 -1
  95. data/spec/lib/danica/wrapper/negative_spec.rb +4 -1
  96. data/spec/lib/danica/wrapper/number_spec.rb +8 -3
  97. data/spec/lib/danica/wrapper/plus_minus_spec.rb +4 -1
  98. data/spec/lib/danica/wrapper/variable_spec.rb +6 -3
  99. data/spec/lib/danica/wrapper_spec.rb +22 -16
  100. data/spec/lib/danica_spec.rb +6 -5
  101. data/spec/spec_helper.rb +3 -2
  102. data/spec/support/models/expression/baskara.rb +3 -3
  103. data/spec/support/models/expression/parabole.rb +2 -0
  104. data/spec/support/models/expression/quadratic_sum.rb +3 -1
  105. data/spec/support/models/expression/spatial.rb +2 -1
  106. data/spec/support/models/function/my_function.rb +3 -1
  107. data/spec/support/models/function/parabole.rb +1 -1
  108. data/spec/support/models/function/quadratic_sum.rb +2 -0
  109. data/spec/support/models/function/spatial.rb +2 -0
  110. data/spec/support/models/operator/inverse.rb +3 -1
  111. data/spec/support/models/operator/my_operator.rb +3 -1
  112. data/spec/support/models/variables_holder/dummy.rb +3 -1
  113. data/spec/support/shared_contexts/common.rb +4 -2
  114. data/spec/support/shared_examples/base_operations.rb +7 -4
  115. data/spec/support/shared_examples/common.rb +3 -1
  116. data/spec/support/shared_examples/operator/chained.rb +12 -6
  117. data/spec/support/shared_examples/operator/dual_term.rb +9 -8
  118. data/spec/support/shared_examples/operator/single_input.rb +7 -2
  119. data/spec/support/shared_examples/variable.rb +8 -4
  120. metadata +115 -30
  121. data/spec/integration/addition_spec.rb +0 -28
  122. data/spec/integration/multiplication_spec.rb +0 -44
  123. data/spec/integration/negative_spec.rb +0 -25
@@ -1,11 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Function
5
+ autoload :Name, 'danica/function/name'
6
+
3
7
  include VariablesHolder
4
8
  include DSL
5
9
  include Expressable
6
10
 
7
- autoload :Name, 'danica/function/name'
8
- attr_accessor :name
11
+ attr_writer :name
9
12
 
10
13
  built_with(:function_block)
11
14
 
@@ -24,4 +27,3 @@ module Danica
24
27
  end
25
28
  end
26
29
  end
27
-
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Function::Name
3
5
  include Common
@@ -1,15 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Operator
3
5
  include VariablesHolder
4
- include BaseOperations
5
-
6
- default_value :priority, 3
7
- default_value :is_grouped?, false
8
-
9
- def ==(other)
10
- return false unless other.class == self.class
11
- variables == other.variables
12
- end
13
6
 
14
7
  autoload :Functional, 'danica/operator/functional'
15
8
  autoload :Chained, 'danica/operator/chained'
@@ -21,5 +14,16 @@ module Danica
21
14
  autoload :Sin, 'danica/operator/sin'
22
15
  autoload :SquaredRoot, 'danica/operator/squared_root'
23
16
  autoload :Exponential, 'danica/operator/exponential'
17
+
18
+ include BaseOperations
19
+
20
+ default_value :priority, 4
21
+ default_value :is_grouped?, false
22
+
23
+ def ==(other)
24
+ return false unless other.class == self.class
25
+
26
+ variables == other.variables
27
+ end
24
28
  end
25
29
  end
@@ -1,17 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Operator::Addition < Operator::Chained
3
5
  default_value :priority, 1
4
6
 
5
- def +(other)
6
- repack(other)
7
- end
8
-
9
7
  private
10
8
 
11
9
  default_value :symbol, :+
12
10
 
13
- def chain_operation(a, b)
14
- a + b
11
+ def chain_operation(first, second)
12
+ first + second
15
13
  end
16
14
 
17
15
  def join_proc(symbol)
@@ -21,4 +19,3 @@ module Danica
21
19
  end
22
20
  end
23
21
  end
24
-
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Operator
3
5
  class Chained < Operator
@@ -45,17 +47,11 @@ module Danica
45
47
  end
46
48
  end
47
49
 
48
- def repack(other)
49
- other_variables = other.is_a?(self.class) ? other.variables : [ other ]
50
- self.class.new(variables + other_variables)
51
- end
52
-
53
50
  def chain(numbers)
54
- numbers.inject do |a,b|
55
- chain_operation(a,b)
51
+ numbers.inject do |a, b|
52
+ chain_operation(a, b)
56
53
  end.to_f
57
54
  end
58
55
  end
59
56
  end
60
57
  end
61
-
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Operator::Cos < Operator::Functional.build(operator: :cos)
3
5
  end
4
6
  end
5
-
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Operator::Division < Operator
3
5
  variables :numerator, :denominator
4
- default_value :priority, 2
6
+ default_value :priority, 3
5
7
  default_value :is_grouped?, true
6
8
 
7
9
  def to_f
@@ -17,4 +19,3 @@ module Danica
17
19
  end
18
20
  end
19
21
  end
20
-
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Operator::Exponential < Operator::Functional.build(operator: :exp, tex: 'e^{:value:}')
3
5
  end
4
6
  end
5
-
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Operator::Functional < Operator
3
5
  variables :value
@@ -9,7 +11,7 @@ module Danica
9
11
  gnu = text if gnu.nil?
10
12
 
11
13
  Class.new(self) do
12
- module_eval(%Q(
14
+ module_eval(%(
13
15
  def to_f
14
16
  Math.#{operator}(value.to_f)
15
17
  end
@@ -26,4 +28,3 @@ module Danica
26
28
  end
27
29
  end
28
30
  end
29
-
@@ -1,18 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Operator::Multiplication < Operator::Chained
3
- default_value :priority, 2
4
-
5
- def *(other)
6
- repack(other)
7
- end
5
+ default_value :priority, 3
8
6
 
9
7
  private
10
8
 
11
9
  default_value :tex_symbol, '\cdot'
12
10
  default_value :gnu_symbol, :*
13
11
 
14
- def chain_operation(a, b)
15
- a * b
12
+ def chain_operation(first, second)
13
+ first * second
16
14
  end
17
15
  end
18
16
  end
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Operator::Power < Operator
3
5
  variables :base, :exponent
4
6
  default_value :is_grouped?, false
5
7
 
6
8
  def to_f
7
- base.to_f ** exponent.to_f
9
+ base.to_f**exponent.to_f
8
10
  end
9
11
 
10
12
  def to_tex(**options)
@@ -12,8 +14,7 @@ module Danica
12
14
  end
13
15
 
14
16
  def to_gnu(**options)
15
- "#{ wrap_as_group(base).to_gnu(options)}**(#{exponent.to_gnu(options)})"
17
+ "#{wrap_as_group(base).to_gnu(options)}**(#{exponent.to_gnu(options)})"
16
18
  end
17
19
  end
18
20
  end
19
-
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Operator::Sin < Operator::Functional.build(operator: :sin)
3
5
  end
4
6
  end
5
-
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Operator::SquaredRoot < Operator::Functional.build(operator: :sqrt, tex: '\sqrt{:value:}')
3
5
  end
4
6
  end
5
-
@@ -1,44 +1,47 @@
1
- module Danica
2
- module VariablesHolder extend ::ActiveSupport::Concern
3
- include Common
1
+ # frozen_string_literal: true
4
2
 
3
+ module Danica
4
+ module VariablesHolder
5
5
  autoload :VariablesBuilder, 'danica/variables_holder/variables_builder'
6
6
  autoload :AliasBuilder, 'danica/variables_holder/alias_builder'
7
7
  autoload :Calculator, 'danica/variables_holder/calculator'
8
8
  autoload :Store, 'danica/variables_holder/store'
9
9
 
10
+ extend ::ActiveSupport::Concern
11
+ include Common
12
+
10
13
  delegate :containers_hash, :containers, :variables,
11
14
  :variables_hash, :variables_value_hash,
12
15
  :extract_variables, to: :store
13
16
 
14
17
  included do
15
- default_value :variable_holder?, true
18
+ default_value :variable_holder?, true
19
+ end
16
20
 
17
- class << self
18
- def variables(*names)
19
- VariablesBuilder.new(names, self).build
20
- end
21
+ class_methods do
22
+ def variables(*names)
23
+ VariablesBuilder.new(names, self).build
24
+ end
21
25
 
22
- def variable_alias(origin, destiny)
23
- AliasBuilder.new(origin, destiny, self).build
24
- end
26
+ def variable_alias(origin, destiny)
27
+ AliasBuilder.new(origin, destiny, self).build
28
+ end
25
29
 
26
- def variables_names
27
- variables_hash.keys
28
- end
30
+ def variables_names
31
+ variables_hash.keys
32
+ end
29
33
 
30
- def variables_hash
31
- @variables_hash ||= superclass_variables_hash.dup
32
- end
34
+ def variables_hash
35
+ @variables_hash ||= superclass_variables_hash.dup
36
+ end
33
37
 
34
- def reset_variables
35
- @superclass_variables_hash = {}
36
- @variables_hash = nil
37
- end
38
+ def reset_variables
39
+ @superclass_variables_hash = {}
40
+ @variables_hash = nil
41
+ end
38
42
 
39
- def superclass_variables_hash
40
- @superclass_variables_hash ||= (superclass.try(:variables_hash) || {})
41
- end
43
+ def superclass_variables_hash
44
+ @superclass_variables_hash ||= (superclass.try(:variables_hash) || {})
42
45
  end
43
46
  end
44
47
 
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica::VariablesHolder
2
4
  class AliasBuilder
3
-
4
5
  attr_reader :clazz, :origin, :destiny
5
6
 
6
7
  def initialize(origin, destiny, clazz)
@@ -11,10 +12,9 @@ module Danica::VariablesHolder
11
12
 
12
13
  def build
13
14
  clazz.variables_hash.change_keys! { |k| k == origin ? destiny : k }
14
- VariablesBuilder.new([ destiny ], clazz).build
15
+ VariablesBuilder.new([destiny], clazz).build
15
16
  clazz.send(:alias_method, "#{origin}=", "#{destiny}=")
16
17
  clazz.send(:alias_method, origin, destiny)
17
- end
18
+ end
18
19
  end
19
20
  end
20
-
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  module VariablesHolder
3
5
  class Calculator
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class VariablesHolder::Store
3
5
  attr_reader :default_variables_hash, :variables_names
@@ -37,7 +39,7 @@ module Danica
37
39
 
38
40
  def named_variables_hash
39
41
  variable_variables.inject({}) do |hash, (key, container)|
40
- hash.merge( (container.content.name || key).to_sym => container )
42
+ hash.merge((container.content.name || key).to_sym => container)
41
43
  end
42
44
  end
43
45
 
@@ -64,4 +66,3 @@ module Danica
64
66
  end
65
67
  end
66
68
  end
67
-
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica::VariablesHolder
2
4
  class VariablesBuilder
3
5
  include Danica::DSL
@@ -41,4 +43,3 @@ module Danica::VariablesHolder
41
43
  end
42
44
  end
43
45
  end
44
-
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
- VERSION = '2.7.1'
4
+ VERSION = '2.7.6'
3
5
  end
@@ -1,11 +1,23 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  module Wrapper
5
+ autoload :Number, 'danica/wrapper/number'
6
+ autoload :Group, 'danica/wrapper/group'
7
+ autoload :Negative, 'danica/wrapper/negative'
8
+ autoload :PlusMinus, 'danica/wrapper/plus_minus'
9
+ autoload :Constant, 'danica/wrapper/constant'
10
+ autoload :Variable, 'danica/wrapper/variable'
11
+ autoload :Container, 'danica/wrapper/container'
12
+
3
13
  def wrap_value(value)
4
14
  Wrapper.wrap_value(value)
5
15
  end
6
16
 
7
17
  def self.wrap_value(value)
8
18
  case value
19
+ when Formatted
20
+ value.content
9
21
  when Numeric
10
22
  wrap_numeric(value)
11
23
  when Hash
@@ -13,26 +25,22 @@ module Danica
13
25
  when String, Symbol, NilClass
14
26
  Variable.new(name: value)
15
27
  else
28
+ raise Exception::InvalidInput, value unless value.is_a?(Danica::Common)
29
+
16
30
  value
17
31
  end
18
32
  end
19
33
 
20
34
  def self.wrap_numeric(number)
21
35
  return Negative.new(Number.new(-number)) if number < 0
36
+
22
37
  Number.new(number)
23
38
  end
24
39
 
25
40
  def self.wrap_hash(hash)
26
- return Constant.new(hash) if hash.keys.map(&:to_sym).sort == %i(gnuplot latex value)
41
+ return Constant.new(hash) if hash.keys.map(&:to_sym).sort == %i[gnuplot latex value]
42
+
27
43
  Variable.new(hash)
28
44
  end
29
-
30
- autoload :Number, 'danica/wrapper/number'
31
- autoload :Group, 'danica/wrapper/group'
32
- autoload :Negative, 'danica/wrapper/negative'
33
- autoload :PlusMinus, 'danica/wrapper/plus_minus'
34
- autoload :Constant, 'danica/wrapper/constant'
35
- autoload :Variable, 'danica/wrapper/variable'
36
- autoload :Container, 'danica/wrapper/container'
37
45
  end
38
46
  end
@@ -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
 
@@ -25,33 +27,27 @@ module Danica
25
27
 
26
28
  def ==(other)
27
29
  return false unless other.class == self.class
30
+
28
31
  gnuplot == other.gnuplot && latex == other.latex && value == other.value
29
32
  end
30
33
 
31
- def to_tex(**_)
34
+ def to_tex(**_options)
32
35
  latex.to_s
33
36
  end
34
37
 
35
- def to_gnu(**_)
38
+ def to_gnu(**_options)
36
39
  gnuplot.to_s
37
40
  end
38
41
 
39
42
  private
40
43
 
41
- def value=(value)
42
- @value = value
43
- end
44
+ attr_writer :value
44
45
 
45
- def latex=(latex)
46
- @latex = latex
47
- end
46
+ attr_writer :latex
48
47
 
49
- def gnuplot=(gnuplot)
50
- @gnuplot = gnuplot
51
- end
48
+ attr_writer :gnuplot
52
49
  end
53
50
 
54
51
  E = Wrapper::Constant.new(Math::E, :e, 'exp(1)')
55
52
  PI = Wrapper::Constant.new(Math::PI, '\pi', :pi)
56
53
  end
57
-