rcap 1.3.1 → 2.0.0

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.
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