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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 84c07b0359c805681e31d8e45cfbdb44bc608984
4
- data.tar.gz: 1ded9d2012fd3de28786d3e7456023c18b8564cd
3
+ metadata.gz: c0bec4abc5efa33fcc9f79013f97f931ed7c5ab1
4
+ data.tar.gz: a25945039a85d4bf73065dbad1c869a6efde096e
5
5
  SHA512:
6
- metadata.gz: a70f869c85fdc639b9930370944dfd2a31543478afaa1b8adb6eeab24e3ee524847cb9eacc8325d914941f7000d5be24fb4927035b1c6e2e2bbef832affa3223
7
- data.tar.gz: 8d4b262fe7082c29d2280ede76c41665423ca85eee660fd0ef25a9ab45284c8290e2e0f2ebabc59e95c73e34917d969ed7ba1650ec7fc3ac1d9ef78691e6764f
6
+ metadata.gz: 5fcdc1c966251aeb76a232c7b8f5c182901a72885ab054fc2dbd46fec5490a9f9ce6ce42dc56a344a7aea2dbda1fa291f89a2e87e95a4a10da626de84ba476c9
7
+ data.tar.gz: d629265f46eb5a8f9f223a8c8079f057f133658674eca2b4d32d534d6b21aa7516ddaab40f1e0ade421d6f47f9c1b48058d8b24ea78ae708fb2e613bcaf1f465
data/Gemfile CHANGED
@@ -5,4 +5,3 @@ gemspec
5
5
 
6
6
  gem "rake", "~> 12.0"
7
7
  gem "rspec", "~> 3.0"
8
- gem 'pry'
@@ -1,17 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fuelator.rb (0.1.0)
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.rb!
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
@@ -23,7 +23,8 @@ module Fuelator
23
23
  }
24
24
 
25
25
  # @param [Array] params
26
- # [123, [[:launch, 123]]] or flatten [123, :launch, 123]
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.dir_grav_pairs.reverse.map do |val|
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, params)
42
- directive = params[0]
43
- gravity = params[1]
42
+ def self.recursive_calculate(mass, pair)
43
+ directive = pair.directive
44
+ gravity = pair.gravity
44
45
  constants = FLIGHT_CONSTANTS[directive]
45
46
 
46
- begin
47
- fuel_mass = (mass * gravity * constants[:theta] - constants[:bias]).to_i # rounded down
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, params)
51
+ result = recursive_calculate(fuel_mass, pair)
54
52
  fuel_mass + result
55
53
  end
56
54
  end
@@ -1,14 +1,18 @@
1
- require 'fuelator/parameters/error'
1
+ require 'fuelator/parameters/pair'
2
2
  # For flight parameters validation purposes
3
3
 
4
4
  module Fuelator
5
5
  class Parameters
6
- attr_reader :mass, :dir_grav_pairs
6
+ class Error < StandardError; end
7
+
8
+ attr_reader :mass, :pairs, :directives_sequential
7
9
 
8
10
  def initialize(params)
9
- params = normalize(params)
10
- @mass = params[0]
11
- @dir_grav_pairs = params[1..-1].each_slice(2).to_a
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
- error(:mass, mass) unless mass.is_a?(Float)
24
- validate_pairs!
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 validate_pairs!
28
- dir = nil
29
- dir_grav_pairs.each do |pair|
30
- error(:pairs, pair.count) if (pair.count % 2) != 0
31
- error(:format, pair[0], pair[1]) unless pair[0].is_a?(Symbol) && pair[1].is_a?(Float)
32
- error(:sequence, dir, pair[0]) if dir == pair[0] # no same directives allowed in a sequence
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 error(type, *args)
38
- raise Error.new Error::MESSAGES[type] % args
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
@@ -1,3 +1,3 @@
1
1
  module Fuelator
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.6"
3
3
  end
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.0
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.rb
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.rb
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/error.rb
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