danica 1.0.0 → 1.1.0
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.
- checksums.yaml +4 -4
- data/Gemfile.lock +7 -1
- data/README.md +9 -5
- data/danica.gemspec +2 -0
- data/lib/danica/function.rb +18 -2
- data/lib/danica/function/class_methods.rb +11 -0
- data/lib/danica/function/division.rb +1 -9
- data/lib/danica/function/power.rb +1 -9
- data/lib/danica/function/square_root.rb +1 -5
- data/lib/danica/function/variables_builder.rb +34 -0
- data/lib/danica/variable.rb +8 -0
- data/lib/danica/version.rb +1 -1
- data/spec/lib/danica/function_spec.rb +139 -5
- metadata +32 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 05b7fa3ae186fb5821ec4db27048ff78db65b806
|
4
|
+
data.tar.gz: 4258d4543ccb64352a89543686599cabc93ad4aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df83dcbe526b2ed7ac74df6e69016ae68db54e62d3c22d78810f0d3fd9daa879e572ac22094f880faed6bec9e9238790b74f440a6da127abeb6b56078a7dbcfe
|
7
|
+
data.tar.gz: eebfc744cd15f9b483b8758a3c5f4f57008bebdaf2ebf471d19f9fca27e3b4a75342bce061a8b42ded63293a0923728549a3e13188a936338f3c766ec1a5c396
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
danica (1.
|
4
|
+
danica (1.1.0)
|
5
5
|
activemodel
|
6
6
|
activesupport
|
7
|
+
bidu-core_ext
|
8
|
+
concern_builder
|
7
9
|
|
8
10
|
GEM
|
9
11
|
remote: https://rubygems.org/
|
@@ -15,9 +17,13 @@ GEM
|
|
15
17
|
i18n (~> 0.7)
|
16
18
|
minitest (~> 5.1)
|
17
19
|
tzinfo (~> 1.1)
|
20
|
+
bidu-core_ext (1.2.2)
|
21
|
+
activesupport
|
18
22
|
codeclimate-test-reporter (0.5.0)
|
19
23
|
simplecov (>= 0.7.1, < 1.0.0)
|
20
24
|
coderay (1.1.1)
|
25
|
+
concern_builder (0.0.2)
|
26
|
+
activesupport
|
21
27
|
concurrent-ruby (1.0.2)
|
22
28
|
diff-lcs (1.2.5)
|
23
29
|
docile (1.1.5)
|
data/README.md
CHANGED
@@ -36,13 +36,13 @@ end
|
|
36
36
|
```ruby
|
37
37
|
class Danica::Function
|
38
38
|
class Spatial < Danica::Function
|
39
|
-
|
40
|
-
delegate :to_tex, to: :sum
|
39
|
+
variables :time, :acceleration, :initial_space, :initial_velocity
|
40
|
+
delegate :to_tex, :to_gnu, to: :sum
|
41
41
|
|
42
42
|
private
|
43
43
|
|
44
44
|
def sum
|
45
|
-
@sum ||= Sum.new(
|
45
|
+
@sum ||= Sum.new(parcels)
|
46
46
|
end
|
47
47
|
|
48
48
|
def parcels
|
@@ -53,12 +53,16 @@ class Danica::Function
|
|
53
53
|
]
|
54
54
|
end
|
55
55
|
|
56
|
+
def spatial_velocity
|
57
|
+
Product.new(initial_velocity, time)
|
58
|
+
end
|
59
|
+
|
56
60
|
def spatial_acceleration
|
57
|
-
Division.new(
|
61
|
+
Division.new(Product.new(acceleration, time_squared), 2)
|
58
62
|
end
|
59
63
|
|
60
64
|
def time_squared
|
61
|
-
Power.new(
|
65
|
+
Power.new(time, 2)
|
62
66
|
end
|
63
67
|
end
|
64
68
|
end
|
data/danica.gemspec
CHANGED
@@ -17,6 +17,8 @@ Gem::Specification.new do |spec|
|
|
17
17
|
|
18
18
|
spec.add_runtime_dependency 'activesupport'
|
19
19
|
spec.add_runtime_dependency 'activemodel'
|
20
|
+
spec.add_runtime_dependency 'concern_builder'
|
21
|
+
spec.add_runtime_dependency 'bidu-core_ext'
|
20
22
|
|
21
23
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
22
24
|
spec.add_development_dependency 'rake'
|
data/lib/danica/function.rb
CHANGED
@@ -2,6 +2,8 @@ module Danica
|
|
2
2
|
class Function
|
3
3
|
include ActiveModel::Model
|
4
4
|
|
5
|
+
require 'danica/function/variables_builder'
|
6
|
+
require 'danica/function/class_methods'
|
5
7
|
require 'danica/function/chained'
|
6
8
|
require 'danica/function/product'
|
7
9
|
require 'danica/function/sum'
|
@@ -10,6 +12,12 @@ module Danica
|
|
10
12
|
require 'danica/function/square_root'
|
11
13
|
|
12
14
|
attr_accessor :name, :variables
|
15
|
+
|
16
|
+
def initialize(*args)
|
17
|
+
options = args.extract_options!
|
18
|
+
|
19
|
+
super({ variables: args.flatten }.merge(options))
|
20
|
+
end
|
13
21
|
|
14
22
|
def to_f
|
15
23
|
raise 'Not IMplemented yet'
|
@@ -32,13 +40,21 @@ module Danica
|
|
32
40
|
end
|
33
41
|
|
34
42
|
def valued?
|
35
|
-
to_f.
|
43
|
+
to_f.present?
|
36
44
|
rescue Exception::NotDefined
|
37
45
|
false
|
38
46
|
end
|
47
|
+
|
48
|
+
def variables
|
49
|
+
@variables ||= variables_hash.values
|
50
|
+
end
|
39
51
|
|
52
|
+
def variables_hash
|
53
|
+
@variabels_map ||= (@variables || []).as_hash(self.class.variables_names)
|
54
|
+
end
|
55
|
+
|
40
56
|
private
|
41
|
-
|
57
|
+
|
42
58
|
def tex_string
|
43
59
|
raise 'Not IMplemented yet'
|
44
60
|
end
|
@@ -1,20 +1,12 @@
|
|
1
1
|
module Danica
|
2
2
|
class Function
|
3
3
|
class Division < Function
|
4
|
-
|
4
|
+
variables :numerator, :denominator
|
5
5
|
|
6
6
|
def to_f
|
7
7
|
numerator.to_f / denominator.to_f
|
8
8
|
end
|
9
9
|
|
10
|
-
def numerator=(value)
|
11
|
-
@numerator = wrap_value(value)
|
12
|
-
end
|
13
|
-
|
14
|
-
def denominator=(value)
|
15
|
-
@denominator = wrap_value(value)
|
16
|
-
end
|
17
|
-
|
18
10
|
private
|
19
11
|
|
20
12
|
def tex_string
|
@@ -1,20 +1,12 @@
|
|
1
1
|
module Danica
|
2
2
|
class Function
|
3
3
|
class Power < Function
|
4
|
-
|
4
|
+
variables :base, :exponent
|
5
5
|
|
6
6
|
def to_f
|
7
7
|
base.to_f ** exponent.to_f
|
8
8
|
end
|
9
9
|
|
10
|
-
def base=(value)
|
11
|
-
@base = wrap_value(value)
|
12
|
-
end
|
13
|
-
|
14
|
-
def exponent=(value)
|
15
|
-
@exponent = wrap_value(value)
|
16
|
-
end
|
17
|
-
|
18
10
|
private
|
19
11
|
|
20
12
|
def tex_string
|
@@ -1,16 +1,12 @@
|
|
1
1
|
module Danica
|
2
2
|
class Function
|
3
3
|
class SquareRoot < Function
|
4
|
-
|
4
|
+
variables :variable
|
5
5
|
|
6
6
|
def to_f
|
7
7
|
Math.sqrt(variable.to_f)
|
8
8
|
end
|
9
9
|
|
10
|
-
def variable=(value)
|
11
|
-
@variable = wrap_value(value)
|
12
|
-
end
|
13
|
-
|
14
10
|
private
|
15
11
|
|
16
12
|
def tex_string
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'concern_builder'
|
2
|
+
require 'bidu/core_ext'
|
3
|
+
|
4
|
+
class Danica::Function
|
5
|
+
class VariablesBuilder < ::ConcernBuilder
|
6
|
+
attr_reader :instance
|
7
|
+
|
8
|
+
def init
|
9
|
+
attr_names.each do |name|
|
10
|
+
add_setter(name)
|
11
|
+
add_reader(name)
|
12
|
+
instance.send(:variables_names) << name
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def add_setter(name)
|
19
|
+
code = <<-CODE
|
20
|
+
variables_hash[:#{name}] = wrap_value(value)
|
21
|
+
@variables = variables_hash.values
|
22
|
+
CODE
|
23
|
+
add_method("#{name}=(value)", code)
|
24
|
+
end
|
25
|
+
|
26
|
+
def add_reader(name)
|
27
|
+
code = <<-CODE
|
28
|
+
variables_hash[:#{name}]
|
29
|
+
CODE
|
30
|
+
add_method("#{name}", code)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
data/lib/danica/variable.rb
CHANGED
@@ -7,6 +7,14 @@ module Danica
|
|
7
7
|
value.nil? ? raise(Exception::NotDefined) : value.to_f
|
8
8
|
end
|
9
9
|
|
10
|
+
def ==(other)
|
11
|
+
return false unless other.class == Variable
|
12
|
+
return other.value == value &&
|
13
|
+
other.name == name &&
|
14
|
+
other.latex == latex &&
|
15
|
+
other.gnu == gnu
|
16
|
+
end
|
17
|
+
|
10
18
|
def to_tex
|
11
19
|
return value.to_tex if value
|
12
20
|
(latex || name).to_s
|
data/lib/danica/version.rb
CHANGED
@@ -3,13 +3,13 @@ require 'spec_helper'
|
|
3
3
|
describe Danica::Function do
|
4
4
|
class Danica::Function
|
5
5
|
class Spatial < Danica::Function
|
6
|
-
|
6
|
+
variables :time, :acceleration, :initial_space, :initial_velocity
|
7
7
|
delegate :to_tex, :to_gnu, to: :sum
|
8
8
|
|
9
9
|
private
|
10
10
|
|
11
11
|
def sum
|
12
|
-
@sum ||= Sum.new(
|
12
|
+
@sum ||= Sum.new(parcels)
|
13
13
|
end
|
14
14
|
|
15
15
|
def parcels
|
@@ -21,15 +21,15 @@ describe Danica::Function do
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def spatial_velocity
|
24
|
-
Product.new(
|
24
|
+
Product.new(initial_velocity, time)
|
25
25
|
end
|
26
26
|
|
27
27
|
def spatial_acceleration
|
28
|
-
Division.new(
|
28
|
+
Division.new(Product.new(acceleration, time_squared), 2)
|
29
29
|
end
|
30
30
|
|
31
31
|
def time_squared
|
32
|
-
Power.new(
|
32
|
+
Power.new(time, 2)
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
@@ -64,4 +64,138 @@ describe Danica::Function do
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
end
|
67
|
+
|
68
|
+
describe '#variables_hash' do
|
69
|
+
let(:expected) do
|
70
|
+
{
|
71
|
+
time: Danica::Variable.new(name: :t),
|
72
|
+
acceleration: Danica::Variable.new(name: 'a'),
|
73
|
+
initial_space: Danica::Variable.new( name: :S0, latex: 'S_0' ),
|
74
|
+
initial_velocity: Danica::Variable.new( name: :V0, latex: 'V_0' )
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'when variables are already wrapped with DanicaVariable' do
|
79
|
+
let(:variables) { expected }
|
80
|
+
it 'returns a hash with the variabels' do
|
81
|
+
expect(subject.variables_hash).to eq(expected)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'when variables have been defined with string name' do
|
86
|
+
before do
|
87
|
+
variables.change_keys!(&:to_s)
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'returns a hash with the variabels' do
|
91
|
+
expect(subject.variables_hash).to eq(expected)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'when variables are not wrapped yet' do
|
96
|
+
it 'returns a hash with the variabels' do
|
97
|
+
expect(subject.variables_hash).to eq(expected)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context 'when changing a variable' do
|
102
|
+
before do
|
103
|
+
subject.time = :x
|
104
|
+
expected[:time] = Danica::Variable.new(name: :x)
|
105
|
+
end
|
106
|
+
|
107
|
+
it do
|
108
|
+
expect(subject.variables_hash).to eq(expected)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context 'when initializing with array' do
|
113
|
+
context 'as hash' do
|
114
|
+
let(:variables) { [ :t, 'a', {name: :S0, latex: 'S_0'}, { name: :V0, latex: 'V_0' } ] }
|
115
|
+
let(:subject) { described_class::Spatial.new(variables) }
|
116
|
+
|
117
|
+
it 'returns a hash with the variabels' do
|
118
|
+
expect(subject.variables_hash).to eq(expected)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context 'when initializing with sequence' do
|
124
|
+
context 'as hash' do
|
125
|
+
let(:variables) { [ :t, 'a', {name: :S0, latex: 'S_0'}, { name: :V0, latex: 'V_0' } ] }
|
126
|
+
let(:subject) { described_class::Spatial.new(*variables, {}) }
|
127
|
+
|
128
|
+
it 'returns a hash with the variabels' do
|
129
|
+
expect(subject.variables_hash).to eq(expected)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'when initializing with variables array' do
|
135
|
+
context 'as hash' do
|
136
|
+
let(:variables) { [ :t, 'a', {name: :S0, latex: 'S_0'}, { name: :V0, latex: 'V_0' } ] }
|
137
|
+
let(:subject) { described_class::Spatial.new(variables: variables) }
|
138
|
+
|
139
|
+
it 'returns a hash with the variabels' do
|
140
|
+
expect(subject.variables_hash).to eq(expected)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
describe '#variables' do
|
147
|
+
context 'when initialized with an array of variables' do
|
148
|
+
let(:subject) { described_class::Spatial.new(variables: variables.values) }
|
149
|
+
let(:expected) { variables.values.map { |v| subject.send(:wrap_value, v)} }
|
150
|
+
it do
|
151
|
+
expect(subject.variables.compact).to eq(expected)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
context 'when not initializing all variables' do
|
156
|
+
let(:subject) { described_class::Spatial.new }
|
157
|
+
let(:time) { Danica::Variable.new(name: :t) }
|
158
|
+
|
159
|
+
context 'when initialized with an empty variable set' do
|
160
|
+
it do
|
161
|
+
expect(subject.variables.compact).to be_empty
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
context 'when changing a variable' do
|
166
|
+
before do
|
167
|
+
subject.time = time
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'returns the list of variables' do
|
171
|
+
expect(subject.variables.compact).to eq([ time ])
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
context 'when initializing with a variable set' do
|
176
|
+
let(:names) { [ :t, :a, :s0, :v0 ] }
|
177
|
+
let(:subject) { described_class::Spatial.new *names }
|
178
|
+
|
179
|
+
it 'returns the variables given oin initialization' do
|
180
|
+
expect(subject.variables.map(&:name)).to eq(names)
|
181
|
+
end
|
182
|
+
|
183
|
+
context 'when initializing variables with a hash out of order' do
|
184
|
+
let(:variables) do
|
185
|
+
{
|
186
|
+
initial_velocity: :v0,
|
187
|
+
initial_space: :s0,
|
188
|
+
acceleration: :a,
|
189
|
+
time: :t
|
190
|
+
}
|
191
|
+
end
|
192
|
+
let(:subject) { described_class::Spatial.new variables }
|
193
|
+
|
194
|
+
it 'returns the variables given on initialization' do
|
195
|
+
expect(subject.variables.map(&:name)).to eq(names)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
67
201
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: danica
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Darthjee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -38,6 +38,34 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: concern_builder
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bidu-core_ext
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: bundler
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -155,11 +183,13 @@ files:
|
|
155
183
|
- lib/danica/exception/not_defined.rb
|
156
184
|
- lib/danica/function.rb
|
157
185
|
- lib/danica/function/chained.rb
|
186
|
+
- lib/danica/function/class_methods.rb
|
158
187
|
- lib/danica/function/division.rb
|
159
188
|
- lib/danica/function/power.rb
|
160
189
|
- lib/danica/function/product.rb
|
161
190
|
- lib/danica/function/square_root.rb
|
162
191
|
- lib/danica/function/sum.rb
|
192
|
+
- lib/danica/function/variables_builder.rb
|
163
193
|
- lib/danica/number.rb
|
164
194
|
- lib/danica/variable.rb
|
165
195
|
- lib/danica/version.rb
|