ruby_mapscript 0.3.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.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in ruby-mapscript.gemspec
4
+ gemspec
@@ -0,0 +1,64 @@
1
+ Ruby MapScript API extensions
2
+ =============================
3
+
4
+ This gem extends the `SWIG MapScript API <http://mapserver.org/mapscript/mapscript.html>`_
5
+ of `UMN MapServer <http://mapserver.org/>`_ with Ruby-like iterators and other API methods.
6
+
7
+ Installation
8
+ ------------
9
+
10
+ ruby_mapscript requires the MapScript API library to be installed.
11
+ On Debian/Ubuntu systems::
12
+
13
+ sudo apt-get install libmapscript-ruby
14
+
15
+ A Mapserver binary (CGI) is not required for executing ruby_mapscript code.
16
+
17
+ To use the gem, add it to your Gemfile or install it manually::
18
+
19
+ gem install ruby_mapscript
20
+
21
+
22
+ Usage
23
+ -----
24
+
25
+ To use ruby_mapscript, require the gem and include Mapscript in your class/module or globally::
26
+
27
+ require "rubygems"
28
+ require "ruby_mapscript"
29
+ include Mapscript
30
+
31
+ ruby_mapscript provides a Ruby-like iterator interface to MapScript collections::
32
+
33
+ map.layers.each do |layer|
34
+ puts layer.name
35
+ end
36
+
37
+ With the native SWIG API this would be something like::
38
+
39
+ 0.upto(map.numlayers-1) do |i|
40
+ layer = map.getLayer(i)
41
+ puts layer.name
42
+ end
43
+
44
+ ruby_mapscript iterators include Enumerable which gives you the same methods as Ruby Arrays and Hashes have::
45
+
46
+ wms_layers = map.layers.select { |layer| layer.connectiontype == MS_WMS }
47
+
48
+
49
+ To run a MapScript based WMS server as a Rack application create config.ru::
50
+
51
+ require "ruby_mapscript/mapserver"
52
+
53
+ run RubyMapscript::Mapserver.new('test.map')
54
+
55
+ and call::
56
+
57
+ rackup config.ru
58
+
59
+ To include a WMS server in a Rails application, require "ruby_mapscript/mapserver" and add a line to your routes.rb::
60
+
61
+ match "/wms" => RubyMapscript::Mapserver.new('test.map')
62
+
63
+
64
+ *Copyright (c) 2012 Pirmin Kalberer, Sourcepole AG*
@@ -0,0 +1,11 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ #Test::Unit
4
+ require 'rake/testtask'
5
+
6
+ Rake::TestTask.new do |t|
7
+ t.libs << 'test'
8
+ end
9
+
10
+ desc "Run tests"
11
+ task :default => :test
@@ -0,0 +1,252 @@
1
+ # Ruby Mapscript API extensions
2
+
3
+ require "mapscript"
4
+
5
+ module Mapscript
6
+
7
+ # Generic iterator for Mapscript collections
8
+ class MapscriptEnumerable
9
+ include Enumerable
10
+
11
+ def initialize(parent, size_method, getter)
12
+ @parent, @size_method, @getter = parent, size_method, getter
13
+ end
14
+
15
+ def size
16
+ @parent.send(@size_method)
17
+ end
18
+
19
+ def each
20
+ 0.upto(size-1) do |idx|
21
+ yield @parent.send(@getter, idx)
22
+ end
23
+ end
24
+
25
+ def [](idx)
26
+ case idx
27
+ when Fixnum
28
+ if idx >= 0
29
+ @parent.send(@getter, idx)
30
+ else
31
+ @parent.send(@getter, size+idx)
32
+ end
33
+ when Range
34
+ to_a[idx]
35
+ else
36
+ raise TypeError, "Unsupported type for index"
37
+ end
38
+ end
39
+
40
+ end
41
+
42
+ # LayerObj iterator
43
+ class MapLayers < MapscriptEnumerable
44
+
45
+ def initialize(map)
46
+ super(map, :numlayers, :getLayer)
47
+ @map = map
48
+ end
49
+
50
+ def [](idx)
51
+ case idx
52
+ when Fixnum
53
+ if idx >= 0
54
+ @map.getLayer(idx)
55
+ else
56
+ @map.getLayer(@map.numlayers+idx)
57
+ end
58
+ when Range
59
+ to_a[idx]
60
+ when String
61
+ @map.getLayerByName(idx)
62
+ else
63
+ raise TypeError, "Unsupported type for index"
64
+ end
65
+ end
66
+
67
+ def <<(layer)
68
+ @map.insertLayer(layer, @map.numlayers-1)
69
+ end
70
+ end
71
+
72
+ # ClassObj iterator
73
+ class LayerClasses < MapscriptEnumerable
74
+
75
+ def initialize(layer)
76
+ super(layer, :numclasses, :getClass)
77
+ @layer = layer
78
+ end
79
+
80
+ def [](idx)
81
+ case idx
82
+ when Fixnum
83
+ if idx >= 0
84
+ @layer.getClass(idx)
85
+ else
86
+ @layer.getClass(@layer.numclasses+idx)
87
+ end
88
+ when Range
89
+ to_a[idx]
90
+ when String
91
+ find { |cls| cls.name == idx }
92
+ else
93
+ raise TypeError, "Unsupported type for index"
94
+ end
95
+ end
96
+
97
+ def <<(newclass)
98
+ @layer.insertClass(newclass, @layer.numclasses-1)
99
+ end
100
+ end
101
+
102
+
103
+ # ClassObj extensions
104
+ class ClassObj
105
+ # Return StyleObj iterator
106
+ def styles
107
+ @styles ||= MapscriptEnumerable.new(self, :numstyles, :getStyle)
108
+ end
109
+ end
110
+
111
+ # HashTableObj extensions
112
+ class HashTableObj
113
+ include Enumerable
114
+
115
+ def [](key)
116
+ get(key)
117
+ end
118
+
119
+ def []=(key, value)
120
+ set(key, value)
121
+ end
122
+
123
+ def each_key
124
+ key = nextKey(nil)
125
+ while key
126
+ yield key
127
+ key = nextKey(key)
128
+ end
129
+ end
130
+
131
+ def has_key?(key)
132
+ !get(key).nil?
133
+ end
134
+
135
+ alias :key? :has_key?
136
+ alias :include? :has_key?
137
+
138
+ def keys
139
+ ary = []
140
+ each_key { |key| ary << key }
141
+ ary
142
+ end
143
+
144
+ alias :length :numitems
145
+ alias :size :numitems
146
+
147
+ def empty?
148
+ numitems == 0
149
+ end
150
+
151
+ alias :delete :remove
152
+
153
+ def each_pair
154
+ key = nextKey(nil)
155
+ while key
156
+ yield key, get(key)
157
+ key = nextKey(key)
158
+ end
159
+ end
160
+
161
+ alias :each :each_pair
162
+
163
+ def to_hash
164
+ h = {}
165
+ each_pair { |key, value| h[key] = value }
166
+ h
167
+ end
168
+
169
+ def inspect
170
+ to_hash.inspect
171
+ end
172
+
173
+ end
174
+
175
+ # LabelObj extensions
176
+ class LabelObj
177
+ # Return styleObj iterator
178
+ def styles
179
+ @styles ||= MapscriptEnumerable.new(self, :numstyles, :getStyle)
180
+ end
181
+ end
182
+
183
+ # LayerObj extensions
184
+ class LayerObj
185
+ # Return ClassObj iterator
186
+ def classes
187
+ @classes ||= LayerClasses.new(self)
188
+ end
189
+
190
+ # Return string iterator
191
+ def processings
192
+ @processings ||= MapscriptEnumerable.new(self, :numprocessing, :getProcessing)
193
+ end
194
+
195
+ def visible?
196
+ isVisible == MS_TRUE
197
+ end
198
+ end
199
+
200
+ # LineObj extensions
201
+ class LineObj
202
+ # Return pointObj iterator
203
+ def points
204
+ @points ||= MapscriptEnumerable.new(self, :numpoints, :get)
205
+ end
206
+ end
207
+
208
+ # MapObj extensions
209
+ class MapObj
210
+ # Return LayerObj iterator
211
+ def layers
212
+ @map_layers ||= MapLayers.new(self)
213
+ end
214
+ end
215
+
216
+ # ResultCacheObj extensions
217
+ class ResultCacheObj
218
+ # Return resultCacheObj iterator
219
+ def results
220
+ @results ||= MapscriptEnumerable.new(self, :numresults, :getResult)
221
+ end
222
+ end
223
+
224
+ # ShapefileObj extensions
225
+ class ShapefileObj
226
+ # Return shapeObj iterator
227
+ def shapes
228
+ @shapes ||= MapscriptEnumerable.new(self, :numshapes, :getShape)
229
+ end
230
+ end
231
+
232
+ # ShapeObj extensions
233
+ class ShapeObj
234
+ # Return lineObj iterator
235
+ def lines
236
+ @lines ||= MapscriptEnumerable.new(self, :numlines, :get)
237
+ end
238
+
239
+ # Return shape attribute (string) iterator
240
+ def values
241
+ @values ||= MapscriptEnumerable.new(self, :numvalues, :getValue)
242
+ end
243
+ end
244
+
245
+ # SymbolSetObj extensions
246
+ class SymbolSetObj
247
+ # Return symbolObj iterator
248
+ def symbols
249
+ @symbols ||= MapscriptEnumerable.new(self, :numsymbols, :getSymbol) #:getSymbolByName
250
+ end
251
+ end
252
+ end
@@ -0,0 +1,2 @@
1
+ require "ruby_mapscript/version"
2
+ require "mapscript/mapscript_extensions"
@@ -0,0 +1,37 @@
1
+ # OGC compliant map server Rack Application
2
+ # OWS requests include WMS, WFS, WCS and SOS requests supported by MapServer
3
+
4
+ require "mapscript"
5
+
6
+ module RubyMapscript
7
+
8
+ class Mapserver
9
+
10
+ def initialize(mapfile)
11
+ @wms = Mapscript::MapObj.new(mapfile)
12
+ end
13
+
14
+ def call(env)
15
+ req = Mapscript::OWSRequest.new
16
+ %w(REQUEST_METHOD QUERY_STRING HTTP_COOKIE).each do |var|
17
+ ENV[var] = env[var]
18
+ end
19
+ req.loadParams
20
+ #Returns the number of name/value pairs collected.
21
+ #Warning: most errors will result in a process exit!
22
+
23
+ # redirect stdout & handle request
24
+ Mapscript::msIO_installStdoutToBuffer()
25
+ retval = @wms.OWSDispatch(req)
26
+ #Returns MS_DONE (2) if there is no valid OWS request in the req object,
27
+ # MS_SUCCESS (0) if an OWS request was successfully processed and
28
+ # MS_FAILURE (1) if an OWS request was not successfully processed.
29
+ content_type = Mapscript::msIO_stripStdoutBufferContentType()
30
+ map_image = Mapscript::msIO_getStdoutBufferBytes()
31
+ Mapscript::msIO_resetHandlers()
32
+
33
+ [200, {'Content-Type' => content_type}, map_image]
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1,3 @@
1
+ module RubyMapscript
2
+ VERSION = "0.3.0"
3
+ end
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "ruby_mapscript/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "ruby_mapscript"
7
+ s.version = RubyMapscript::VERSION
8
+ s.authors = ["Pirmin Kalberer"]
9
+ s.email = ["pka@sourcepole.ch"]
10
+ s.homepage = "https://github.com/sourcepole/ruby_mapscript"
11
+ s.summary = %q{Ruby Mapscript API extensions}
12
+ s.description = %q{Ruby Mapscript API extensions}
13
+
14
+ s.rubyforge_project = "ruby_mapscript"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+ end
@@ -0,0 +1,17 @@
1
+ MAP
2
+ NAME "Empty Map"
3
+ SIZE 600 600
4
+ EXTENT -180 -90 180 90
5
+ IMAGECOLOR 180 180 250
6
+ IMAGETYPE PNG
7
+
8
+ UNITS DD
9
+ PROJECTION
10
+ "init=epsg:4326"
11
+ END
12
+
13
+ WEB
14
+ IMAGEPATH "/tmp/"
15
+ IMAGEURL "/tmp/"
16
+ END
17
+ END
@@ -0,0 +1,69 @@
1
+ MAP
2
+ NAME "Test Map"
3
+ SIZE 600 600
4
+ EXTENT -180 -90 180 90
5
+ IMAGECOLOR 180 180 250
6
+ IMAGETYPE PNG
7
+
8
+ #CONFIG "MS_ERRORFILE" "stderr" # http://mapserver.org/optimization/debugging.html#step-1-set-the-ms-errorfile-variable
9
+ #DEBUG 5 # http://mapserver.org/optimization/debugging.html#step-2-set-the-debug-level
10
+ #CONFIG "CPL_DEBUG" "ON" # http://mapserver.org/optimization/debugging.html#step-3-turn-on-cpl-debug-optional
11
+ #CONFIG "PROJ_DEBUG" "ON" # http://mapserver.org/optimization/debugging.html#step-4-turn-on-proj-debug-optional
12
+
13
+ UNITS DD
14
+ PROJECTION
15
+ "init=epsg:4326"
16
+ END
17
+
18
+ WEB
19
+ IMAGEPATH "/tmp/"
20
+ IMAGEURL "/tmp/"
21
+ METADATA
22
+ "wms_srs" "EPSG:4326"
23
+ "wms_onlineresource" "http://localhost:9292/"
24
+ "ows_enable_request" "*"
25
+ "wms_feature_info_mime_type" "text/html"
26
+ "wms_title" "Rackup Test WMS"
27
+ END # METADATA
28
+ END # WEB
29
+
30
+ LAYER
31
+ NAME "wms_layer"
32
+ TYPE RASTER
33
+ STATUS OFF
34
+ CONNECTIONTYPE WMS
35
+ CONNECTION "http://iceds.ge.ucl.ac.uk/cgi-bin/icedswms?"
36
+ METADATA
37
+ "wms_title" "WMS Layer"
38
+ "wms_extent" "-180 -90 180 90"
39
+ "wms_srs" "EPSG:4326"
40
+ "wms_name" "landsat5,landsat,GRID"
41
+ "wms_server_version" "1.1.1"
42
+ "wms_format" "image/jpeg"
43
+ END
44
+ END
45
+
46
+ LAYER
47
+ NAME shppoly
48
+ TYPE line
49
+ DATA "data/world_testpoly.shp"
50
+ STATUS ON
51
+ CLASSITEM "FID"
52
+ CLASS
53
+ NAME "test1"
54
+ STYLE
55
+ COLOR 20 20 20
56
+ WIDTH 5
57
+ END
58
+ STYLE
59
+ COLOR 50 50 255
60
+ WIDTH 3
61
+ END
62
+ STYLE
63
+ COLOR 255 255 0
64
+ WIDTH 1
65
+ PATTERN 4 4 END
66
+ END
67
+ END
68
+ END
69
+ END
@@ -0,0 +1,166 @@
1
+ require 'test/unit'
2
+ require "ruby_mapscript"
3
+ include Mapscript
4
+
5
+ class TestMapscriptExtension < Test::Unit::TestCase
6
+ def setup
7
+ mapfile = File.join(File.dirname(__FILE__), 'test.map')
8
+ @map = MapObj.new(mapfile)
9
+ end
10
+
11
+ def test_arrays
12
+ assert_equal 0, @map.getLayersDrawingOrder[0]
13
+ style = @map.layers['shppoly'].classes.first.styles[-1]
14
+ assert_equal SWIG::TYPE_p_double, style.pattern.class
15
+ if defined?(Doublearray)
16
+ pattern = Doublearray.frompointer(style.pattern)
17
+ assert_equal 4.0, pattern[0]
18
+ assert_equal 4.0, pattern[style.patternlength-1]
19
+ else
20
+ puts "Warning: Mapscript library does not support Doublearray"
21
+ end
22
+ end
23
+
24
+ def test_hashtable
25
+ layer = @map.layers['wms_layer']
26
+ metadata = layer.metadata
27
+
28
+ assert metadata.has_key?("wms_title")
29
+ assert metadata.key?("wms_title")
30
+ assert metadata.include?("wms_title")
31
+ assert !metadata.key?("XXX")
32
+
33
+ assert_equal 6, metadata.numitems
34
+ assert_equal metadata.numitems, metadata.length
35
+ assert_equal metadata.numitems, metadata.keys.size
36
+
37
+ assert metadata.keys.include?("wms_title")
38
+ assert_equal "WMS Layer", metadata["wms_title"]
39
+
40
+ metadata.each do |k, v|
41
+ assert_equal metadata[k], v
42
+ end
43
+
44
+ #Update entry
45
+ metadata["wms_title"] = "New Title"
46
+ assert_equal "New Title", metadata["wms_title"]
47
+
48
+ #Add new entry
49
+ metadata["new_key"] = "New Value"
50
+ assert_equal 7, metadata.numitems
51
+
52
+ metadata.delete("new_key")
53
+ assert_equal 6, metadata.numitems
54
+
55
+ assert_equal "EPSG:4326", metadata.to_hash["wms_srs"]
56
+
57
+ #Enumerable
58
+ assert_equal metadata.keys, metadata.collect { |k, v| k }
59
+ assert_equal ["wms_srs", "EPSG:4326"], metadata.to_a.first
60
+
61
+ #Test Empty Hash
62
+ metadata = @map.web.metadata
63
+ assert !metadata.key?("wms_title")
64
+ assert_equal 0, metadata.numitems
65
+ assert_equal metadata.numitems, metadata.length
66
+ assert_equal metadata.numitems, metadata.keys.size
67
+ assert metadata.keys.empty?
68
+ assert_nil metadata["wms_title"]
69
+ metadata.each {}
70
+ metadata["new_key"] = "New Value"
71
+ assert_equal 1, metadata.numitems
72
+ metadata.delete("new_key")
73
+ assert_equal 0, metadata.numitems
74
+ assert_equal({}, metadata.to_hash)
75
+ end
76
+
77
+ def test_layer_access
78
+ assert_equal @map.numlayers, @map.layers.size
79
+ assert_equal @map.numlayers, @map.layers.count #From Enumerable
80
+ assert_equal @map.numlayers, @map.layers.to_a.size #to_a from Enumerable
81
+ assert_equal @map.numlayers, @map.layers[0..-1].size
82
+ assert_equal 0, @map.layers.first.index
83
+ @map.layers.each_with_index do |l, i|
84
+ assert_equal i, @map.layers[i].index
85
+ end
86
+ assert_equal 'wms_layer', @map.layers[0].name
87
+ assert_equal 'wms_layer', @map.layers[-@map.numlayers].name
88
+ assert_nil @map.layers[99]
89
+ assert_equal 'wms_layer', @map.layers['wms_layer'].name
90
+ assert_nil @map.layers['xxx']
91
+ oldcnt = @map.numlayers
92
+ @map.layers << @map.layers.first
93
+ assert_equal oldcnt+1, @map.numlayers
94
+ assert_equal @map.numlayers, @map.layers.to_a.size
95
+ assert_equal @map.numlayers, @map.layers[0..-1].size
96
+
97
+ assert !@map.layers.first.visible?
98
+ end
99
+
100
+ def test_class_access
101
+ layer = @map.layers['shppoly']
102
+ assert_equal layer.numclasses, layer.classes.to_a.size
103
+ assert_equal layer.numclasses, layer.classes[0..-1].size
104
+ assert_equal 'test1', layer.classes[0].name
105
+ assert_equal 'test1', layer.classes[-layer.numclasses].name
106
+ assert_nil layer.classes[99]
107
+ assert_equal 'test1', layer.classes['test1'].name
108
+ assert_nil layer.classes['xxx']
109
+ oldcnt = layer.numclasses
110
+ layer.classes << layer.classes.first
111
+ assert_equal oldcnt+1, layer.numclasses
112
+ assert_equal layer.numclasses, layer.classes.to_a.size
113
+ assert_equal layer.numclasses, layer.classes[0..-1].size
114
+ end
115
+
116
+ def test_iterators
117
+ assert_equal 0, LabelObj.new.styles.size
118
+
119
+ assert_equal 0, ResultCacheObj.new.results.size
120
+
121
+ shapefile = File.join(File.dirname(__FILE__), 'data', 'world_testpoly.shp')
122
+ shapefile_obj = ShapefileObj.new(shapefile)
123
+ assert_equal 4, shapefile_obj.shapes.size
124
+ shape = shapefile_obj.shapes[0]
125
+ assert_equal 0, shape.index
126
+ assert_equal 1, shape.lines.size
127
+ lines = shape.lines[0]
128
+ assert_equal 0, shape.values.size
129
+ assert_equal 5, lines.points.size
130
+ point = lines.points[0]
131
+ assert_not_nil point
132
+
133
+ symbol_set = SymbolSetObj.new
134
+ assert_equal 1, symbol_set.symbols.size
135
+ assert_not_nil symbol_set.symbols[0]
136
+ end
137
+
138
+ def test_empty_map
139
+ mapfile = File.join(File.dirname(__FILE__), 'empty.map')
140
+ @map = MapObj.new(mapfile)
141
+ assert_equal 0, @map.layers.to_a.size
142
+ assert_nil @map.layers[0]
143
+ assert_nil @map.layers[-1]
144
+ assert_nil @map.layers['wms_layer']
145
+ @map.layers.each { }
146
+ end
147
+
148
+ def test_draw
149
+ mapimage = @map.draw
150
+ assert mapimage.getSize >= 2338
151
+ end
152
+
153
+ def test_examples
154
+ map = @map
155
+ map.layers.each do |layer|
156
+ #puts layer.name
157
+ end
158
+ 0.upto(map.numlayers-1) do |i|
159
+ layer = map.getLayer(i)
160
+ #puts layer.name
161
+ end
162
+ wms_layers = map.layers.select { |layer| layer.connectiontype == MS_WMS }
163
+ assert_equal 1, wms_layers.size
164
+ end
165
+
166
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby_mapscript
3
+ version: !ruby/object:Gem::Version
4
+ hash: 19
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 3
9
+ - 0
10
+ version: 0.3.0
11
+ platform: ruby
12
+ authors:
13
+ - Pirmin Kalberer
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-02-24 00:00:00 Z
19
+ dependencies: []
20
+
21
+ description: Ruby Mapscript API extensions
22
+ email:
23
+ - pka@sourcepole.ch
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files: []
29
+
30
+ files:
31
+ - .gitignore
32
+ - Gemfile
33
+ - README.rst
34
+ - Rakefile
35
+ - lib/mapscript/mapscript_extensions.rb
36
+ - lib/ruby_mapscript.rb
37
+ - lib/ruby_mapscript/mapserver.rb
38
+ - lib/ruby_mapscript/version.rb
39
+ - ruby_mapscript.gemspec
40
+ - test/data/world_testpoly.dbf
41
+ - test/data/world_testpoly.shp
42
+ - test/data/world_testpoly.shx
43
+ - test/empty.map
44
+ - test/test.map
45
+ - test/test_mapscript_extensions.rb
46
+ homepage: https://github.com/sourcepole/ruby_mapscript
47
+ licenses: []
48
+
49
+ post_install_message:
50
+ rdoc_options: []
51
+
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ hash: 3
69
+ segments:
70
+ - 0
71
+ version: "0"
72
+ requirements: []
73
+
74
+ rubyforge_project: ruby_mapscript
75
+ rubygems_version: 1.7.2
76
+ signing_key:
77
+ specification_version: 3
78
+ summary: Ruby Mapscript API extensions
79
+ test_files: []
80
+