fuelator 0.1.6 → 0.1.9
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 +1 -0
- data/Gemfile.lock +7 -1
- data/bin/fuelator.rb +85 -0
- data/lib/fuelator.rb +3 -49
- data/lib/fuelator/calc.rb +46 -0
- data/lib/fuelator/parameters.rb +18 -25
- data/lib/fuelator/parameters/pair.rb +4 -9
- data/lib/fuelator/parameters/validator.rb +15 -0
- data/lib/fuelator/version.rb +1 -1
- metadata +6 -4
- data/bin/fuelator +0 -45
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5416ce6623bcb51712442348a4448680547eee2f
|
4
|
+
data.tar.gz: 98bec05528369e27984bac348b22df71ae7a1ab0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a090956b7255abb57bc948fa29a1149353a061568948f4ad68c623b3d57c3b6b1aacf130a6ac47e92e105ef5b30d240b86c2049497420d87c4acdbe9b4a8c64
|
7
|
+
data.tar.gz: 7af816a52eaab8f41f87920d1d7ed6fa72d5fe079dda3227d0f28f81537bf8995b4b76182ac243088fbb22c488dd64112f49866a7a852b0ac24074afa3252579
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,12 +1,17 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
fuelator (0.1.
|
4
|
+
fuelator (0.1.8)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
|
+
coderay (1.1.3)
|
9
10
|
diff-lcs (1.3)
|
11
|
+
method_source (1.0.0)
|
12
|
+
pry (0.13.1)
|
13
|
+
coderay (~> 1.1)
|
14
|
+
method_source (~> 1.0)
|
10
15
|
rake (12.3.3)
|
11
16
|
rspec (3.8.0)
|
12
17
|
rspec-core (~> 3.8.0)
|
@@ -27,6 +32,7 @@ PLATFORMS
|
|
27
32
|
|
28
33
|
DEPENDENCIES
|
29
34
|
fuelator!
|
35
|
+
pry
|
30
36
|
rake (~> 12.0)
|
31
37
|
rspec (~> 3.0)
|
32
38
|
|
data/bin/fuelator.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "fuelator"
|
4
|
+
require 'optparse'
|
5
|
+
|
6
|
+
class OptsParser
|
7
|
+
Version = Fuelator::VERSION
|
8
|
+
|
9
|
+
class Options
|
10
|
+
attr_accessor :verbose, :mass, :pairs
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@verbose = false
|
14
|
+
@mass = 0
|
15
|
+
@pairs = []
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.parse
|
20
|
+
@options = Options.new
|
21
|
+
parser.parse!
|
22
|
+
@options
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.parser
|
26
|
+
@parser ||= OptionParser.new do |parser|
|
27
|
+
parser.banner = "Usage: fuelator [options]"
|
28
|
+
parser.separator ""
|
29
|
+
parser.separator "Specific options:"
|
30
|
+
|
31
|
+
boolean_verbose_option parser
|
32
|
+
float_mass_option(parser)
|
33
|
+
list_pairs_option(parser)
|
34
|
+
|
35
|
+
parser.separator ""
|
36
|
+
parser.separator "Common options:"
|
37
|
+
# No argument, shows at tail. This will print an options summary.
|
38
|
+
# Try it and see!
|
39
|
+
parser.on_tail("-h", "--help", "Show this message") do
|
40
|
+
puts parser
|
41
|
+
exit
|
42
|
+
end
|
43
|
+
# Another typical switch to print the version.
|
44
|
+
parser.on_tail("--version", "Show version") do
|
45
|
+
puts Version
|
46
|
+
exit
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.boolean_verbose_option(parser)
|
52
|
+
# Boolean switch.
|
53
|
+
parser.on("-v", "--[no-]verbose", "Show error backtrace") do |v|
|
54
|
+
@options.verbose = v
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.float_mass_option(parser)
|
59
|
+
# Mass required float option.
|
60
|
+
parser.on("-m", "--mass MASS", Float, "Space ship mass") do |v|
|
61
|
+
@options.mass = v
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.list_pairs_option(parser)
|
66
|
+
# List of arguments.
|
67
|
+
parser.on("-p", "--pair PAIRS", Array, "Directive/gravity comma separated pairs: -p launch,9.2 -p land,2.2") do |list|
|
68
|
+
list = list.map { |v| (!!Float(v) rescue false) ? v.to_f : v.to_sym }
|
69
|
+
@options.pairs << list
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def run_script
|
75
|
+
options = OptsParser.parse
|
76
|
+
begin
|
77
|
+
puts "#{Fuelator::Calc.new(options.mass, options.pairs).run} kg"
|
78
|
+
rescue Fuelator::Parameters::Error, StandardError => e
|
79
|
+
puts e
|
80
|
+
puts e.backtrace if options.verbose
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
ARGV << '-h' if ARGV.empty?
|
85
|
+
run_script
|
data/lib/fuelator.rb
CHANGED
@@ -1,54 +1,8 @@
|
|
1
1
|
require "fuelator/version"
|
2
|
+
require 'fuelator/parameters/validator'
|
3
|
+
require 'fuelator/parameters/pair'
|
2
4
|
require "fuelator/parameters"
|
3
|
-
|
5
|
+
require "fuelator/calc"
|
4
6
|
|
5
7
|
module Fuelator
|
6
|
-
# Calculate fuel for a flight
|
7
|
-
#
|
8
|
-
# Example:
|
9
|
-
# >> Fuelator.calculate(28801, [[:launch, 9.807], [:land, 1.62], [:launch, 1.62], [:land, 9.807]])
|
10
|
-
# => 51898
|
11
|
-
|
12
|
-
class Error < StandardError; end
|
13
|
-
|
14
|
-
FLIGHT_CONSTANTS = {
|
15
|
-
launch: {
|
16
|
-
theta: 0.042,
|
17
|
-
bias: 33,
|
18
|
-
},
|
19
|
-
land: {
|
20
|
-
theta: 0.033,
|
21
|
-
bias: 42,
|
22
|
-
},
|
23
|
-
}
|
24
|
-
|
25
|
-
# @param [Array] params
|
26
|
-
# Example:
|
27
|
-
# [123, [[:launch, 123]]] or flatten [123, :launch, 123]
|
28
|
-
# params are validated and validation error may be raised
|
29
|
-
# @return Float - fuel for a flight
|
30
|
-
def self.calculate(*params)
|
31
|
-
parameters = Parameters.new(params)
|
32
|
-
|
33
|
-
full_mass = parameters.mass
|
34
|
-
|
35
|
-
parameters.pairs.reverse.map do |val|
|
36
|
-
full_mass += recursive_calculate(full_mass, val)
|
37
|
-
end.last - parameters.mass
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
def self.recursive_calculate(mass, pair)
|
43
|
-
directive = pair.directive
|
44
|
-
gravity = pair.gravity
|
45
|
-
constants = FLIGHT_CONSTANTS[directive]
|
46
|
-
|
47
|
-
fuel_mass = (mass * gravity * constants[:theta] - constants[:bias]).to_i # rounded down
|
48
|
-
|
49
|
-
|
50
|
-
return 0 if fuel_mass <= 0
|
51
|
-
result = recursive_calculate(fuel_mass, pair)
|
52
|
-
fuel_mass + result
|
53
|
-
end
|
54
8
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# Calculation of fuel required for flight based on input params
|
2
|
+
|
3
|
+
module Fuelator
|
4
|
+
# Calculate fuel for a flight
|
5
|
+
#
|
6
|
+
# Example:
|
7
|
+
# >> Fuelator.Calc.new(28801, [[:launch, 9.807], [:land, 1.62], [:launch, 1.62], [:land, 9.807]]).run
|
8
|
+
# => 51898
|
9
|
+
class Calc
|
10
|
+
attr_reader :parameters
|
11
|
+
|
12
|
+
FLIGHT_CONSTANTS = {
|
13
|
+
launch: {
|
14
|
+
theta: 0.042,
|
15
|
+
bias: 33,
|
16
|
+
},
|
17
|
+
land: {
|
18
|
+
theta: 0.033,
|
19
|
+
bias: 42,
|
20
|
+
},
|
21
|
+
}
|
22
|
+
|
23
|
+
def initialize(mass, pairs)
|
24
|
+
@parameters = Parameters.new(mass, pairs)
|
25
|
+
end
|
26
|
+
|
27
|
+
def run
|
28
|
+
full_mass = parameters.mass
|
29
|
+
|
30
|
+
parameters.reversed.map do |val|
|
31
|
+
full_mass += recursive_calculate(full_mass, val)
|
32
|
+
end.last - parameters.mass
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def recursive_calculate(mass, pair)
|
38
|
+
constants = FLIGHT_CONSTANTS[pair.directive]
|
39
|
+
fuel_mass = (mass * pair.gravity * constants[:theta] - constants[:bias]).to_i # rounded down
|
40
|
+
|
41
|
+
return 0 if fuel_mass <= 0
|
42
|
+
result = recursive_calculate(fuel_mass, pair)
|
43
|
+
fuel_mass + result
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/fuelator/parameters.rb
CHANGED
@@ -1,53 +1,46 @@
|
|
1
|
-
require 'fuelator/parameters/pair'
|
2
1
|
# For flight parameters validation purposes
|
3
2
|
|
4
3
|
module Fuelator
|
5
4
|
class Parameters
|
5
|
+
include Validator
|
6
|
+
|
6
7
|
class Error < StandardError; end
|
7
8
|
|
8
|
-
attr_reader :mass, :pairs, :
|
9
|
+
attr_reader :mass, :pairs, :order
|
9
10
|
|
10
|
-
def initialize(
|
11
|
-
|
12
|
-
@
|
13
|
-
@
|
14
|
-
.map { |pair| Pair.new(pair) }
|
15
|
-
@directives_sequential = directives_sequential?
|
11
|
+
def initialize(mass, pairs)
|
12
|
+
@mass = mass
|
13
|
+
@pairs = pairs.map { |pair| Pair.new(pair) }
|
14
|
+
@order = define_order
|
16
15
|
|
17
16
|
validate!
|
18
17
|
end
|
19
18
|
|
20
|
-
|
21
|
-
|
22
|
-
def normalize(params)
|
23
|
-
params.flatten.map { |v| (!!Float(v) rescue false) ? v.to_f : v.to_sym }
|
19
|
+
def reversed
|
20
|
+
pairs.reverse
|
24
21
|
end
|
25
22
|
|
26
|
-
|
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
|
31
|
-
end
|
23
|
+
private
|
32
24
|
|
33
25
|
def valid_mass?
|
34
|
-
!mass.nil? && mass.is_a?(
|
26
|
+
!mass.nil? && mass.is_a?(Numeric)
|
35
27
|
end
|
36
28
|
|
37
29
|
def valid_pairs?
|
38
30
|
!pairs.empty?
|
39
31
|
end
|
40
32
|
|
41
|
-
def
|
42
|
-
!
|
33
|
+
def valid_order?
|
34
|
+
!order
|
43
35
|
end
|
44
36
|
|
45
|
-
|
46
|
-
|
37
|
+
# you can only calculate if directives passed in right order - :launch->:land
|
38
|
+
def define_order
|
39
|
+
dir = nil
|
47
40
|
pairs.map do |pair|
|
48
|
-
return true if
|
41
|
+
return true if dir == pair.directive
|
49
42
|
|
50
|
-
|
43
|
+
dir = pair.directive
|
51
44
|
end
|
52
45
|
false
|
53
46
|
end
|
@@ -1,7 +1,9 @@
|
|
1
1
|
module Fuelator
|
2
2
|
class Parameters
|
3
3
|
class Pair
|
4
|
+
include Validator
|
4
5
|
DIRECTIVES = [:launch, :land]
|
6
|
+
|
5
7
|
attr_reader :directive, :gravity
|
6
8
|
|
7
9
|
def initialize(pair)
|
@@ -11,19 +13,12 @@ module Fuelator
|
|
11
13
|
validate!
|
12
14
|
end
|
13
15
|
|
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
16
|
def valid_directive?
|
22
|
-
|
17
|
+
DIRECTIVES.include?(directive) && directive.is_a?(Symbol)
|
23
18
|
end
|
24
19
|
|
25
20
|
def valid_gravity?
|
26
|
-
!gravity.nil? && gravity.is_a?(
|
21
|
+
!gravity.nil? && gravity.is_a?(Numeric)
|
27
22
|
end
|
28
23
|
end
|
29
24
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Fuelator
|
2
|
+
class Parameters
|
3
|
+
module Validator
|
4
|
+
|
5
|
+
# runs #valid_[variable]? method for every instance variable
|
6
|
+
# raises Error defined in parent namespace
|
7
|
+
def validate!
|
8
|
+
instance_variables.each do |v|
|
9
|
+
v_name = v.to_s.gsub(/^@/, '')
|
10
|
+
raise Error.new("value for #{v_name} is invalid") unless send("valid_#{v_name}?")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/fuelator/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sergii Brytiuk
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-07-
|
11
|
+
date: 2020-07-26 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |-
|
14
14
|
The goal of this application is to calculate fuel
|
@@ -18,7 +18,7 @@ email:
|
|
18
18
|
- brytiuk076@gmail.com
|
19
19
|
executables:
|
20
20
|
- console
|
21
|
-
- fuelator
|
21
|
+
- fuelator.rb
|
22
22
|
- setup
|
23
23
|
extensions: []
|
24
24
|
extra_rdoc_files: []
|
@@ -33,12 +33,14 @@ files:
|
|
33
33
|
- README.md
|
34
34
|
- Rakefile
|
35
35
|
- bin/console
|
36
|
-
- bin/fuelator
|
36
|
+
- bin/fuelator.rb
|
37
37
|
- bin/setup
|
38
38
|
- fuelator.gemspec
|
39
39
|
- lib/fuelator.rb
|
40
|
+
- lib/fuelator/calc.rb
|
40
41
|
- lib/fuelator/parameters.rb
|
41
42
|
- lib/fuelator/parameters/pair.rb
|
43
|
+
- lib/fuelator/parameters/validator.rb
|
42
44
|
- lib/fuelator/version.rb
|
43
45
|
homepage: https://github.com/645383/fuelator
|
44
46
|
licenses:
|
data/bin/fuelator
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "fuelator"
|
4
|
-
require 'optionparser'
|
5
|
-
|
6
|
-
def log(object)
|
7
|
-
STDERR.puts object
|
8
|
-
end
|
9
|
-
|
10
|
-
verbose = false
|
11
|
-
|
12
|
-
optparse = OptionParser.new do |opts|
|
13
|
-
opts.banner = "Usage: fuelator [args]"
|
14
|
-
|
15
|
-
opts.separator "Args sample: 28801 launch 9.807 land 1.62 launch 1.62 land 9.807"
|
16
|
-
opts.separator "Where 28801 - flight ship mass"
|
17
|
-
opts.separator "directive/gravity pairs:"
|
18
|
-
opts.separator " launch - flight directive"
|
19
|
-
opts.separator " 1.62 - target planet gravity"
|
20
|
-
opts.separator "Add as many directive/gravity pairs as you wish. Note, you can not pass 2 same directives in a sequence."
|
21
|
-
|
22
|
-
opts.on("-v", "--verbose", "Verbose mode") do |v|
|
23
|
-
verbose = v
|
24
|
-
end
|
25
|
-
end
|
26
|
-
optparse.parse!
|
27
|
-
|
28
|
-
def run(params, verbose)
|
29
|
-
if params.count == 0
|
30
|
-
log("run `fuelator -h` for help")
|
31
|
-
return
|
32
|
-
end
|
33
|
-
result = Fuelator.calculate(params)
|
34
|
-
log "#{result.to_i} kg"
|
35
|
-
rescue Fuelator::Parameters::Error, StandardError => e
|
36
|
-
log_error(e, verbose)
|
37
|
-
end
|
38
|
-
|
39
|
-
def log_error(e, verbose)
|
40
|
-
log e
|
41
|
-
log e.backtrace if verbose
|
42
|
-
false
|
43
|
-
end
|
44
|
-
|
45
|
-
exit 1 unless run ARGV, verbose
|