rcap 1.3.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. data/CHANGELOG.md +5 -0
  2. data/README.md +78 -151
  3. data/Rakefile +1 -1
  4. data/lib/rcap/alert.rb +2 -2
  5. data/lib/rcap/base/alert.rb +446 -0
  6. data/lib/rcap/base/area.rb +228 -0
  7. data/lib/rcap/base/circle.rb +121 -0
  8. data/lib/rcap/base/event_code.rb +6 -0
  9. data/lib/rcap/base/geocode.rb +6 -0
  10. data/lib/rcap/base/info.rb +498 -0
  11. data/lib/rcap/base/parameter.rb +88 -0
  12. data/lib/rcap/base/point.rb +87 -0
  13. data/lib/rcap/base/polygon.rb +120 -0
  14. data/lib/rcap/base/resource.rb +168 -0
  15. data/lib/rcap/cap_1_0/alert.rb +59 -342
  16. data/lib/rcap/cap_1_0/area.rb +13 -188
  17. data/lib/rcap/cap_1_0/circle.rb +2 -100
  18. data/lib/rcap/cap_1_0/event_code.rb +8 -3
  19. data/lib/rcap/cap_1_0/geocode.rb +8 -3
  20. data/lib/rcap/cap_1_0/info.rb +16 -468
  21. data/lib/rcap/cap_1_0/parameter.rb +9 -67
  22. data/lib/rcap/cap_1_0/point.rb +2 -61
  23. data/lib/rcap/cap_1_0/polygon.rb +5 -95
  24. data/lib/rcap/cap_1_0/resource.rb +4 -144
  25. data/lib/rcap/cap_1_1/alert.rb +7 -412
  26. data/lib/rcap/cap_1_1/area.rb +13 -188
  27. data/lib/rcap/cap_1_1/circle.rb +2 -100
  28. data/lib/rcap/cap_1_1/event_code.rb +8 -3
  29. data/lib/rcap/cap_1_1/geocode.rb +7 -3
  30. data/lib/rcap/cap_1_1/info.rb +127 -386
  31. data/lib/rcap/cap_1_1/parameter.rb +4 -76
  32. data/lib/rcap/cap_1_1/point.rb +2 -61
  33. data/lib/rcap/cap_1_1/polygon.rb +5 -95
  34. data/lib/rcap/cap_1_1/resource.rb +37 -143
  35. data/lib/rcap/cap_1_2/alert.rb +8 -413
  36. data/lib/rcap/cap_1_2/area.rb +13 -188
  37. data/lib/rcap/cap_1_2/circle.rb +2 -100
  38. data/lib/rcap/cap_1_2/event_code.rb +8 -3
  39. data/lib/rcap/cap_1_2/geocode.rb +8 -3
  40. data/lib/rcap/cap_1_2/info.rb +132 -419
  41. data/lib/rcap/cap_1_2/parameter.rb +4 -76
  42. data/lib/rcap/cap_1_2/point.rb +2 -61
  43. data/lib/rcap/cap_1_2/polygon.rb +5 -92
  44. data/lib/rcap/cap_1_2/resource.rb +31 -134
  45. data/lib/rcap/config.rb +3 -0
  46. data/lib/{extensions → rcap/extensions}/array.rb +1 -1
  47. data/lib/rcap/extensions/date.rb +11 -0
  48. data/lib/{extensions → rcap/extensions}/date_time.rb +2 -5
  49. data/lib/{extensions → rcap/extensions}/string.rb +1 -1
  50. data/lib/{extensions → rcap/extensions}/time.rb +2 -4
  51. data/lib/rcap/utilities.rb +11 -11
  52. data/lib/rcap/validations.rb +7 -2
  53. data/lib/rcap/version.rb +1 -1
  54. data/lib/rcap.rb +21 -4
  55. data/spec/alert_spec.rb +69 -37
  56. data/spec/cap_1_0/alert_spec.rb +46 -61
  57. data/spec/cap_1_0/area_spec.rb +77 -37
  58. data/spec/cap_1_0/circle_spec.rb +26 -6
  59. data/spec/cap_1_0/event_code_spec.rb +10 -3
  60. data/spec/cap_1_0/geocode_spec.rb +11 -4
  61. data/spec/cap_1_0/info_spec.rb +74 -77
  62. data/spec/cap_1_0/parameter_spec.rb +18 -5
  63. data/spec/cap_1_0/point_spec.rb +9 -2
  64. data/spec/cap_1_0/polygon_spec.rb +52 -9
  65. data/spec/cap_1_0/resource_spec.rb +28 -21
  66. data/spec/cap_1_1/alert_spec.rb +47 -60
  67. data/spec/cap_1_1/area_spec.rb +66 -43
  68. data/spec/cap_1_1/circle_spec.rb +29 -6
  69. data/spec/cap_1_1/event_code_spec.rb +11 -3
  70. data/spec/cap_1_1/geocode_spec.rb +11 -3
  71. data/spec/cap_1_1/info_spec.rb +262 -118
  72. data/spec/cap_1_1/parameter_spec.rb +12 -3
  73. data/spec/cap_1_1/point_spec.rb +8 -2
  74. data/spec/cap_1_1/polygon_spec.rb +57 -18
  75. data/spec/cap_1_1/resource_spec.rb +70 -20
  76. data/spec/cap_1_2/alert_spec.rb +97 -110
  77. data/spec/cap_1_2/area_spec.rb +59 -41
  78. data/spec/cap_1_2/circle_spec.rb +15 -8
  79. data/spec/cap_1_2/event_code_spec.rb +11 -3
  80. data/spec/cap_1_2/geocode_spec.rb +11 -3
  81. data/spec/cap_1_2/info_spec.rb +266 -119
  82. data/spec/cap_1_2/parameter_spec.rb +11 -3
  83. data/spec/cap_1_2/point_spec.rb +10 -3
  84. data/spec/cap_1_2/polygon_spec.rb +25 -10
  85. data/spec/cap_1_2/resource_spec.rb +33 -28
  86. data/spec/{utilities_spec.rb → extensions_spec.rb} +0 -0
  87. data/spec/validations_spec.rb +18 -2
  88. metadata +20 -46
@@ -1,104 +1,14 @@
1
1
  module RCAP
2
2
  module CAP_1_0
3
+
3
4
  # A Polygon object is valid if
4
5
  # * it has a minimum of three points
5
6
  # * each Point object in the points collection is valid
6
- class Polygon
7
- include Validation
8
-
9
- # @return [Array<Point>] Collection of {Point} objects
10
- attr_reader( :points )
11
-
12
- validates_collection_of( :points )
13
- validates_length_of( :points, :minimum => 3 )
14
- validates_equality_of_first_and_last( :points )
15
-
16
- XML_ELEMENT_NAME = 'polygon'
17
- XPATH = "cap:#{ XML_ELEMENT_NAME }"
18
-
19
- # @param [Hash] attributes
20
- # @option attributes [Array<Point>] :points Collection of {Point} objects
21
- def initialize( attributes = {})
22
- @points = Array( attributes[ :points ])
23
- end
24
-
25
- # Creates a new Point object and adds it to the points array.
26
- #
27
- # @see Point#initialize
28
- def add_point( point_attributes = {})
29
- point = Point.new( point_attributes )
30
- @points << point
31
- point
32
- end
33
-
34
- # Returns a string representation of the polygon of the form
35
- # points[0] points[1] points[2] ...
36
- # where each point is formatted with Point#to_s
37
- def to_s
38
- @points.join( ' ' )
39
- end
40
-
41
- # @return [String]
42
- def inspect
43
- "(#{ @points.map{|point| point.inspect}.join(', ')})"
44
- end
45
-
46
- # @return [REXML::Element]
47
- def to_xml_element
48
- xml_element = REXML::Element.new( XML_ELEMENT_NAME )
49
- xml_element.add_text( self.to_s )
50
- xml_element
51
- end
52
-
53
- # @return [String]
54
- def to_xml
55
- self.to_xml_element.to_s
56
- end
57
-
58
- # Two polygons are equivalent if their collection of points is equivalent.
59
- #
60
- # @return [true,false]
61
- def ==( other )
62
- @points == other.points
63
- end
64
-
65
- # @return [Array<Array(Numeric,Numeric)>]
66
- def self.parse_polygon_string( polygon_string )
67
- polygon_string.split( ' ' ).map{ |coordinate_string| coordinate_string.split( ',' ).map{|coordinate| coordinate.to_f }}
68
- end
69
-
70
- # @return [Polygon]
71
- def self.from_xml_element( polygon_xml_element )
72
- if !polygon_xml_element.text.nil? && !polygon_xml_element.text.empty?
73
- coordinates = self.parse_polygon_string( polygon_xml_element.text )
74
- points = coordinates.map{ |lattitude, longitude| Point.new( :lattitude => lattitude, :longitude => longitude )}
75
- polygon = self.new( :points => points )
76
- else
77
- self.new
78
- end
79
- end
80
-
81
-
82
- # @return [String]
83
- def to_yaml( options = {} )
84
- @points.map{ |point| [ point.lattitude, point.longitude ]}.to_yaml( options )
85
- end
86
-
87
- # @return [Polygon]
88
- def self.from_yaml_data( polygon_yaml_data )
89
- self.new( :points => Array( polygon_yaml_data ).map{ |lattitude, longitude| Point.new( :lattitude => lattitude, :longitude => longitude )})
90
- end
91
-
92
- POINTS_KEY = 'points'
93
-
94
- # @return [Hash]
95
- def to_h
96
- { POINTS_KEY => @points.map{ |point| point.to_h }}
97
- end
7
+ class Polygon < RCAP::Base::Polygon
98
8
 
99
- # @return [Polygon]
100
- def self.from_h( polygon_hash )
101
- self.new( :points => polygon_hash[ POINTS_KEY ].map{ |point_hash| Point.from_h( point_hash )})
9
+ # @return [Class]
10
+ def point_class
11
+ Point
102
12
  end
103
13
  end
104
14
  end
@@ -1,154 +1,14 @@
1
1
  module RCAP
2
2
  module CAP_1_0
3
3
 
4
+
4
5
  # A Resource object is valid if
5
6
  # * it has a resource description
6
- class Resource
7
- include Validation
8
-
9
- # @return [String] Resource Description
10
- attr_accessor( :resource_desc )
11
- # @return [String]
12
- attr_accessor( :mime_type )
13
- # @return [Integer] Expressed in bytes
14
- attr_accessor( :size )
15
- # @return [String] Resource location
16
- attr_accessor( :uri )
17
- # @return [String] SHA-1 hash of contents of resource
18
- attr_accessor( :digest )
19
-
20
- validates_presence_of( :resource_desc )
21
-
22
- XML_ELEMENT_NAME = 'resource'
23
- MIME_TYPE_ELEMENT_NAME = 'mimeType'
24
- SIZE_ELEMENT_NAME = 'size'
25
- URI_ELEMENT_NAME = 'uri'
26
- DIGEST_ELEMENT_NAME = 'digest'
27
- RESOURCE_DESC_ELEMENT_NAME = 'resourceDesc'
28
-
29
- XPATH = "cap:#{ XML_ELEMENT_NAME }"
30
- MIME_TYPE_XPATH = "cap:#{ MIME_TYPE_ELEMENT_NAME }"
31
- SIZE_XPATH = "cap:#{ SIZE_ELEMENT_NAME }"
32
- URI_XPATH = "cap:#{ URI_ELEMENT_NAME }"
33
- DIGEST_XPATH = "cap:#{ DIGEST_ELEMENT_NAME }"
34
- RESOURCE_DESC_XPATH = "cap:#{ RESOURCE_DESC_ELEMENT_NAME }"
35
-
36
- # @param [Hash{Symbol => Object}] attributes
37
- # @option attributes [String] :mime_type
38
- # @option attributes [Numeric] :size Size in bytes
39
- # @option attributes [String] :uri
40
- # @option attributes [String] :digest
41
- # @option attributes [String] :resource_desc
42
- def initialize( attributes = {} )
43
- @mime_type = attributes[ :mime_type ]
44
- @size = attributes[ :size ]
45
- @uri = attributes[ :uri ]
46
- @digest = attributes[ :digest ]
47
- @resource_desc = attributes[ :resource_desc ]
48
- end
49
-
50
- # @return [REXML::Element]
51
- def to_xml_element
52
- xml_element = REXML::Element.new( XML_ELEMENT_NAME )
53
- xml_element.add_element( RESOURCE_DESC_ELEMENT_NAME ).add_text( @resource_desc )
54
- xml_element.add_element( MIME_TYPE_ELEMENT_NAME ).add_text( @mime_type ) if @mime_type
55
- xml_element.add_element( SIZE_ELEMENT_NAME ).add_text( @size.to_s ) if @size
56
- xml_element.add_element( URI_ELEMENT_NAME ).add_text( @uri ) if @uri
57
- xml_element.add_element( DIGEST_ELEMENT_NAME ).add_text( @digest ) if @digest
58
- xml_element
59
- end
60
-
61
- # If size is defined returns the size in kilobytes
62
- # @return [Float]
63
- def size_in_kb
64
- if @size
65
- @size.to_f/1024
66
- end
67
- end
7
+ class Resource < RCAP::Base::Resource
68
8
 
69
9
  # @return [String]
70
- def to_xml
71
- self.to_xml_element.to_s
72
- end
73
-
74
- # @return [String]
75
- def inspect
76
- [ @resource_desc, @uri, @mime_type, @size ? format( "%.1fKB", @size_in_kb ) : nil ].compact.join(' - ')
77
- end
78
-
79
- # Returns a string representation of the resource of the form
80
- # resource_desc
81
- #
82
- # @return [String]
83
- def to_s
84
- @resource_desc
85
- end
86
-
87
- # @param [REXML::Element] resource_xml_element
88
- # @return [Resource]
89
- def self.from_xml_element( resource_xml_element )
90
- resource = self.new( :resource_desc => RCAP.xpath_text( resource_xml_element, RESOURCE_DESC_XPATH, Alert::XMLNS ),
91
- :uri => RCAP.xpath_text( resource_xml_element, URI_XPATH, Alert::XMLNS ),
92
- :mime_type => RCAP.xpath_text( resource_xml_element, MIME_TYPE_XPATH, Alert::XMLNS ),
93
- :size => RCAP.xpath_text( resource_xml_element, SIZE_XPATH, Alert::XMLNS ).to_i,
94
- :digest => RCAP.xpath_text( resource_xml_element, DIGEST_XPATH, Alert::XMLNS ))
95
- end
96
-
97
- RESOURCE_DESC_YAML = "Resource Description"
98
- URI_YAML = "URI"
99
- MIME_TYPE_YAML = "Mime Type"
100
- SIZE_YAML = "Size"
101
- DIGEST_YAML = "Digest"
102
-
103
- # @param [Hash] options
104
- # @return [String]
105
- def to_yaml( options = {} )
106
- RCAP.attribute_values_to_hash(
107
- [ RESOURCE_DESC_YAML, @resource_desc ],
108
- [ URI_YAML, @uri ],
109
- [ MIME_TYPE_YAML, @mime_type ],
110
- [ SIZE_YAML, @size ],
111
- [ DIGEST_YAML, @digest ]
112
- ).to_yaml( options )
113
- end
114
-
115
- # @param [Hash] resource_yaml_data
116
- # @return [Resource]
117
- def self.from_yaml_data( resource_yaml_data )
118
- self.new(
119
- :resource_desc => reource_yaml_data[ RESOURCE_DESC_YAML ],
120
- :uri => reource_yaml_data[ URI_YAML ],
121
- :mime_type => reource_yaml_data[ MIME_TYPE_YAML ],
122
- :size => reource_yaml_data[ SIZE_YAML ],
123
- :digest => reource_yaml_data[ DIGEST_YAML ]
124
- )
125
- end
126
-
127
- RESOURCE_DESC_KEY = 'resource_desc'
128
- URI_KEY = 'uri'
129
- MIME_TYPE_KEY = 'mime_type'
130
- SIZE_KEY = 'size'
131
- DIGEST_KEY = 'digest'
132
-
133
- # @return [Hash]
134
- def to_h
135
- RCAP.attribute_values_to_hash(
136
- [ RESOURCE_DESC_KEY, @resource_desc ],
137
- [ URI_KEY, @uri],
138
- [ MIME_TYPE_KEY, @mime_type],
139
- [ SIZE_KEY, @size ],
140
- [ DIGEST_KEY, @digest ])
141
- end
142
-
143
- # @param [Hash] resource_hash
144
- # @return [Resource]
145
- def self.from_h( resource_hash )
146
- self.new(
147
- :resource_desc => resource_hash[ RESOURCE_DESC_KEY ],
148
- :uri => resource_hash[ URI_KEY ],
149
- :mime_type => resource_hash[ MIME_TYPE_KEY ],
150
- :size => resource_hash[ SIZE_KEY ],
151
- :digest => resource_hash[ DIGEST_KEY ])
10
+ def xmlns
11
+ Alert::XMLNS
152
12
  end
153
13
  end
154
14
  end