danica 2.7.2 → 2.7.7

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