geo_position 0.0.1 → 0.0.2

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.
@@ -13,13 +13,11 @@ module GeoPosition
13
13
  # => -12.061783333333333
14
14
  #
15
15
  class Dms
16
- # Error that is raised if invalid directions are provided
17
- InvalidDirectionError = Class.new(StandardError)
18
-
19
16
  ALLOWED_DIRECTIONS = %w( N n E e S s W w )
20
17
  MINUTES_CONVERSION = 60
21
18
  SECONDS_CONVERSION = 3600
22
19
 
20
+
23
21
  # Creates a new instance of the DMS conversion object
24
22
  #
25
23
  # @param degrees [String,Integer]
@@ -29,35 +27,55 @@ module GeoPosition
29
27
  #
30
28
  # @return [void]
31
29
  def initialize(degrees, minutes, seconds, direction)
32
- raise InvalidDirectionError.new("Please provided a direction of N, S, E, or W") unless valid_direction?(direction)
30
+ raise GeoPosition::Error::InvalidDirectionError.new("Please provided a direction of N, S, E, or W") unless valid_direction?(direction)
31
+ raise GeoPosition::Error::InvalidFloatError.new("Arguments could not be coerced to a float") unless valid_floats?([degrees, minutes, seconds])
32
+ raise GeoPosition::Error::InvalidDegreesError.new("Degrees must be between 0 and 360. %s was provided" % [degrees]) unless valid_degrees?(degrees)
33
33
 
34
- @degrees = degrees
34
+ @degrees = degrees # Can only be between 0 and 360
35
35
  @minutes = minutes
36
36
  @seconds = seconds
37
37
 
38
38
  @direction = direction
39
39
  end
40
40
 
41
+ # Returns the coerced degrees
42
+ #
43
+ # @return [Float] Positive float of the provided degrees
41
44
  def degrees
42
- @degrees.to_f
45
+ @degrees.to_f.abs
43
46
  end
44
47
 
48
+ # Returns the coerced minutes
49
+ #
50
+ # @return [Float]
45
51
  def minutes
46
52
  @minutes.to_f
47
53
  end
48
54
 
55
+ # Returns the coerced seconds
56
+ #
57
+ # @return [Float]
49
58
  def seconds
50
59
  @seconds.to_f
51
60
  end
52
61
 
62
+ # Returns the uppercased direction
63
+ #
64
+ # @return [String] Uppercase direction
53
65
  def direction
54
66
  @direction.to_s.upcase
55
67
  end
56
68
 
69
+ # Returns the formatted string
70
+ #
71
+ # @return [String]
57
72
  def to_s
58
73
  "%s deg %s' %s\" %s" % [self.degrees.to_i, self.minutes.to_i, self.seconds, self.direction]
59
74
  end
60
75
 
76
+ # Returns the converted DMS to a float for use with latitude/longitude
77
+ #
78
+ # @return [Float]
61
79
  def to_f
62
80
  convert!
63
81
  end
@@ -67,6 +85,14 @@ module GeoPosition
67
85
  ALLOWED_DIRECTIONS.include?(dir[0,1])
68
86
  end
69
87
 
88
+ def valid_floats?(collection)
89
+ collection.all? { |arg| arg.respond_to?(:to_f) }
90
+ end
91
+
92
+ def valid_degrees?(deg)
93
+ deg.to_f.abs.between?(0.0, 360.0)
94
+ end
95
+
70
96
  def convert!
71
97
  result = (self.degrees + ((self.minutes/MINUTES_CONVERSION) + (self.seconds/SECONDS_CONVERSION)))
72
98
  if negative? then -(result) else result end
@@ -0,0 +1,6 @@
1
+ module GeoPosition
2
+ module Error
3
+ class InvalidDegreesError < StandardError
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module GeoPosition
2
+ module Error
3
+ class InvalidDirectionError < StandardError
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module GeoPosition
2
+ module Error
3
+ class InvalidFloatError < StandardError
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ module GeoPosition
2
+ module Error
3
+ autoload :InvalidDirectionError, File.join(File.dirname(__FILE__), 'error/invalid_direction_error')
4
+ autoload :InvalidFloatError, File.join(File.dirname(__FILE__), 'error/invalid_float_error')
5
+ autoload :InvalidDegreesError, File.join(File.dirname(__FILE__), 'error/invalid_degrees_error')
6
+ end
7
+ end
@@ -1,3 +1,3 @@
1
1
  module GeoPosition
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/geo_position.rb CHANGED
@@ -3,6 +3,9 @@ root = File.expand_path(File.dirname(__FILE__))
3
3
  # Version
4
4
  require File.join(root, 'geo_position', 'version')
5
5
 
6
+ # Errors
7
+ require File.join(root, 'geo_position', 'error')
8
+
6
9
  # Conversions
7
10
  require File.join(root, 'geo_position', 'conversion')
8
11
  require File.join(root, 'geo_position', 'conversion', 'dms')
@@ -1,7 +1,3 @@
1
- # With negative numbers
2
- # With nil
3
- # With empty strings
4
- # With strings
5
1
  require 'spec_helper'
6
2
 
7
3
  describe GeoPosition::Conversion::Dms do
@@ -15,8 +11,18 @@ describe GeoPosition::Conversion::Dms do
15
11
  subject.should respond_to(:to_s)
16
12
  end
17
13
 
18
- it "raises an exception if invalid direction is given" do
19
- lambda { described_class.new(12,12,23,'r') }.should raise_error(GeoPosition::Conversion::Dms::InvalidDirectionError)
14
+ context('Error Handling') do
15
+ it "raises an exception if invalid direction is given" do
16
+ lambda { described_class.new(12,12,23,'r') }.should raise_error(GeoPosition::Error::InvalidDirectionError)
17
+ end
18
+
19
+ it "raises an InvalidFloatError if any arguments can't be coerced to a float" do
20
+ lambda { described_class.new([12], [3], [42.42], 'w') }.should raise_error(GeoPosition::Error::InvalidFloatError)
21
+ end
22
+
23
+ it "raises an exception if degrees are greater than 360" do
24
+ lambda{ described_class.new(361, 12, 123, 'n') }.should raise_error(GeoPosition::Error::InvalidDegreesError)
25
+ end
20
26
  end
21
27
 
22
28
  it "coerces the degrees to a float" do
@@ -44,6 +50,26 @@ describe GeoPosition::Conversion::Dms do
44
50
  subject.to_f.should eql(-12.061783333333333)
45
51
  end
46
52
 
53
+ it "returns 0's if nil is provided" do
54
+ gp = described_class.new(nil, nil, nil, 'N')
55
+ gp.to_f.should eql(0.0)
56
+ end
57
+
58
+ it "returns 0's if empty strings are provided" do
59
+ gp = described_class.new('', '', '', 'N')
60
+ gp.to_f.should eql(0.0)
61
+ end
62
+
63
+ it "ensures the degrees are always positive" do
64
+ gp = described_class.new(-12, 3, 42.42, 'w')
65
+ gp.to_f.should eql(-12.061783333333333)
66
+ end
67
+
68
+ it "coerces string arguments to floats" do
69
+ gp = described_class.new('12', '3', '42.42', 'w')
70
+ gp.to_f.should eql(-12.061783333333333)
71
+ end
72
+
47
73
  context("North") do
48
74
  subject { described_class.new(12,3,42.42,'n') }
49
75
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geo_position
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -93,6 +93,10 @@ files:
93
93
  - lib/geo_position.rb
94
94
  - lib/geo_position/conversion.rb
95
95
  - lib/geo_position/conversion/dms.rb
96
+ - lib/geo_position/error.rb
97
+ - lib/geo_position/error/invalid_degrees_error.rb
98
+ - lib/geo_position/error/invalid_direction_error.rb
99
+ - lib/geo_position/error/invalid_float_error.rb
96
100
  - lib/geo_position/parser.rb
97
101
  - lib/geo_position/version.rb
98
102
  - reload_yard
@@ -112,7 +116,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
112
116
  version: '0'
113
117
  segments:
114
118
  - 0
115
- hash: -4563760366661124322
119
+ hash: 438636080150112414
116
120
  required_rubygems_version: !ruby/object:Gem::Requirement
117
121
  none: false
118
122
  requirements:
@@ -121,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
125
  version: '0'
122
126
  segments:
123
127
  - 0
124
- hash: -4563760366661124322
128
+ hash: 438636080150112414
125
129
  requirements: []
126
130
  rubyforge_project:
127
131
  rubygems_version: 1.8.24