fuelator 0.1.0 → 0.1.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.
- checksums.yaml +4 -4
- data/Gemfile +0 -1
- data/Gemfile.lock +2 -8
- data/README.md +12 -0
- data/bin/{fuelator.rb → fuelator} +9 -1
- data/bin/setup +0 -0
- data/lib/fuelator.rb +9 -11
- data/lib/fuelator/parameters.rb +31 -17
- data/lib/fuelator/parameters/pair.rb +30 -0
- data/lib/fuelator/version.rb +1 -1
- metadata +4 -4
- data/lib/fuelator/parameters/error.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c0bec4abc5efa33fcc9f79013f97f931ed7c5ab1
|
4
|
+
data.tar.gz: a25945039a85d4bf73065dbad1c869a6efde096e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5fcdc1c966251aeb76a232c7b8f5c182901a72885ab054fc2dbd46fec5490a9f9ce6ce42dc56a344a7aea2dbda1fa291f89a2e87e95a4a10da626de84ba476c9
|
7
|
+
data.tar.gz: d629265f46eb5a8f9f223a8c8079f057f133658674eca2b4d32d534d6b21aa7516ddaab40f1e0ade421d6f47f9c1b48058d8b24ea78ae708fb2e613bcaf1f465
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,17 +1,12 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
fuelator
|
4
|
+
fuelator (0.1.6)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
|
-
coderay (1.1.3)
|
10
9
|
diff-lcs (1.3)
|
11
|
-
method_source (1.0.0)
|
12
|
-
pry (0.13.1)
|
13
|
-
coderay (~> 1.1)
|
14
|
-
method_source (~> 1.0)
|
15
10
|
rake (12.3.3)
|
16
11
|
rspec (3.8.0)
|
17
12
|
rspec-core (~> 3.8.0)
|
@@ -31,8 +26,7 @@ PLATFORMS
|
|
31
26
|
ruby
|
32
27
|
|
33
28
|
DEPENDENCIES
|
34
|
-
fuelator
|
35
|
-
pry
|
29
|
+
fuelator!
|
36
30
|
rake (~> 12.0)
|
37
31
|
rspec (~> 3.0)
|
38
32
|
|
data/README.md
CHANGED
@@ -24,6 +24,18 @@ If you plan a trip to Moon, once you are at fuel station, run:
|
|
24
24
|
|
25
25
|
$ fuelator 28801, [[:launch, 9.807], [:land, 1.62], [:launch, 1.62], [:land, 9.807]]
|
26
26
|
|
27
|
+
Or use API provided:
|
28
|
+
```ruby
|
29
|
+
require 'fuelator'
|
30
|
+
|
31
|
+
Fuelator.calculate(28801, [[:launch, 9.807], [:land, 1.62], [:launch, 1.62], [:land, 9.807]])
|
32
|
+
# => 51898
|
33
|
+
```
|
34
|
+
Be ready do handle errors:
|
35
|
+
```ruby
|
36
|
+
Fuelator::Parameters::Error
|
37
|
+
```
|
38
|
+
|
27
39
|
## Development
|
28
40
|
|
29
41
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -26,9 +26,17 @@ end
|
|
26
26
|
optparse.parse!
|
27
27
|
|
28
28
|
def run(params, verbose)
|
29
|
+
if params.count == 0
|
30
|
+
log("run `fuelator -h` for help")
|
31
|
+
return
|
32
|
+
end
|
29
33
|
result = Fuelator.calculate(params)
|
30
34
|
log "#{result.to_i} kg"
|
31
|
-
rescue Fuelator::Error => e
|
35
|
+
rescue Fuelator::Parameters::Error, StandardError => e
|
36
|
+
log_error(e, verbose)
|
37
|
+
end
|
38
|
+
|
39
|
+
def log_error(e, verbose)
|
32
40
|
log e
|
33
41
|
log e.backtrace if verbose
|
34
42
|
false
|
data/bin/setup
CHANGED
File without changes
|
data/lib/fuelator.rb
CHANGED
@@ -23,7 +23,8 @@ module Fuelator
|
|
23
23
|
}
|
24
24
|
|
25
25
|
# @param [Array] params
|
26
|
-
#
|
26
|
+
# Example:
|
27
|
+
# [123, [[:launch, 123]]] or flatten [123, :launch, 123]
|
27
28
|
# params are validated and validation error may be raised
|
28
29
|
# @return Float - fuel for a flight
|
29
30
|
def self.calculate(*params)
|
@@ -31,26 +32,23 @@ module Fuelator
|
|
31
32
|
|
32
33
|
full_mass = parameters.mass
|
33
34
|
|
34
|
-
parameters.
|
35
|
+
parameters.pairs.reverse.map do |val|
|
35
36
|
full_mass += recursive_calculate(full_mass, val)
|
36
37
|
end.last - parameters.mass
|
37
38
|
end
|
38
39
|
|
39
40
|
private
|
40
41
|
|
41
|
-
def self.recursive_calculate(mass,
|
42
|
-
directive =
|
43
|
-
gravity =
|
42
|
+
def self.recursive_calculate(mass, pair)
|
43
|
+
directive = pair.directive
|
44
|
+
gravity = pair.gravity
|
44
45
|
constants = FLIGHT_CONSTANTS[directive]
|
45
46
|
|
46
|
-
|
47
|
-
|
48
|
-
rescue StandardError => e
|
49
|
-
raise Error.new(e.message)
|
50
|
-
end
|
47
|
+
fuel_mass = (mass * gravity * constants[:theta] - constants[:bias]).to_i # rounded down
|
48
|
+
|
51
49
|
|
52
50
|
return 0 if fuel_mass <= 0
|
53
|
-
result = recursive_calculate(fuel_mass,
|
51
|
+
result = recursive_calculate(fuel_mass, pair)
|
54
52
|
fuel_mass + result
|
55
53
|
end
|
56
54
|
end
|
data/lib/fuelator/parameters.rb
CHANGED
@@ -1,14 +1,18 @@
|
|
1
|
-
require 'fuelator/parameters/
|
1
|
+
require 'fuelator/parameters/pair'
|
2
2
|
# For flight parameters validation purposes
|
3
3
|
|
4
4
|
module Fuelator
|
5
5
|
class Parameters
|
6
|
-
|
6
|
+
class Error < StandardError; end
|
7
|
+
|
8
|
+
attr_reader :mass, :pairs, :directives_sequential
|
7
9
|
|
8
10
|
def initialize(params)
|
9
|
-
params
|
10
|
-
@mass
|
11
|
-
@
|
11
|
+
params = normalize(params)
|
12
|
+
@mass = params[0]
|
13
|
+
@pairs = params[1..-1].each_slice(2).to_a
|
14
|
+
.map { |pair| Pair.new(pair) }
|
15
|
+
@directives_sequential = directives_sequential?
|
12
16
|
|
13
17
|
validate!
|
14
18
|
end
|
@@ -20,22 +24,32 @@ module Fuelator
|
|
20
24
|
end
|
21
25
|
|
22
26
|
def validate!
|
23
|
-
|
24
|
-
|
27
|
+
instance_variables.each do |v|
|
28
|
+
v_name = v.to_s.gsub(/^@/, '')
|
29
|
+
raise Error.new("value for #{v_name} is invalid") unless send("valid_#{v_name}?")
|
30
|
+
end
|
25
31
|
end
|
26
32
|
|
27
|
-
def
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
dir = pair[0]
|
34
|
-
end
|
33
|
+
def valid_mass?
|
34
|
+
!mass.nil? && mass.is_a?(Float)
|
35
|
+
end
|
36
|
+
|
37
|
+
def valid_pairs?
|
38
|
+
!pairs.empty?
|
35
39
|
end
|
36
40
|
|
37
|
-
def
|
38
|
-
|
41
|
+
def valid_directives_sequential?
|
42
|
+
!directives_sequential
|
43
|
+
end
|
44
|
+
|
45
|
+
def directives_sequential?
|
46
|
+
directive = nil
|
47
|
+
pairs.map do |pair|
|
48
|
+
return true if directive == pair.directive
|
49
|
+
|
50
|
+
directive = pair.directive
|
51
|
+
end
|
52
|
+
false
|
39
53
|
end
|
40
54
|
end
|
41
55
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Fuelator
|
2
|
+
class Parameters
|
3
|
+
class Pair
|
4
|
+
DIRECTIVES = [:launch, :land]
|
5
|
+
attr_reader :directive, :gravity
|
6
|
+
|
7
|
+
def initialize(pair)
|
8
|
+
@directive = pair[0]
|
9
|
+
@gravity = pair[1]
|
10
|
+
|
11
|
+
validate!
|
12
|
+
end
|
13
|
+
|
14
|
+
def validate!
|
15
|
+
instance_variables.each do |v|
|
16
|
+
v_name = v.to_s.gsub(/^@/, '')
|
17
|
+
raise Error.new("value for #{v_name} is invalid") unless send("valid_#{v_name}?")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def valid_directive?
|
22
|
+
Pair::DIRECTIVES.include?(directive) && directive.is_a?(Symbol)
|
23
|
+
end
|
24
|
+
|
25
|
+
def valid_gravity?
|
26
|
+
!gravity.nil? && gravity.is_a?(Float)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/fuelator/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fuelator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sergii Brytiuk
|
@@ -18,7 +18,7 @@ email:
|
|
18
18
|
- brytiuk076@gmail.com
|
19
19
|
executables:
|
20
20
|
- console
|
21
|
-
- fuelator
|
21
|
+
- fuelator
|
22
22
|
- setup
|
23
23
|
extensions: []
|
24
24
|
extra_rdoc_files: []
|
@@ -33,12 +33,12 @@ files:
|
|
33
33
|
- README.md
|
34
34
|
- Rakefile
|
35
35
|
- bin/console
|
36
|
-
- bin/fuelator
|
36
|
+
- bin/fuelator
|
37
37
|
- bin/setup
|
38
38
|
- fuelator.gemspec
|
39
39
|
- lib/fuelator.rb
|
40
40
|
- lib/fuelator/parameters.rb
|
41
|
-
- lib/fuelator/parameters/
|
41
|
+
- lib/fuelator/parameters/pair.rb
|
42
42
|
- lib/fuelator/version.rb
|
43
43
|
homepage: https://github.com/645383/fuelator
|
44
44
|
licenses:
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# Flight parameters validation error,
|
2
|
-
# Add error descriptive message to map of messages when new validation case added
|
3
|
-
|
4
|
-
module Fuelator
|
5
|
-
class Parameters
|
6
|
-
class Error < StandardError
|
7
|
-
MESSAGES = {
|
8
|
-
format: "directive/gravity pairs should be in format string/float: directive: %s, gravity: %s",
|
9
|
-
sequence: "you can not pass 2 same directives in a sequence: %s => %s",
|
10
|
-
mass: "mass should be float: %s",
|
11
|
-
pairs: "provide pairs for directive/gravity: %s elements"
|
12
|
-
}
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|