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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c0bec4abc5efa33fcc9f79013f97f931ed7c5ab1
4
- data.tar.gz: a25945039a85d4bf73065dbad1c869a6efde096e
3
+ metadata.gz: 5416ce6623bcb51712442348a4448680547eee2f
4
+ data.tar.gz: 98bec05528369e27984bac348b22df71ae7a1ab0
5
5
  SHA512:
6
- metadata.gz: 5fcdc1c966251aeb76a232c7b8f5c182901a72885ab054fc2dbd46fec5490a9f9ce6ce42dc56a344a7aea2dbda1fa291f89a2e87e95a4a10da626de84ba476c9
7
- data.tar.gz: d629265f46eb5a8f9f223a8c8079f057f133658674eca2b4d32d534d6b21aa7516ddaab40f1e0ade421d6f47f9c1b48058d8b24ea78ae708fb2e613bcaf1f465
6
+ metadata.gz: 7a090956b7255abb57bc948fa29a1149353a061568948f4ad68c623b3d57c3b6b1aacf130a6ac47e92e105ef5b30d240b86c2049497420d87c4acdbe9b4a8c64
7
+ data.tar.gz: 7af816a52eaab8f41f87920d1d7ed6fa72d5fe079dda3227d0f28f81537bf8995b4b76182ac243088fbb22c488dd64112f49866a7a852b0ac24074afa3252579
data/Gemfile CHANGED
@@ -5,3 +5,4 @@ gemspec
5
5
 
6
6
  gem "rake", "~> 12.0"
7
7
  gem "rspec", "~> 3.0"
8
+ gem 'pry'
@@ -1,12 +1,17 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fuelator (0.1.6)
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
 
@@ -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
@@ -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
- # Calculation of fuel required for flight based on input params
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
@@ -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, :directives_sequential
9
+ attr_reader :mass, :pairs, :order
9
10
 
10
- def initialize(params)
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?
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
- private
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
- def validate!
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?(Float)
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 valid_directives_sequential?
42
- !directives_sequential
33
+ def valid_order?
34
+ !order
43
35
  end
44
36
 
45
- def directives_sequential?
46
- directive = nil
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 directive == pair.directive
41
+ return true if dir == pair.directive
49
42
 
50
- directive = pair.directive
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
- Pair::DIRECTIVES.include?(directive) && directive.is_a?(Symbol)
17
+ DIRECTIVES.include?(directive) && directive.is_a?(Symbol)
23
18
  end
24
19
 
25
20
  def valid_gravity?
26
- !gravity.nil? && gravity.is_a?(Float)
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
@@ -1,3 +1,3 @@
1
1
  module Fuelator
2
- VERSION = "0.1.6"
2
+ VERSION = "0.1.9"
3
3
  end
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.6
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-24 00:00:00.000000000 Z
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:
@@ -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