fuelator 0.1.4 → 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: ca8f288aaca9783d8bae901f60d407142f4132e0
4
- data.tar.gz: 4bd994d1b88bf000b2d41ff915abbb32e65c15a5
3
+ metadata.gz: c0bec4abc5efa33fcc9f79013f97f931ed7c5ab1
4
+ data.tar.gz: a25945039a85d4bf73065dbad1c869a6efde096e
5
5
  SHA512:
6
- metadata.gz: 516dff6979b493648379ced6cb27b82b6aaf9569bf63350d99277bbb32cdb1ed2b0379b818bd5195ab3f75db7b17b0c2c048ad0f7441a99b8573fd8ce11de3f0
7
- data.tar.gz: cd9347c040138684336e99bb551a64ca69e9befc3a87eb5c9722ddc4cc3b656c673ff5729d3677ecfc2f8d04052a6d55a2f8eec84fca1c2dd10efcfe528a2434
6
+ metadata.gz: 5fcdc1c966251aeb76a232c7b8f5c182901a72885ab054fc2dbd46fec5490a9f9ce6ce42dc56a344a7aea2dbda1fa291f89a2e87e95a4a10da626de84ba476c9
7
+ data.tar.gz: d629265f46eb5a8f9f223a8c8079f057f133658674eca2b4d32d534d6b21aa7516ddaab40f1e0ade421d6f47f9c1b48058d8b24ea78ae708fb2e613bcaf1f465
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fuelator (0.1.4)
4
+ fuelator (0.1.6)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -31,6 +31,11 @@ require 'fuelator'
31
31
  Fuelator.calculate(28801, [[:launch, 9.807], [:land, 1.62], [:launch, 1.62], [:land, 9.807]])
32
32
  # => 51898
33
33
  ```
34
+ Be ready do handle errors:
35
+ ```ruby
36
+ Fuelator::Parameters::Error
37
+ ```
38
+
34
39
  ## Development
35
40
 
36
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.
@@ -32,9 +32,7 @@ def run(params, verbose)
32
32
  end
33
33
  result = Fuelator.calculate(params)
34
34
  log "#{result.to_i} kg"
35
- rescue Fuelator::Error, Fuelator::Parameters::Error => e
36
- log_error(e, verbose)
37
- rescue StandardError => e
35
+ rescue Fuelator::Parameters::Error, StandardError => e
38
36
  log_error(e, verbose)
39
37
  end
40
38
 
@@ -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.4"
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.4
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergii Brytiuk
@@ -38,7 +38,7 @@ files:
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