arcrest 0.0.1 → 0.0.6
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.
- checksums.yaml +5 -5
- data/.gitignore +2 -0
- data/.gitlab-ci.yml +15 -0
- data/.rubocop.yml +6 -0
- data/Gemfile +2 -0
- data/Guardfile +5 -9
- data/README.md +71 -35
- data/Rakefile +2 -0
- data/arcrest.gemspec +15 -10
- data/bin/console +3 -8
- data/bin/setup +0 -2
- data/lib/arcrest.rb +2 -0
- data/lib/arcrest/attributable.rb +6 -4
- data/lib/arcrest/catalog.rb +9 -4
- data/lib/arcrest/curlable.rb +33 -0
- data/lib/arcrest/layer.rb +28 -21
- data/lib/arcrest/server.rb +36 -22
- data/lib/arcrest/service.rb +11 -7
- data/lib/arcrest/version.rb +3 -1
- metadata +55 -26
- data/.travis.yml +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: '0926148a508e0d0c5786d3016065bb1588667f1a31f73baedf9d7c414a883dfb'
|
4
|
+
data.tar.gz: 7dfff2271f6423932dba2d6e478188ec1b8d095b694c6bfaf4813c119da78d17
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b831ce217e8070a627ccd061469dad381bce10e2358e3e929bcbf856f0d5012e05d03f85cb2bb95371df469fc818edc0a8a6c8481b88652d1eeea8d9fac50a66
|
7
|
+
data.tar.gz: fac1baab6010b743b3a3e520a6eea847da6f0809c9223c256df8027c10f446f447c3a9c9ee91f61cb7006bb9cf59db2316777d7971f7e6f6136c69229792134a
|
data/.gitignore
CHANGED
data/.gitlab-ci.yml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
before_script:
|
3
|
+
- apt-get update -qq
|
4
|
+
- gem install bundler
|
5
|
+
- bundle install --jobs $(nproc) "${FLAGS[@]}"
|
6
|
+
|
7
|
+
.job_template: &job_definition
|
8
|
+
image: ruby:2.7.2
|
9
|
+
|
10
|
+
test:
|
11
|
+
<<: *job_definition
|
12
|
+
timeout: 10m
|
13
|
+
script:
|
14
|
+
- bundle exec rake spec
|
15
|
+
- bundle exec rubocop
|
data/.rubocop.yml
ADDED
data/Gemfile
CHANGED
data/Guardfile
CHANGED
@@ -1,13 +1,9 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
watch(%r{^lib/(.+).rb$}) do |m| # watch /lib/ files
|
5
|
-
"spec/#{m[1]}_spec.rb"
|
6
|
-
end
|
7
|
-
|
8
|
-
watch(%r{^spec/(.+).rb$}) do |m| # watch /spec/ files
|
9
|
-
"spec/#{m[1]}.rb"
|
10
|
-
end
|
3
|
+
notification :libnotify, transient: true, append: false, urgency: :critical
|
11
4
|
|
5
|
+
guard :rspec, cmd: 'bundle exec rspec' do
|
6
|
+
watch(%r{^lib/(.+).rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
7
|
+
watch(%r{^spec/(.+).rb$}) { |m| "spec/#{m[1]}.rb" }
|
12
8
|
watch('spec/spec_helper.rb') { 'spec' }
|
13
9
|
end
|
data/README.md
CHANGED
@@ -1,18 +1,15 @@
|
|
1
1
|
# ArcREST
|
2
|
-
[](http://travis-ci.org/MatzFan/ArcREST)
|
3
|
-
[](http://badge.fury.io/rb/arcrest)
|
4
2
|
|
5
|
-
Ruby Gem wrapper around the [ArcGIS REST API](
|
3
|
+
Ruby Gem wrapper around the [ArcGIS REST API](https://services.arcgisonline.com/arcgis/sdk/rest/)
|
6
4
|
|
7
5
|
## Requirements
|
8
6
|
|
9
|
-
|
7
|
+
Ruby >= 2.4
|
10
8
|
|
11
9
|
|
12
10
|
## Current Limitations
|
13
11
|
|
14
|
-
API FeatureServer query capabilities only at present.
|
15
|
-
|
12
|
+
API FeatureServer query capabilities only at present.
|
16
13
|
|
17
14
|
## Installation
|
18
15
|
|
@@ -36,54 +33,93 @@ The API defines a [resource heirarchy](http://services.arcgisonline.com/arcgis/s
|
|
36
33
|
```ruby
|
37
34
|
require 'arcrest'
|
38
35
|
|
39
|
-
catalog = ArcREST::Catalog.new
|
36
|
+
catalog = ArcREST::Catalog.new 'https://sampleserver6.arcgisonline.com/arcgis/rest/services'
|
40
37
|
puts catalog.services
|
41
|
-
#=> {"name"=>"
|
42
|
-
#=> {"name"=>"
|
43
|
-
#=> {"name"=>"
|
44
|
-
|
38
|
+
#=> {"name"=>"911CallsHotspot", "type"=>"GPServer"}
|
39
|
+
#=> {"name"=>"911CallsHotspot", "type"=>"MapServer"}
|
40
|
+
#=> {"name"=>"Census", "type"=>"MapServer"}
|
41
|
+
...
|
42
|
+
|
43
|
+
puts catalog.folders
|
44
|
+
#=> AGP
|
45
|
+
#=> Elevation
|
46
|
+
#=> Energy
|
47
|
+
...
|
48
|
+
```
|
49
|
+
It is also possible to pass a Referer (or any other) header which will be added to all HTTP requests:
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
catalog = ArcREST::Catalog.new('https://gojdippmaps.azurewebsites.net/proxy.ashx?https://maps.gov.je/arcgis/rest/services', headers: {referer: 'https://www.gov.je//citizen/Planning/Pages/HistoricEnvironmentDetail.aspx'})
|
53
|
+
```
|
54
|
+
|
55
|
+
A Service (FeatureServer) is instantiated like this:
|
45
56
|
|
46
|
-
|
57
|
+
```ruby
|
58
|
+
service = ArcREST::Service.new 'https://sampleserver6.arcgisonline.com/arcgis/rest/services/EmergencyFacilities/FeatureServer'
|
47
59
|
puts service.layers
|
48
|
-
#=> {"id"=>
|
49
|
-
#=> {"id"=>2, "name"=>"Fire Perimeters"}
|
50
|
-
#=> {"id"=>3, "name"=>"MODIS Thermal Satellite"}
|
51
|
-
#=> {"id"=>4, "name"=>"Inactive Fire Perimeters"}
|
60
|
+
#=> {"id"=>0, "name"=>"Emergency Facilities", "parentLayerId"=>-1, "defaultVisibility"=>true, "subLayerIds"=>nil, "minScale"=>150000, "maxScale"=>0, "type"=>"Feature Layer", "geometryType"=>"esriGeometryPoint"}
|
52
61
|
|
53
|
-
layer = ArcREST::Layer.new
|
62
|
+
layer = ArcREST::Layer.new "#{service.url}/0"
|
54
63
|
puts layer.name
|
55
|
-
#=>
|
64
|
+
#=> Emergency Facilities
|
65
|
+
|
56
66
|
puts layer.type
|
57
67
|
#=> Feature Layer
|
68
|
+
|
69
|
+
puts layer.max_record_count
|
70
|
+
#=> 1000 # maximum number of features that can be queried, see below
|
71
|
+
|
58
72
|
puts layer.count
|
59
|
-
#=>
|
73
|
+
#=> 16 # count of the layer's features
|
74
|
+
|
60
75
|
puts layer.object_ids.inspect
|
61
|
-
#=> [
|
76
|
+
#=> [29489, 29503, 29490, 29491, 29492, 29493, 29494, 29495, 29496, 29497, 29498, 29499, 29500, 29501, 29502, 29504]
|
77
|
+
|
62
78
|
puts layer.fields
|
63
|
-
#=> {"name"=>"objectid", "type"=>"esriFieldTypeOID", "alias"=>"OBJECTID", "domain"=>nil, "editable"=>false, "nullable"=>false}
|
64
|
-
#=> {"name"=>"
|
65
|
-
|
79
|
+
#=> {"name"=>"objectid", "type"=>"esriFieldTypeOID", "alias"=>"OBJECTID", "domain"=>nil, "editable"=>false, "nullable"=>false, "defaultValue"=>nil, "modelName"=>"System-maintained ObjectID"}
|
80
|
+
#=> {"name"=>"facilityid", "type"=>"esriFieldTypeString", "alias"=>"Emergency Facility ID", "domain"=>nil, "editable"=>true, "nullable"=>true, "length"=>20, "defaultValue"=>nil, "modelName"=>"FACILITYID"},
|
81
|
+
...
|
66
82
|
```
|
67
83
|
|
68
|
-
|
84
|
+
Catalog, Service and Layer have a ```json``` method which returns information from the relevant server as a Hash. In addition to the example methods above this can be parsed in the usual way - e.g:
|
85
|
+
```ruby
|
86
|
+
puts layer.json.keys.inspect
|
87
|
+
#=> ["currentVersion", "id", "name", "type", "parentLayer", "defaultVisibility", ...
|
88
|
+
```
|
89
|
+
|
90
|
+
Once you have a Layer object, you can perform queries on it. The [documention](https://services.arcgisonline.com/arcgis/sdk/rest/index.html#/Query_Feature_Service_Layer/02ss0000002r000000/) shows the possibilities. Here is a very simple example:
|
91
|
+
|
92
|
+
The ```query``` method returns the whole server response as a Hash:
|
93
|
+
```ruby
|
94
|
+
puts layer.query(where: '1=0').inspect
|
95
|
+
#=> {"objectIdFieldName"=>"objectid", "globalIdFieldName"=>"globalid", "geometryType"=>"esriGeometryPoint", "spatialReference"=>{"wkid"=>4326, "latestWkid"=>4326}, "features"=>[]}
|
96
|
+
```
|
69
97
|
|
98
|
+
If you just want the features, use the ```features``` method:
|
70
99
|
```ruby
|
71
|
-
features = layer.features(where: "agency='BLM'", returnGeometry: false)
|
72
100
|
puts features.count
|
73
|
-
#=>
|
74
|
-
|
75
|
-
|
101
|
+
#=> 16
|
102
|
+
|
103
|
+
puts features[1]
|
104
|
+
#=> {"attributes"=>{"objectid"=>29503, "facilityid"=>"K2032", "facname"=>"Redlands Mall", "factype"=>3, ...
|
105
|
+
|
106
|
+
features = layer.features(where: "factype=3", returnGeometry: false)
|
107
|
+
puts features.size
|
108
|
+
#=> 7
|
109
|
+
|
110
|
+
puts features.first['attributes']
|
111
|
+
#=> {"objectid"=>29503, "facilityid"=>"K2032", "facname"=>"Redlands Mall", "factype"=>3, "organiz"=>"City of Redlands", ...
|
76
112
|
```
|
77
113
|
|
78
|
-
```features```
|
114
|
+
```query``` and ```features``` take an options hash of API call params. Invalid key values raise an error. Valid params for the server can be listed like this:
|
79
115
|
```ruby
|
80
116
|
puts layer.valid_opts.inspect
|
81
|
-
#=> ["dbVersion", "distance", "geometry", "geometryPrecision"...
|
117
|
+
#=> ["dbVersion", "distance", "geometry", "geometryPrecision", ... , "where"]
|
82
118
|
```
|
83
|
-
or by consulting the [docs](
|
119
|
+
or by consulting the [docs](https://services.arcgisonline.com/arcgis/sdk/rest/index.html#/Query_Feature_Service_Layer/02ss0000002r000000/). One default is set: ```outFields: '*'``` - which requests data for all fields.
|
84
120
|
|
85
121
|
|
86
|
-
The ```:where``` key is used with any valid SQL to query the layer fields. The default is '1=1' which returns all records (up to the
|
122
|
+
The ```:where``` key is used with any valid SQL to query the layer fields. The default is '1=1' which returns all records (up to the ```layer.max_record_count``` value, usually 1,000). An error is raised if the server gives a 400 error of this form:
|
87
123
|
```json
|
88
124
|
{
|
89
125
|
"error": {
|
@@ -100,14 +136,14 @@ The ```:where``` key is used with any valid SQL to query the layer fields. The d
|
|
100
136
|
|
101
137
|
## Specification & Tests
|
102
138
|
|
103
|
-
Full specification documentation is available
|
139
|
+
Full specification documentation is available by running the test suite thus:
|
104
140
|
|
105
|
-
$ rake spec
|
141
|
+
$ bundle exec rake spec
|
106
142
|
|
107
143
|
|
108
144
|
## Contributing
|
109
145
|
|
110
|
-
Bug reports and pull requests are welcome on GitHub at https://
|
146
|
+
Bug reports and pull requests are welcome on GitHub at https://gitlab.com/matzfan/arcrest
|
111
147
|
|
112
148
|
|
113
149
|
## License
|
data/Rakefile
CHANGED
data/arcrest.gemspec
CHANGED
@@ -1,18 +1,20 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'arcrest/version'
|
5
6
|
|
6
7
|
Gem::Specification.new do |spec|
|
7
8
|
spec.name = 'arcrest'
|
8
9
|
spec.version = ArcREST::VERSION
|
9
|
-
spec.authors = ['
|
10
|
-
spec.email = ['
|
10
|
+
spec.authors = ['matzfan']
|
11
|
+
spec.email = ['matzfan@yandex.com']
|
11
12
|
|
12
13
|
spec.summary = 'Wrapper for ArcGIS REST API'
|
13
14
|
spec.description = 'Wrapper for ArcGIS REST API'
|
14
|
-
spec.homepage = 'https://
|
15
|
-
spec.
|
15
|
+
spec.homepage = 'https://gitlab.com/matzfan/arcrest'
|
16
|
+
spec.required_ruby_version = '>= 2.4'
|
17
|
+
spec.license = 'MIT'
|
16
18
|
|
17
19
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
20
|
f.match(%r{^(test|spec|features)/})
|
@@ -21,10 +23,13 @@ Gem::Specification.new do |spec|
|
|
21
23
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
24
|
spec.require_paths = ['lib']
|
23
25
|
|
24
|
-
spec.add_development_dependency 'bundler', '~> 1
|
25
|
-
spec.add_development_dependency 'rake', '~> 10.0'
|
26
|
-
spec.add_development_dependency 'rspec', '~> 3.0'
|
26
|
+
spec.add_development_dependency 'bundler', '~> 2.1'
|
27
27
|
spec.add_development_dependency 'guard', '~> 2.14'
|
28
28
|
spec.add_development_dependency 'guard-rspec', '~> 4.7'
|
29
|
-
spec.add_development_dependency '
|
29
|
+
spec.add_development_dependency 'libnotify', '~> 0.9' # guard notifications
|
30
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
31
|
+
spec.add_development_dependency 'rspec', '~> 3.10'
|
32
|
+
spec.add_development_dependency 'rubocop', '~> 1.3'
|
33
|
+
|
34
|
+
spec.add_runtime_dependency 'curb', '~> 0.9.11'
|
30
35
|
end
|
data/bin/console
CHANGED
@@ -1,14 +1,9 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# !/usr/bin/env ruby
|
2
4
|
|
3
5
|
require 'bundler/setup'
|
4
6
|
require 'arcrest'
|
5
7
|
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
8
|
require 'irb'
|
14
9
|
IRB.start
|
data/bin/setup
CHANGED
data/lib/arcrest.rb
CHANGED
data/lib/arcrest/attributable.rb
CHANGED
@@ -1,15 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# adds ability to dynamically set instance vars & accessors
|
2
4
|
module Attributable
|
3
5
|
def create_method(name, &block)
|
4
6
|
self.class.send(:define_method, name.to_sym, &block)
|
5
7
|
end
|
6
8
|
|
7
|
-
def create_setter(
|
8
|
-
create_method("#{
|
9
|
+
def create_setter(method)
|
10
|
+
create_method("#{method}=".to_sym) { |v| instance_variable_set("@#{method}", v) }
|
9
11
|
end
|
10
12
|
|
11
|
-
def create_getter(
|
12
|
-
create_method(
|
13
|
+
def create_getter(method)
|
14
|
+
create_method(method.to_sym) { instance_variable_get("@#{method}") }
|
13
15
|
end
|
14
16
|
|
15
17
|
def set_attr(method, value)
|
data/lib/arcrest/catalog.rb
CHANGED
@@ -1,18 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ArcREST
|
2
4
|
# a catalog of services
|
3
5
|
class Catalog < Server
|
4
6
|
attr_reader :folders, :services
|
5
7
|
|
6
|
-
def initialize(url)
|
8
|
+
def initialize(url, headers = {})
|
7
9
|
super
|
8
|
-
@
|
10
|
+
@folders = folders_
|
11
|
+
@services = services_
|
9
12
|
end
|
10
13
|
|
11
|
-
|
14
|
+
private
|
15
|
+
|
16
|
+
def folders_
|
12
17
|
@json['folders']
|
13
18
|
end
|
14
19
|
|
15
|
-
def
|
20
|
+
def services_
|
16
21
|
@json['services']
|
17
22
|
end
|
18
23
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'curb'
|
4
|
+
|
5
|
+
# methods to curl a url
|
6
|
+
module Curlable
|
7
|
+
RETRIES = 5
|
8
|
+
|
9
|
+
class BadHttpResponse < StandardError; end
|
10
|
+
|
11
|
+
def curl_get(url, opts = {})
|
12
|
+
c = Curl::Easy.new(url) { |curl| configure(curl, opts[:headers] || {}) }
|
13
|
+
try(c, opts[:retries] || RETRIES)
|
14
|
+
c.perform
|
15
|
+
code = c.response_code
|
16
|
+
raise BadHttpResponse, "#{code} at #{url}" unless [2, 3].include? code / 100
|
17
|
+
|
18
|
+
c.body_str
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def try(curl, tries)
|
24
|
+
curl.perform
|
25
|
+
curl.on_failure { |c, _e| try(c, tries -= 1) if tries > 1 } # recurse
|
26
|
+
end
|
27
|
+
|
28
|
+
def configure(curl, headers)
|
29
|
+
curl.follow_location = true
|
30
|
+
curl.encoding = 'gzip'
|
31
|
+
headers.each { |k, v| curl.headers[k.capitalize] = v }
|
32
|
+
end
|
33
|
+
end
|
data/lib/arcrest/layer.rb
CHANGED
@@ -1,35 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ArcREST
|
2
4
|
class InvalidOption < StandardError; end
|
3
|
-
|
5
|
+
|
6
|
+
class BadQuery < StandardError; end
|
7
|
+
|
4
8
|
# a layer
|
5
9
|
class Layer < Server
|
6
10
|
include Attributable
|
7
11
|
|
8
|
-
|
9
|
-
ATTRIBUTES = %w
|
12
|
+
DATE = 'esriFieldTypeDate'
|
13
|
+
ATTRIBUTES = %w[id name type drawing_info fields max_record_count].freeze
|
10
14
|
DEFAULT_PARAMS = { where: '1=1', outFields: '*' }.freeze
|
11
|
-
PARAMS = %w
|
15
|
+
PARAMS = %w[distance geometry geometryType inSR objectIds
|
12
16
|
outFields outSR relationParam returnDistinceValues
|
13
|
-
returnIdsOnly spatialRel time where
|
14
|
-
PARAMS_SP1 = %w
|
15
|
-
PARAMS_10_1 = %w
|
17
|
+
returnIdsOnly spatialRel time where].freeze
|
18
|
+
PARAMS_SP1 = %w[returnCountOnly].freeze
|
19
|
+
PARAMS_10_1 = %w[dbVersion geometryPrecision groupByFieldsForStatistics
|
16
20
|
maxAllowableOffset multiPatchOption orderByFields
|
17
|
-
outStatistics returnGeometry returnM returnZ
|
18
|
-
PARAMS_10_3 = %w
|
21
|
+
outStatistics returnGeometry returnM returnZ].freeze
|
22
|
+
PARAMS_10_3 = %w[returnExtentOnly resultOffset resultRecordCount].freeze
|
19
23
|
|
20
24
|
attr_reader :valid_params # other accessors set in constructor
|
21
25
|
|
22
|
-
def initialize(url)
|
26
|
+
def initialize(url, headers = {})
|
23
27
|
super
|
24
28
|
generate_attributes # dynamically create & assign values to attributes :)
|
29
|
+
@fields = fields
|
25
30
|
end
|
26
31
|
|
27
32
|
def count
|
28
33
|
@version > 10 ? count_only_true : object_ids.count # v10.1 onwards
|
29
34
|
end
|
30
35
|
|
31
|
-
def object_ids
|
32
|
-
query(outFields: nil, returnIdsOnly: true)['objectIds']
|
36
|
+
def object_ids
|
37
|
+
query(outFields: nil, returnIdsOnly: true)['objectIds'] # care - must specify outFields to overide default '*'
|
38
|
+
end
|
39
|
+
|
40
|
+
def query(options = {})
|
41
|
+
validate(options.keys.map(&:to_s).sort)
|
42
|
+
valid_resp(DEFAULT_PARAMS.merge(options))
|
33
43
|
end
|
34
44
|
|
35
45
|
def features(options = {})
|
@@ -37,9 +47,10 @@ module ArcREST
|
|
37
47
|
end
|
38
48
|
|
39
49
|
def valid_opts
|
40
|
-
return PARAMS if @version < 10 || @version == 10.0
|
50
|
+
return PARAMS if @version < 10 || @version.to_s == '10.0'
|
41
51
|
return (PARAMS + PARAMS_SP1).sort if @version < 10.1
|
42
52
|
return (PARAMS + PARAMS_SP1 + PARAMS_10_1).sort if @version < 10.2
|
53
|
+
|
43
54
|
(PARAMS + PARAMS_SP1 + PARAMS_10_1 + PARAMS_10_3).sort
|
44
55
|
end
|
45
56
|
|
@@ -58,13 +69,9 @@ module ArcREST
|
|
58
69
|
words[1..-1].map(&:capitalize).unshift(words.first).join
|
59
70
|
end
|
60
71
|
|
61
|
-
def
|
62
|
-
|
63
|
-
valid_resp(build_uri, DEFAULT_PARAMS.merge(options))
|
64
|
-
end
|
72
|
+
def valid_resp(opts)
|
73
|
+
raise BadQuery, m(opts) if (resp = parse_json(query_url, opts)).keys.include? 'error'
|
65
74
|
|
66
|
-
def valid_resp(uri, opts)
|
67
|
-
raise InvalidQuery, m(opts) if (resp = json(uri, opts)).keys.include? ERR
|
68
75
|
resp
|
69
76
|
end
|
70
77
|
|
@@ -84,8 +91,8 @@ module ArcREST
|
|
84
91
|
query(returnCountOnly: true)['count']
|
85
92
|
end
|
86
93
|
|
87
|
-
def
|
88
|
-
|
94
|
+
def query_url
|
95
|
+
"#{@server_url}/query"
|
89
96
|
end
|
90
97
|
end
|
91
98
|
end
|
data/lib/arcrest/server.rb
CHANGED
@@ -1,48 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'net/http'
|
4
|
+
require 'open-uri'
|
2
5
|
require 'json'
|
3
6
|
|
7
|
+
require_relative 'curlable'
|
8
|
+
|
4
9
|
module ArcREST
|
5
|
-
#
|
10
|
+
# superclass
|
6
11
|
class Server
|
7
|
-
|
8
|
-
|
12
|
+
include Curlable # for #curl_get
|
13
|
+
|
14
|
+
ENDPOINT_REGEX = %r{/arcgis/rest/services/?}i.freeze
|
15
|
+
BAD_ENDPOINT = 'Invalid ArcGIS endpoint'
|
9
16
|
|
10
17
|
attr_reader :url, :json, :version
|
11
18
|
|
12
|
-
def initialize(url)
|
19
|
+
def initialize(url, headers = {})
|
13
20
|
@url = url
|
14
|
-
@
|
15
|
-
|
16
|
-
@
|
17
|
-
@
|
21
|
+
@headers = headers
|
22
|
+
validate_endpoint_url
|
23
|
+
@server_url = server_url
|
24
|
+
@json = json_
|
25
|
+
@version = version_
|
18
26
|
end
|
19
27
|
|
20
|
-
|
21
|
-
|
28
|
+
protected
|
29
|
+
|
30
|
+
def server_url
|
31
|
+
@url[-1] == '/' ? @url[0..-2] : @url
|
22
32
|
end
|
23
33
|
|
24
|
-
def
|
25
|
-
|
34
|
+
def json_
|
35
|
+
parse_json
|
26
36
|
end
|
27
37
|
|
28
|
-
|
38
|
+
def version_
|
39
|
+
parse_json['currentVersion'] # subclasses use server uri
|
40
|
+
end
|
29
41
|
|
30
|
-
def
|
31
|
-
|
32
|
-
URI @url
|
42
|
+
def parse_json(url = @server_url, options = {})
|
43
|
+
JSON.parse get(url, options)
|
33
44
|
end
|
34
45
|
|
35
|
-
def
|
36
|
-
|
46
|
+
def validate_endpoint_url
|
47
|
+
raise ArgumentError, BAD_ENDPOINT unless @url =~ ENDPOINT_REGEX
|
37
48
|
end
|
38
49
|
|
39
50
|
def add_json_param_to(hash)
|
40
|
-
{ f: '
|
51
|
+
{ f: 'json' }.merge(hash)
|
52
|
+
end
|
53
|
+
|
54
|
+
def get(url, options = {})
|
55
|
+
curl_get(query_string(url, options), @headers)
|
41
56
|
end
|
42
57
|
|
43
|
-
def
|
44
|
-
|
45
|
-
Net::HTTP.get uri
|
58
|
+
def query_string(url, options)
|
59
|
+
"#{url}?#{URI.encode_www_form(add_json_param_to(options))}"
|
46
60
|
end
|
47
61
|
end
|
48
62
|
end
|
data/lib/arcrest/service.rb
CHANGED
@@ -1,24 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ArcREST
|
2
4
|
# a FeatureService or a MapService
|
3
5
|
class Service < Server
|
4
6
|
attr_reader :max_record_count, :capabilities, :layers
|
5
7
|
|
6
|
-
def initialize(url)
|
8
|
+
def initialize(url, headers = {})
|
7
9
|
super
|
8
|
-
@max_record_count =
|
9
|
-
@capabilities =
|
10
|
-
@layers =
|
10
|
+
@max_record_count = max_record_count_
|
11
|
+
@capabilities = capabilities_
|
12
|
+
@layers = layers_
|
11
13
|
end
|
12
14
|
|
13
|
-
|
15
|
+
private
|
16
|
+
|
17
|
+
def max_record_count_
|
14
18
|
@json['maxRecordCount']
|
15
19
|
end
|
16
20
|
|
17
|
-
def
|
21
|
+
def capabilities_
|
18
22
|
@json['capabilities'] ? @json['capabilities'].split(',') : nil
|
19
23
|
end
|
20
24
|
|
21
|
-
def
|
25
|
+
def layers_
|
22
26
|
@json['layers']
|
23
27
|
end
|
24
28
|
end
|
data/lib/arcrest/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arcrest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- matzfan
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-11-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,94 +16,123 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1
|
19
|
+
version: '2.1'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1
|
26
|
+
version: '2.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: guard
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '2.14'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '2.14'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name: rspec
|
42
|
+
name: guard-rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '4.7'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '4.7'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: libnotify
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '0.9'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '0.9'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '13.0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '13.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.10'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.10'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
98
|
+
name: rubocop
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
86
100
|
requirements:
|
87
101
|
- - "~>"
|
88
102
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
103
|
+
version: '1.3'
|
90
104
|
type: :development
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
108
|
- - "~>"
|
95
109
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
110
|
+
version: '1.3'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: curb
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.9.11
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 0.9.11
|
97
125
|
description: Wrapper for ArcGIS REST API
|
98
126
|
email:
|
99
|
-
-
|
127
|
+
- matzfan@yandex.com
|
100
128
|
executables: []
|
101
129
|
extensions: []
|
102
130
|
extra_rdoc_files: []
|
103
131
|
files:
|
104
132
|
- ".gitignore"
|
133
|
+
- ".gitlab-ci.yml"
|
105
134
|
- ".rspec"
|
106
|
-
- ".
|
135
|
+
- ".rubocop.yml"
|
107
136
|
- Gemfile
|
108
137
|
- Guardfile
|
109
138
|
- LICENSE.txt
|
@@ -115,11 +144,12 @@ files:
|
|
115
144
|
- lib/arcrest.rb
|
116
145
|
- lib/arcrest/attributable.rb
|
117
146
|
- lib/arcrest/catalog.rb
|
147
|
+
- lib/arcrest/curlable.rb
|
118
148
|
- lib/arcrest/layer.rb
|
119
149
|
- lib/arcrest/server.rb
|
120
150
|
- lib/arcrest/service.rb
|
121
151
|
- lib/arcrest/version.rb
|
122
|
-
homepage: https://
|
152
|
+
homepage: https://gitlab.com/matzfan/arcrest
|
123
153
|
licenses:
|
124
154
|
- MIT
|
125
155
|
metadata: {}
|
@@ -131,15 +161,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
131
161
|
requirements:
|
132
162
|
- - ">="
|
133
163
|
- !ruby/object:Gem::Version
|
134
|
-
version: '
|
164
|
+
version: '2.4'
|
135
165
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
136
166
|
requirements:
|
137
167
|
- - ">="
|
138
168
|
- !ruby/object:Gem::Version
|
139
169
|
version: '0'
|
140
170
|
requirements: []
|
141
|
-
|
142
|
-
rubygems_version: 2.5.1
|
171
|
+
rubygems_version: 3.1.4
|
143
172
|
signing_key:
|
144
173
|
specification_version: 4
|
145
174
|
summary: Wrapper for ArcGIS REST API
|