danica 2.7.2 → 2.7.7

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 +18 -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 +19 -10
  15. data/docker-compose.yml +14 -9
  16. data/lib/danica.rb +2 -1
  17. data/lib/danica/base_operations.rb +3 -0
  18. data/lib/danica/builder.rb +2 -0
  19. data/lib/danica/common.rb +8 -4
  20. data/lib/danica/dsl.rb +8 -6
  21. data/lib/danica/dsl/builder.rb +4 -1
  22. data/lib/danica/equation.rb +3 -3
  23. data/lib/danica/equation/builder.rb +2 -0
  24. data/lib/danica/exception.rb +3 -2
  25. data/lib/danica/expressable.rb +14 -8
  26. data/lib/danica/expression.rb +4 -2
  27. data/lib/danica/expression/gauss.rb +5 -5
  28. data/lib/danica/formatted.rb +27 -8
  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 -3
  33. data/lib/danica/operator/chained.rb +4 -3
  34. data/lib/danica/operator/cos.rb +2 -1
  35. data/lib/danica/operator/division.rb +2 -1
  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 +4 -2
  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 +7 -4
  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 +14 -9
  49. data/lib/danica/wrapper/constant.rb +10 -14
  50. data/lib/danica/wrapper/container.rb +3 -3
  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/{multiplication_spec.rb → global/danica/operator/multiplication_spec.rb} +12 -9
  61. data/spec/integration/{power_spec.rb → global/danica/operator/power_spec.rb} +4 -2
  62. data/spec/integration/{negative_spec.rb → global/danica/wrapper/negative_spec.rb} +9 -8
  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 +71 -10
  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 +34 -13
  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 +16 -15
  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 +16 -15
  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 +14 -12
  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 +158 -36
  121. data/spec/integration/addition_spec.rb +0 -28
  122. data/spec/integration/formatted_spec.rb +0 -75
  123. data/spec/integration/readme/formatting_spec.rb +0 -34
data/lib/danica.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'darthjee/core_ext'
2
4
 
3
5
  module Danica
@@ -27,4 +29,3 @@ module Danica
27
29
  end
28
30
  end
29
31
  end
30
-
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  module BaseOperations
3
5
  def +(other)
@@ -28,6 +30,7 @@ module Danica
28
30
 
29
31
  def formatted_operation(other, value)
30
32
  return other.repack(value) if other.is_a?(Danica::Formatted)
33
+
31
34
  value
32
35
  end
33
36
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Builder
3
5
  include DSL
data/lib/danica/common.rb CHANGED
@@ -1,5 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
- module Common extend ::ActiveSupport::Concern
4
+ module Common
5
+ extend ::ActiveSupport::Concern
3
6
  included do
4
7
  include Wrapper
5
8
  include DSL
@@ -42,16 +45,16 @@ module Danica
42
45
  when :f
43
46
  to_f
44
47
  else
45
- raise Exception::FormattedNotFound.new
48
+ raise Exception::FormattedNotFound
46
49
  end
47
50
  end
48
51
 
49
52
  def tex(**options)
50
- formatted(:tex, options)
53
+ formatted(format: :tex, **options)
51
54
  end
52
55
 
53
56
  def gnu(**options)
54
- formatted(:gnu, options)
57
+ formatted(format: :gnu, **options)
55
58
  end
56
59
 
57
60
  def formatted(*args)
@@ -72,6 +75,7 @@ module Danica
72
75
 
73
76
  def wrap_as_group(value)
74
77
  return value if is_grouped? || value.priority >= priority
78
+
75
79
  group(value)
76
80
  end
77
81
  end
data/lib/danica/dsl.rb CHANGED
@@ -1,17 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  module DSL
3
5
  autoload :Builder, 'danica/dsl/builder'
4
6
 
5
7
  class << self
6
- def register_operator(method, clazz=nil)
8
+ def register_operator(method, clazz = nil)
7
9
  register(method, clazz, 'Danica::Operator')
8
10
  end
9
11
 
10
- def register_wrapper(method, clazz=nil)
12
+ def register_wrapper(method, clazz = nil)
11
13
  register(method, clazz, 'Danica::Wrapper')
12
14
  end
13
15
 
14
- def register(method, clazz=nil, base=nil)
16
+ def register(method, clazz = nil, base = nil)
15
17
  Builder.new(method, clazz, base).build
16
18
  end
17
19
 
@@ -39,14 +41,14 @@ module Danica
39
41
  end
40
42
  end
41
43
 
42
- %i(
44
+ %i[
43
45
  addition multiplication division sin cos power
44
46
  squared_root exponential
45
- ).each do |method|
47
+ ].each do |method|
46
48
  DSL.register_operator(method)
47
49
  end
48
50
 
49
- %i(number group negative plus_minus variable constant).each do |method|
51
+ %i[number group negative plus_minus variable constant].each do |method|
50
52
  DSL.register_wrapper(method)
51
53
  end
52
54
 
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  module DSL
3
5
  class Builder
4
6
  attr_reader :method, :claz, :base
5
7
 
6
- def initialize(method, claz=nil, base=nil)
8
+ def initialize(method, claz = nil, base = nil)
7
9
  @method = method
8
10
  @claz = claz
9
11
  @base = base
@@ -22,6 +24,7 @@ module Danica
22
24
  def build_clazz
23
25
  return clazz_from_method unless claz
24
26
  return claz if claz.is_a? Class
27
+
25
28
  clazz_from_string
26
29
  end
27
30
 
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Equation
3
5
  include VariablesHolder
4
-
6
+
5
7
  autoload :Builder, 'danica/equation/builder'
6
8
 
7
9
  class << self
@@ -19,5 +21,3 @@ module Danica
19
21
  end
20
22
  end
21
23
  end
22
-
23
-
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Equation::Builder
3
5
  attr_reader :variables
@@ -1,4 +1,6 @@
1
- class Danica::Exception < ::Exception
1
+ # frozen_string_literal: true
2
+
3
+ class Danica::Exception < RuntimeError
2
4
  class NotDefined < self; end
3
5
  class FormattedNotFound < self; end
4
6
  class NotImplemented < self; end
@@ -14,4 +16,3 @@ class Danica::Exception < ::Exception
14
16
  end
15
17
  end
16
18
  end
17
-
@@ -1,24 +1,30 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
- module Expressable extend ::ActiveSupport::Concern
4
+ module Expressable
5
+ extend ::ActiveSupport::Concern
3
6
  include VariablesHolder
4
7
 
5
8
  class_methods do
6
9
  def built_with(block_name)
7
- self.delegate :to, :to_f, to: block_name
10
+ delegate :to, :to_f, to: block_name
8
11
 
9
- self.define_singleton_method(:build) do |*vars, &block|
12
+ define_singleton_method(:build) do |*vars, &block|
10
13
  Class.new(self) do
11
14
  variables(*vars)
12
15
 
13
16
  private
14
17
 
15
- module_eval("define_method :#{block_name} do
16
- @#{block_name} ||= instance_eval(&block) if block
17
- end")
18
+ module_eval do
19
+ define_method block_name do
20
+ instance_variable_get("@#{block_name}") ||
21
+ block && instance_variable_set("@#{block_name}", instance_eval(&block))
22
+ end
23
+ end
18
24
  end
19
25
  end
20
26
 
21
- self.define_singleton_method(:create) do |*vars, &block|
27
+ define_singleton_method(:create) do |*vars, &block|
22
28
  build(*vars, &block).new
23
29
  end
24
30
  end
@@ -30,7 +36,7 @@ module Danica
30
36
  attributes = { variables: args.flatten }.merge(options)
31
37
 
32
38
  attributes.each do |key, value|
33
- self.public_send("#{key}=", value)
39
+ public_send("#{key}=", value)
34
40
  end
35
41
  end
36
42
  end
@@ -1,12 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Expression
5
+ autoload :Gauss, 'danica/expression/gauss'
6
+
3
7
  include Common
4
8
  include DSL
5
9
  include BaseOperations
6
10
  include Expressable
7
11
 
8
- autoload :Gauss, 'danica/expression/gauss'
9
-
10
12
  delegate :is_grouped?, :priority, to: :expression_block
11
13
 
12
14
  built_with(:expression_block)
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Expression::Gauss < Expression.build(:x, average: { latex: '\mu', gnuplot: :u }, variance_root: { latex: '\sigma', gnuplot: :v }) { num(1) / denominator * exponential(exp) }
3
-
4
5
  private
5
6
 
6
7
  def denominator
@@ -9,14 +10,13 @@ module Danica
9
10
 
10
11
  def exp
11
12
  - (
12
- ((x - average) ** 2) /
13
+ ((x - average)**2) /
13
14
  (num(2) * variance)
14
- )
15
+ )
15
16
  end
16
17
 
17
18
  def variance
18
- @variance ||= variance_root ** 2
19
+ @variance ||= variance_root**2
19
20
  end
20
21
  end
21
22
  end
22
-
@@ -1,34 +1,53 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Danica::Formatted
2
- attr_reader :content, :format, :decimals
4
+ attr_reader :content, :options
3
5
 
4
- def initialize(content, format, decimals: nil)
6
+ def initialize(content, **options)
5
7
  @content = content
6
- @format = format
7
- @decimals = decimals
8
+ @options = options
8
9
  end
9
10
 
10
11
  def to_s
11
- content.to(format, decimals: decimals)
12
+ content.to(format, options)
12
13
  end
13
14
 
14
15
  def ==(other)
15
16
  return false unless other.class == self.class
16
- return other.content == content &&
17
- other.format == format
17
+
18
+ other.content == content &&
19
+ other.format == format
20
+ end
21
+
22
+ def format
23
+ options[:format]
18
24
  end
19
25
 
20
26
  def repack(object)
21
27
  self.class.new(
22
28
  object,
23
- format
29
+ options
24
30
  )
25
31
  end
26
32
 
33
+ def to_tex(**opts)
34
+ to(:tex, **opts)
35
+ end
36
+
37
+ def to_gnu(**opts)
38
+ to(:gnu, **opts)
39
+ end
40
+
41
+ def to(format, **opts)
42
+ content.to(format, options.merge(opts))
43
+ end
44
+
27
45
  private
28
46
 
29
47
  def method_missing(method, *args)
30
48
  value = content.public_send(method, *args)
31
49
  return value unless value.is_a?(Danica::Common)
50
+
32
51
  repack(value)
33
52
  end
34
53
  end
@@ -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, 4
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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Operator::Addition < Operator::Chained
3
5
  default_value :priority, 1
@@ -6,8 +8,8 @@ module Danica
6
8
 
7
9
  default_value :symbol, :+
8
10
 
9
- def chain_operation(a, b)
10
- a + b
11
+ def chain_operation(first, second)
12
+ first + second
11
13
  end
12
14
 
13
15
  def join_proc(symbol)
@@ -17,4 +19,3 @@ module Danica
17
19
  end
18
20
  end
19
21
  end
20
-
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Operator
3
5
  class Chained < Operator
@@ -46,11 +48,10 @@ module Danica
46
48
  end
47
49
 
48
50
  def chain(numbers)
49
- numbers.inject do |a,b|
50
- chain_operation(a,b)
51
+ numbers.inject do |a, b|
52
+ chain_operation(a, b)
51
53
  end.to_f
52
54
  end
53
55
  end
54
56
  end
55
57
  end
56
-
@@ -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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Danica
2
4
  class Operator::Division < Operator
3
5
  variables :numerator, :denominator
@@ -17,4 +19,3 @@ module Danica
17
19
  end
18
20
  end
19
21
  end
20
-