arcserver.rb 0.1.4 → 0.1.5

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 (47) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.travis.yml +12 -0
  4. data/Gemfile +7 -0
  5. data/Gemfile.lock +274 -0
  6. data/LICENSE +20 -20
  7. data/README.md +160 -0
  8. data/Rakefile +9 -62
  9. data/arcserver.rb.gemspec +35 -0
  10. data/lib/arcserver.rb +33 -7
  11. data/lib/arcserver/Identifiable.rb +10 -0
  12. data/lib/arcserver/Queryable.rb +10 -0
  13. data/lib/arcserver/feature_server.rb +19 -0
  14. data/lib/arcserver/geometry/geometry.rb +91 -0
  15. data/lib/arcserver/geometry_service.rb +18 -0
  16. data/lib/arcserver/gp_server.rb +20 -0
  17. data/lib/arcserver/graphics/feature.rb +23 -0
  18. data/lib/arcserver/graphics/feature_set.rb +26 -0
  19. data/lib/arcserver/map_server.rb +34 -40
  20. data/lib/arcserver/rest/feature_server.rb +30 -0
  21. data/lib/arcserver/rest/geometry_service.rb +54 -0
  22. data/lib/arcserver/rest/gp_server.rb +80 -0
  23. data/lib/arcserver/rest/identify.rb +66 -0
  24. data/lib/arcserver/rest/map_server.rb +230 -230
  25. data/lib/arcserver/rest/query.rb +68 -0
  26. data/lib/arcserver/url_helper.rb +31 -25
  27. data/lib/arcserver/util/legend_image.rb +0 -0
  28. data/lib/arcserver/version.rb +6 -6
  29. data/spec/custom_spec.rb +50 -0
  30. data/spec/factories/feature.rb +21 -0
  31. data/spec/feature_server_spec.rb +52 -0
  32. data/spec/feature_spec.rb +20 -0
  33. data/spec/geometry_service_spec.rb +31 -0
  34. data/spec/geometry_spec.rb +80 -0
  35. data/spec/gp_server_spec.rb +57 -0
  36. data/spec/identify_spec.rb +21 -0
  37. data/spec/query_spec.rb +38 -0
  38. data/spec/shared_context.rb +17 -0
  39. data/spec/spec_helper.rb +15 -0
  40. metadata +217 -158
  41. data/README.rdoc +0 -57
  42. data/lib/arcserver/soap/map_server.rb +0 -263
  43. data/test/functional/soap/map_server_test.rb +0 -193
  44. data/test/test_helper.rb +0 -25
  45. data/test/unit/map_server_test.rb +0 -61
  46. data/test/unit/url_helper_test.rb +0 -54
  47. data/test/unit/util/legend_image_test.rb +0 -69
data/Rakefile CHANGED
@@ -1,62 +1,9 @@
1
- $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
2
- require 'rake'
3
- require 'rake/testtask'
4
- require 'rake/rdoctask'
5
- require 'fileutils'
6
- require 'arcserver/version'
7
-
8
- desc "Run all tests"
9
- task :test => ["test:unit", "test:functional"]
10
-
11
- task :default => :test
12
-
13
- namespace :test do
14
- desc "Run unit tests"
15
- Rake::TestTask.new(:unit) do |test|
16
- test.libs << 'lib' << 'test'
17
- test.pattern = 'test/unit/**/*_test.rb'
18
- test.verbose = true
19
- end
20
-
21
- desc "Run functional tests"
22
- Rake::TestTask.new(:functional) do |test|
23
- test.libs << 'lib' << 'test'
24
- test.pattern = 'test/functional/**/*_test.rb'
25
- test.verbose = true
26
- end
27
- end
28
-
29
- Rake::RDocTask.new do |rdoc|
30
- rdoc.rdoc_dir = 'rdoc'
31
- rdoc.title = "arcserver.rb #{ArcServer::VERSION}"
32
- rdoc.rdoc_files.include('README*')
33
- rdoc.rdoc_files.include('lib/**/*.rb')
34
- end
35
-
36
-
37
- begin
38
- require 'yard'
39
- YARD::Rake::YardocTask.new do |t|
40
- t.files = ['lib/**/*.rb']
41
- end
42
- rescue LoadError
43
-
44
- end
45
-
46
- desc "Build arcserver.rb gem"
47
- task :build do
48
- system "gem build arcserver.rb.gemspec"
49
-
50
- base_dir = File.dirname(__FILE__)
51
- pkg_dir = File.join(base_dir, "pkg")
52
- FileUtils.mkdir_p pkg_dir
53
-
54
- gem_file_name = File.join(base_dir, "arcserver.rb-#{ArcServer::VERSION}.gem")
55
- FileUtils.mv(gem_file_name, pkg_dir)
56
- end
57
-
58
- desc "Release arcserver.rb gem"
59
- task :release => :build do
60
- system "gem push pkg/arcserver.rb-#{ArcServer::VERSION}"
61
- end
62
-
1
+ $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
2
+ require 'rspec/core/rake_task'
3
+ require 'arcserver/version'
4
+ require "bundler/gem_tasks"
5
+
6
+ task :default => :spec
7
+ task :test => :spec
8
+
9
+ RSpec::Core::RakeTask.new('spec')
@@ -0,0 +1,35 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'arcserver/version'
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "arcserver.rb"
8
+ s.version = ArcServer::VERSION
9
+ s.license = 'MIT'
10
+ s.authors = ["Luca Simone"]
11
+ s.date = "2013-08-28"
12
+ s.email = ["info@lucasimone.info"]
13
+ s.homepage = "http://github.com/lukefx/arcserver.rb"
14
+ s.summary = "A library for accessing ESRI ArcServer REST APIs from a unified interface"
15
+ s.description = "A library for accessing ESRI ArcServer REST APIs from a unified interface"
16
+
17
+ s.files = `git ls-files`.split($/)
18
+ s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_runtime_dependency 'activesupport'
23
+ s.add_runtime_dependency 'httparty'
24
+ s.add_runtime_dependency 'nokogiri'
25
+ s.add_runtime_dependency 'httpclient'
26
+ s.add_runtime_dependency 'json'
27
+ s.add_runtime_dependency 'rufus-scheduler'
28
+
29
+ s.add_development_dependency 'bundler'
30
+ s.add_development_dependency 'rake'
31
+ s.add_development_dependency 'sdoc'
32
+ s.add_development_dependency 'rspec'
33
+ s.add_development_dependency 'factory_girl'
34
+
35
+ end
@@ -1,7 +1,33 @@
1
- # encoding: utf-8
2
- require 'httparty'
3
- require 'handsoap'
4
- Handsoap.http_driver = :httpclient
5
-
6
- require 'arcserver/url_helper'
7
- require 'arcserver/map_server'
1
+ # encoding: utf-8
2
+
3
+ require 'ostruct'
4
+ require 'httparty'
5
+ require 'forwardable'
6
+ require 'rufus-scheduler'
7
+ require 'active_support/all'
8
+ # require 'active_support/core_ext/hash/indifferent_access'
9
+
10
+ require 'arcserver/version'
11
+ require 'arcserver/url_helper'
12
+ require 'arcserver/Identifiable'
13
+ require 'arcserver/Queryable'
14
+ require 'arcserver/map_server'
15
+ require 'arcserver/geometry_service'
16
+ require 'arcserver/feature_server'
17
+ require 'arcserver/gp_server'
18
+ require 'arcserver/geometry/geometry'
19
+ require 'arcserver/graphics/feature_set'
20
+ require 'arcserver/graphics/feature'
21
+ require 'arcserver/rest/map_server'
22
+ require 'arcserver/rest/geometry_service'
23
+ require 'arcserver/rest/feature_server'
24
+ require 'arcserver/rest/query'
25
+ require 'arcserver/rest/identify'
26
+ require 'arcserver/rest/gp_server'
27
+
28
+ # monkeypath OpenStruct
29
+ class OpenStruct
30
+ def as_json(options = nil)
31
+ table.as_json(options)
32
+ end
33
+ end
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+
3
+ module ArcServer
4
+ module Identifiable
5
+ def identify(attrs)
6
+ raise Exception, "#{url} is not defined" unless url
7
+ REST::Identify.new(attrs).execute(url)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+
3
+ module ArcServer
4
+ module Queryable
5
+ def query(layer, attrs)
6
+ raise Exception, "#{url} is not defined" unless url
7
+ REST::Query.new(attrs).execute("#{url}/#{layer}")
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,19 @@
1
+ # encoding: utf-8
2
+
3
+ module ArcServer
4
+ class FeatureServer
5
+
6
+ include UrlHelper
7
+ include Queryable
8
+ extend Forwardable
9
+
10
+ attr_reader :rest_service
11
+ def_delegators :rest_service, :url, :applyEdits
12
+
13
+ def initialize(url, opts = {})
14
+ raise Exception, "#{url} is not a valid feature server url" unless feature_server?(url)
15
+ @rest_service = opts[:rest_service] || REST::FeatureServer.new(to_rest(url))
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,91 @@
1
+ module ArcServer
2
+ module Geometry
3
+
4
+ class Geometry < OpenStruct
5
+
6
+ attr_accessor :spatialReference
7
+
8
+ def self.build(geometry, geometryType)
9
+ klass = {
10
+ esriGeometryPoint: ArcServer::Geometry::Point,
11
+ esriGeometryMultipoint: ArcServer::Geometry::Multipoint,
12
+ esriGeometryPolygon: ArcServer::Geometry::Polygon,
13
+ esriGeometryPolyline: ArcServer::Geometry::Polyline,
14
+ esriGeometryEnvelope: ArcServer::Geometry::Envelope,
15
+ }[geometryType.to_sym]
16
+ klass.new(geometry) rescue nil
17
+ end
18
+
19
+ def self.create(json)
20
+
21
+ parsed = json.is_a?(Hash) ? json : JSON.parse(json) rescue {}
22
+
23
+ if parsed['x']
24
+ ArcServer::Geometry::Point.new(parsed)
25
+ elsif parsed['paths']
26
+ ArcServer::Geometry::Polyline.new(parsed)
27
+ elsif parsed['rings']
28
+ ArcServer::Geometry::Polygon.new(parsed)
29
+ elsif parsed['points']
30
+ ArcServer::Geometry::Multipoint.new(parsed)
31
+ elsif parsed['ymax']
32
+ ArcServer::Geometry::Envelope.new(parsed)
33
+ else
34
+ nil
35
+ end
36
+
37
+ end
38
+
39
+ def geometryType
40
+ nil
41
+ end
42
+
43
+ def extent
44
+ nil
45
+ end
46
+
47
+ end
48
+
49
+ class Point < Geometry
50
+
51
+ def geometryType
52
+ "esriGeometryPoint"
53
+ end
54
+
55
+ end
56
+
57
+ class Multipoint < Geometry
58
+ def geometryType
59
+ "esriGeometryMultipoint"
60
+ end
61
+ end
62
+
63
+ class Polygon < Geometry
64
+
65
+ def geometryType
66
+ "esriGeometryPolygon"
67
+ end
68
+
69
+ def extent
70
+ poly = self.rings.flatten
71
+ x = poly.values_at(*poly.each_index.select {|i| i.even?})
72
+ y = poly.values_at(*poly.each_index.select {|i| i.odd?})
73
+ [x.min, y.min, x.max, y.max]
74
+ end
75
+
76
+ end
77
+
78
+ class Polyline < Geometry
79
+ def geometryType
80
+ "esriGeometryPolyline"
81
+ end
82
+ end
83
+
84
+ class Envelope < Geometry
85
+ def geometryType
86
+ "esriGeometryEnvelope"
87
+ end
88
+ end
89
+
90
+ end
91
+ end
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ module ArcServer
4
+ class GeometryService
5
+
6
+ include UrlHelper
7
+ extend Forwardable
8
+
9
+ attr_reader :rest_service
10
+ def_delegators :rest_service, :url, :project, :buffer
11
+
12
+ def initialize(url, opts = {})
13
+ raise Exception, "#{url} is not a valid Geometry Service url" unless geometry_service?(url)
14
+ @rest_service = opts[:rest_service] || REST::GeometryService.new(to_rest(url))
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+
3
+ module ArcServer
4
+ class ArcServerError < StandardError; end
5
+
6
+ class GPServer
7
+
8
+ include UrlHelper
9
+ extend Forwardable
10
+
11
+ attr_reader :rest_service
12
+ def_delegators :rest_service, :url, :submitJob, :execute
13
+
14
+ def initialize(url, opts = {})
15
+ raise Exception, "#{url} is not a valid map server url" unless gp_server?(url)
16
+ @rest_service = opts[:rest_service] || REST::GPServer.new(to_rest(url))
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,23 @@
1
+ module ArcServer
2
+ module Graphics
3
+ class Feature
4
+
5
+ attr_accessor :geometry, :attributes
6
+
7
+ def initialize(attr={})
8
+ @geometry = attr[:geometry]
9
+ @attributes = attr[:attributes] || { }
10
+ end
11
+
12
+ def self.create(json)
13
+ parsed = (json.is_a?(Hash) ? json : JSON.parse(json)).with_indifferent_access
14
+ Feature.new({ geometry: ArcServer::Geometry::Geometry.create(parsed['geometry']), attributes: parsed['attributes'] })
15
+ end
16
+
17
+ # def [](key)
18
+ # send key
19
+ # end
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,26 @@
1
+ module ArcServer
2
+ module Graphics
3
+ class FeatureSet
4
+
5
+ # include Enumerable
6
+
7
+ attr_accessor :displayFieldName, :geometryType, :fieldAliases, :features
8
+
9
+ def initialize(attrs={})
10
+ @fieldAliases = attrs[:fields] if attrs[:fields]
11
+ @geometryType = attrs[:geometryType] if attrs[:geometryType]
12
+
13
+ if attrs[:features]
14
+ @features = attrs[:features].map { |f| f.is_a?(Feature) ? f : Feature.create(f) }
15
+ end
16
+
17
+ # self
18
+ end
19
+
20
+ def empty?
21
+ @features.empty?
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -1,40 +1,34 @@
1
- # encoding: utf-8
2
- require 'arcserver/rest/map_server'
3
- require 'arcserver/soap/map_server'
4
- require 'arcserver/util/legend_image'
5
- require 'forwardable'
6
-
7
- module ArcServer
8
- class ArcServerError < StandardError; end
9
-
10
- class MapServer
11
- include UrlHelper
12
- extend Forwardable
13
-
14
- attr_reader :soap_service
15
- def_delegators :soap_service, :get_default_map_name, :get_legend_info, :get_legend_image
16
-
17
- attr_reader :rest_service
18
- def_delegators :rest_service, :export
19
-
20
- def initialize(url, opts = {})
21
- raise Exception, "#{url} is not a valid map server url" unless map_server?(url)
22
-
23
- @soap_service = opts[:soap_service] || SOAP::MapServer.new(to_soap(url))
24
- @rest_service = opts[:rest_service] || REST::MapServer.new(to_rest(url))
25
- end
26
-
27
- # Utility method for generating a legend image
28
- # (requires optional dependency, RMagick [>= 2.12.0], to be installed)
29
- #
30
- # @return [Magick::Image] the legend as an RMagick Image object
31
- def get_legend_image
32
- begin
33
- require 'RMagick' unless Object.const_defined?("Magick")
34
- rescue LoadError
35
- raise ArcServerError, "#{self.class}#get_legend_image needs an optional dependency 'RMagick [>= 2.12.0]' to be installed - try `gem install rmagick`"
36
- end
37
- Util::LegendImage.new(self).get_image
38
- end
39
- end
40
- end
1
+ # encoding: utf-8
2
+
3
+ module ArcServer
4
+ class ArcServerError < StandardError; end
5
+
6
+ class MapServer
7
+
8
+ include UrlHelper
9
+ include Identifiable
10
+ include Queryable
11
+ extend Forwardable
12
+
13
+ attr_reader :rest_service
14
+ def_delegators :rest_service, :url, :export
15
+
16
+ def initialize(url, opts = {})
17
+ raise Exception, "#{url} is not a valid map server url" unless map_server?(url)
18
+ @rest_service = opts[:rest_service] || REST::MapServer.new(to_rest(url))
19
+ end
20
+
21
+ # Utility method for generating a legend image
22
+ # (requires optional dependency, RMagick [>= 2.12.0], to be installed)
23
+ #
24
+ # @return [Magick::Image] the legend as an RMagick Image object
25
+ def get_legend_image
26
+ begin
27
+ require 'RMagick' unless Object.const_defined?("Magick")
28
+ rescue LoadError
29
+ raise ArcServerError, "#{self.class}#get_legend_image needs an optional dependency 'RMagick [>= 2.12.0]' to be installed - try `gem install rmagick`"
30
+ end
31
+ Util::LegendImage.new(self).get_image
32
+ end
33
+ end
34
+ end