danica 2.7.1 → 2.7.6

Sign up to get free protection for your applications and to get access to all the features.
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
-