ruby_mapscript 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+