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.
- data/CHANGELOG.md +5 -0
- data/README.md +78 -151
- data/Rakefile +1 -1
- data/lib/rcap/alert.rb +2 -2
- data/lib/rcap/base/alert.rb +446 -0
- data/lib/rcap/base/area.rb +228 -0
- data/lib/rcap/base/circle.rb +121 -0
- data/lib/rcap/base/event_code.rb +6 -0
- data/lib/rcap/base/geocode.rb +6 -0
- data/lib/rcap/base/info.rb +498 -0
- data/lib/rcap/base/parameter.rb +88 -0
- data/lib/rcap/base/point.rb +87 -0
- data/lib/rcap/base/polygon.rb +120 -0
- data/lib/rcap/base/resource.rb +168 -0
- data/lib/rcap/cap_1_0/alert.rb +59 -342
- data/lib/rcap/cap_1_0/area.rb +13 -188
- data/lib/rcap/cap_1_0/circle.rb +2 -100
- data/lib/rcap/cap_1_0/event_code.rb +8 -3
- data/lib/rcap/cap_1_0/geocode.rb +8 -3
- data/lib/rcap/cap_1_0/info.rb +16 -468
- data/lib/rcap/cap_1_0/parameter.rb +9 -67
- data/lib/rcap/cap_1_0/point.rb +2 -61
- data/lib/rcap/cap_1_0/polygon.rb +5 -95
- data/lib/rcap/cap_1_0/resource.rb +4 -144
- data/lib/rcap/cap_1_1/alert.rb +7 -412
- data/lib/rcap/cap_1_1/area.rb +13 -188
- data/lib/rcap/cap_1_1/circle.rb +2 -100
- data/lib/rcap/cap_1_1/event_code.rb +8 -3
- data/lib/rcap/cap_1_1/geocode.rb +7 -3
- data/lib/rcap/cap_1_1/info.rb +127 -386
- data/lib/rcap/cap_1_1/parameter.rb +4 -76
- data/lib/rcap/cap_1_1/point.rb +2 -61
- data/lib/rcap/cap_1_1/polygon.rb +5 -95
- data/lib/rcap/cap_1_1/resource.rb +37 -143
- data/lib/rcap/cap_1_2/alert.rb +8 -413
- data/lib/rcap/cap_1_2/area.rb +13 -188
- data/lib/rcap/cap_1_2/circle.rb +2 -100
- data/lib/rcap/cap_1_2/event_code.rb +8 -3
- data/lib/rcap/cap_1_2/geocode.rb +8 -3
- data/lib/rcap/cap_1_2/info.rb +132 -419
- data/lib/rcap/cap_1_2/parameter.rb +4 -76
- data/lib/rcap/cap_1_2/point.rb +2 -61
- data/lib/rcap/cap_1_2/polygon.rb +5 -92
- data/lib/rcap/cap_1_2/resource.rb +31 -134
- data/lib/rcap/config.rb +3 -0
- data/lib/{extensions → rcap/extensions}/array.rb +1 -1
- data/lib/rcap/extensions/date.rb +11 -0
- data/lib/{extensions → rcap/extensions}/date_time.rb +2 -5
- data/lib/{extensions → rcap/extensions}/string.rb +1 -1
- data/lib/{extensions → rcap/extensions}/time.rb +2 -4
- data/lib/rcap/utilities.rb +11 -11
- data/lib/rcap/validations.rb +7 -2
- data/lib/rcap/version.rb +1 -1
- data/lib/rcap.rb +21 -4
- data/spec/alert_spec.rb +69 -37
- data/spec/cap_1_0/alert_spec.rb +46 -61
- data/spec/cap_1_0/area_spec.rb +77 -37
- data/spec/cap_1_0/circle_spec.rb +26 -6
- data/spec/cap_1_0/event_code_spec.rb +10 -3
- data/spec/cap_1_0/geocode_spec.rb +11 -4
- data/spec/cap_1_0/info_spec.rb +74 -77
- data/spec/cap_1_0/parameter_spec.rb +18 -5
- data/spec/cap_1_0/point_spec.rb +9 -2
- data/spec/cap_1_0/polygon_spec.rb +52 -9
- data/spec/cap_1_0/resource_spec.rb +28 -21
- data/spec/cap_1_1/alert_spec.rb +47 -60
- data/spec/cap_1_1/area_spec.rb +66 -43
- data/spec/cap_1_1/circle_spec.rb +29 -6
- data/spec/cap_1_1/event_code_spec.rb +11 -3
- data/spec/cap_1_1/geocode_spec.rb +11 -3
- data/spec/cap_1_1/info_spec.rb +262 -118
- data/spec/cap_1_1/parameter_spec.rb +12 -3
- data/spec/cap_1_1/point_spec.rb +8 -2
- data/spec/cap_1_1/polygon_spec.rb +57 -18
- data/spec/cap_1_1/resource_spec.rb +70 -20
- data/spec/cap_1_2/alert_spec.rb +97 -110
- data/spec/cap_1_2/area_spec.rb +59 -41
- data/spec/cap_1_2/circle_spec.rb +15 -8
- data/spec/cap_1_2/event_code_spec.rb +11 -3
- data/spec/cap_1_2/geocode_spec.rb +11 -3
- data/spec/cap_1_2/info_spec.rb +266 -119
- data/spec/cap_1_2/parameter_spec.rb +11 -3
- data/spec/cap_1_2/point_spec.rb +10 -3
- data/spec/cap_1_2/polygon_spec.rb +25 -10
- data/spec/cap_1_2/resource_spec.rb +33 -28
- data/spec/{utilities_spec.rb → extensions_spec.rb} +0 -0
- data/spec/validations_spec.rb +18 -2
- metadata +20 -46
data/lib/rcap/cap_1_0/polygon.rb
CHANGED
@@ -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 [
|
100
|
-
def
|
101
|
-
|
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
|
71
|
-
|
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
|