ogc 0.1.1 → 0.2.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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ogc.rb +3 -5
  3. data/lib/ogc/abstract_base.rb +94 -0
  4. data/lib/ogc/core_ext.rb +1 -0
  5. data/lib/ogc/core_ext/string.rb +9 -0
  6. data/lib/ogc/errors.rb +8 -0
  7. data/lib/ogc/{exceptions → errors}/exception_report.rb +3 -3
  8. data/lib/ogc/errors/ogc_error.rb +5 -0
  9. data/lib/ogc/errors/request_error.rb +7 -0
  10. data/lib/ogc/{exceptions/request_failed_exception.rb → errors/service_error.rb} +4 -2
  11. data/lib/ogc/version.rb +1 -1
  12. data/lib/ogc/web_feature_service/base.rb +4 -89
  13. data/lib/ogc/web_feature_service/get_capabilities.rb +2 -0
  14. data/lib/ogc/web_feature_service/get_feature.rb +3 -0
  15. data/lib/ogc/web_processing_service.rb +16 -0
  16. data/lib/ogc/web_processing_service/base.rb +9 -0
  17. data/lib/ogc/web_processing_service/execute.rb +16 -0
  18. data/test/ogc/abstract_base_test.rb +137 -0
  19. data/test/ogc/{clean_xml_test.rb → core_ext/string_test.rb} +1 -2
  20. data/test/ogc/{exceptions → errors}/exception_report_test.rb +3 -5
  21. data/test/ogc/{exceptions/ogc_exception_test.rb → errors/ogc_error_test.rb} +3 -3
  22. data/test/ogc/errors/request_error_test.rb +11 -0
  23. data/test/ogc/{exceptions/request_failed_exception_test.rb → errors/service_error_test.rb} +5 -5
  24. data/test/ogc/errors_test.rb +9 -0
  25. data/test/ogc/web_feature_service/base_test.rb +3 -136
  26. data/test/ogc/web_feature_service/get_capabilities_test.rb +1 -3
  27. data/test/ogc/web_feature_service/get_feature_test.rb +1 -3
  28. data/test/ogc/web_processing_service/base_test.rb +12 -0
  29. data/test/ogc/web_processing_service/execute_test.rb +36 -0
  30. data/test/test_helper.rb +0 -2
  31. data/test/xml/wps/execute_response.xml +35 -0
  32. metadata +22 -15
  33. data/lib/ogc/clean_xml.rb +0 -13
  34. data/lib/ogc/exceptions.rb +0 -8
  35. data/lib/ogc/exceptions/ogc_exception.rb +0 -5
  36. data/lib/ogc/exceptions/request_error_exception.rb +0 -7
  37. data/lib/ogc/query.rb +0 -11
  38. data/test/ogc/exceptions/request_error_exception_test.rb +0 -11
  39. data/test/ogc/exceptions_test.rb +0 -9
  40. data/test/ogc/query_test.rb +0 -21
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fe92f7d04b411d1f43de0809e658f3468fefaf2a
4
- data.tar.gz: 50540d467838d5bf50fd87a71591356b63df1139
3
+ metadata.gz: 8f7d9616808aaf51444ddebc1e4c74708406ad59
4
+ data.tar.gz: ab9d14e38cc52bd883037b0d1c58261aa44ccf13
5
5
  SHA512:
6
- metadata.gz: 287ba94ff194c88ec9393801f1ab8f7e5999178ae5c66a378d75c5934e385c08e3b636ed36fb356546b1a3e41baef349ea92ce0d44e6a01be916e05ad36b94cf
7
- data.tar.gz: 735cdfa8c041d5e94cab69aef738cf63432da395992a1f48c7d65a395952f7d39736458263e0f5594b196fdd87cc9a086f1b6ca8a6ed94ef29b45bfdcb32ec62
6
+ metadata.gz: 4d7c8c41ea813e3800008bdc2f9d4714c754d11793b16abed18a3960d7c1ce18812733187b7d1f45672228b6669d2a17350ee687a01d32cbbe10a3a6d2484fbb
7
+ data.tar.gz: eafd33772ebafa0658d1d2efe0a3d42ff17c47f0657ddde86981feac530c30a9b1187462a0c8d300f89ad6c12d516c86116b3e0767cf3fec9f9693d0459a09a9
data/lib/ogc.rb CHANGED
@@ -1,9 +1,7 @@
1
1
  module Ogc; end
2
2
 
3
- # Refinements:
4
- require 'ogc/clean_xml'
5
- require 'ogc/query'
6
-
7
- require 'ogc/exceptions'
3
+ require 'ogc/core_ext'
4
+ require 'ogc/errors'
8
5
  require 'ogc/version'
9
6
  require 'ogc/web_feature_service'
7
+ require 'ogc/web_processing_service'
@@ -0,0 +1,94 @@
1
+ require 'ogc/errors'
2
+
3
+ require 'active_support/core_ext/class/attribute'
4
+ require 'active_support/core_ext/hash/keys'
5
+ require 'active_support/core_ext/object/blank'
6
+ require 'active_support/core_ext/object/to_query'
7
+ require 'active_support/core_ext/string/inflections'
8
+ require 'nokogiri'
9
+
10
+ module Ogc
11
+ class AbstractBase
12
+ include Errors
13
+
14
+ attr_reader :params, :response, :url
15
+
16
+ class_attribute :default_params
17
+
18
+ class << self
19
+ def request_name
20
+ @request_name ||= to_s.demodulize
21
+ end
22
+ end
23
+
24
+ def initialize(url, params = nil)
25
+ @url = url
26
+ @params = params.is_a?(Hash) ? params.stringify_keys : {}
27
+ @params.merge!(default_params) if default_params.is_a?(Hash)
28
+ end
29
+
30
+ def get(extra_params, &block)
31
+ params = extra_params ? extra_params.merge(@params) : @params
32
+ fetch(:get, params, &block)
33
+ end
34
+
35
+ def post(body, &block)
36
+ fetch(:post, body.respond_to?(:to_xml) ? body.to_xml : body, &block)
37
+ end
38
+
39
+ def http
40
+ @http ||= Net::HTTP.new(uri.host, uri.port)
41
+ end
42
+
43
+ private
44
+
45
+ def fetch(type, content, &block)
46
+ request = request(type, content)
47
+ block.call(request) if block
48
+ handle_response(request)
49
+ end
50
+
51
+ def handle_response(request)
52
+ case (response = http.request(request))
53
+ when Net::HTTPSuccess
54
+ @response = Nokogiri::XML(response.body.clean_xml!).tap do |xml|
55
+ # rubocop:disable Style/RaiseArgs
56
+ raise ExceptionReport.new(xml) if ExceptionReport.exception?(xml)
57
+ # rubocop:enable Style/RaiseArgs
58
+ end
59
+ else
60
+ # rubocop:disable Style/RaiseArgs
61
+ raise ServiceError.new(response)
62
+ # rubocop:enable Style/RaiseArgs
63
+ end
64
+ rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError,
65
+ Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError,
66
+ Net::ProtocolError
67
+ raise RequestError
68
+ end
69
+
70
+ def request(type, content)
71
+ case type
72
+ when :get then Net::HTTP::Get.new(uri_with_params(content))
73
+ when :post
74
+ Net::HTTP::Post.new(uri_without_params).tap do |req|
75
+ req.body = content
76
+ end
77
+ end
78
+ end
79
+
80
+ def uri_with_params(extra_params)
81
+ return uri_without_params if extra_params.blank?
82
+
83
+ uri_without_params.dup.tap do |uri|
84
+ www_form = Hash[URI.decode_www_form(uri.query.to_s)]
85
+ uri.query = www_form.merge!(extra_params).to_query
86
+ end
87
+ end
88
+
89
+ def uri_without_params
90
+ @uri ||= URI(@url)
91
+ end
92
+ alias_method :uri, :uri_without_params
93
+ end
94
+ end
@@ -0,0 +1 @@
1
+ require 'ogc/core_ext/string'
@@ -0,0 +1,9 @@
1
+ require 'active_support/core_ext/string/filters'
2
+
3
+ class String
4
+ def clean_xml!
5
+ self.gsub!(/>\n+ *\t*</, '><')
6
+ self.squish!
7
+ self
8
+ end
9
+ end
data/lib/ogc/errors.rb ADDED
@@ -0,0 +1,8 @@
1
+ module Ogc
2
+ module Errors; end
3
+ end
4
+
5
+ require 'ogc/errors/exception_report'
6
+ require 'ogc/errors/ogc_error'
7
+ require 'ogc/errors/request_error'
8
+ require 'ogc/errors/service_error'
@@ -1,8 +1,8 @@
1
- require 'ogc/exceptions/ogc_exception'
1
+ require 'ogc/errors/ogc_error'
2
2
 
3
3
  module Ogc
4
- module Exceptions
5
- class ExceptionReport < OgcException
4
+ module Errors
5
+ class ExceptionReport < OgcError
6
6
  ROOTS = %w( ServiceExceptionReport ExceptionReport ).freeze
7
7
 
8
8
  attr_reader :report
@@ -0,0 +1,5 @@
1
+ module Ogc
2
+ module Errors
3
+ class OgcError < StandardError; end
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ require 'ogc/errors/ogc_error'
2
+
3
+ module Ogc
4
+ module Errors
5
+ class RequestError < OgcError; end
6
+ end
7
+ end
@@ -1,6 +1,8 @@
1
+ require 'ogc/errors/ogc_error'
2
+
1
3
  module Ogc
2
- module Exceptions
3
- class RequestFailedException < OgcException
4
+ module Errors
5
+ class ServiceError < OgcError
4
6
  attr_reader :code
5
7
 
6
8
  def initialize(http_error)
data/lib/ogc/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ogc
2
- VERSION = '0.1.1'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -1,96 +1,11 @@
1
- require 'ogc/exceptions'
1
+ require 'ogc/abstract_base'
2
2
 
3
- require 'active_support/core_ext/hash/keys'
4
- require 'active_support/core_ext/object/blank'
5
- require 'active_support/core_ext/object/to_query'
6
- require 'active_support/core_ext/string/inflections'
7
- require 'nokogiri'
3
+ require 'active_support/core_ext/module/introspection'
8
4
 
9
5
  module Ogc
10
6
  module WebFeatureService
11
- class Base
12
- include Exceptions
13
-
14
- using CleanXML
15
- using Query
16
-
17
- attr_reader :params, :response, :url
18
-
19
- DEFAULT_PARAMS = { 'service' => 'wfs' }.freeze
20
-
21
- class << self
22
- def request_name
23
- @request_name ||= to_s.demodulize
24
- end
25
- end
26
-
27
- def initialize(url, params = nil)
28
- @url = url
29
- @params = (params ? params.stringify_keys : {}).merge!(DEFAULT_PARAMS)
30
- end
31
-
32
- def get(extra_params, &block)
33
- params = extra_params ? extra_params.merge(@params) : @params
34
- fetch(:get, params, &block)
35
- end
36
-
37
- def post(body, &block)
38
- fetch(:post, body.respond_to?(:to_xml) ? body.to_xml : body, &block)
39
- end
40
-
41
- def http
42
- @http ||= Net::HTTP.new(uri.host, uri.port)
43
- end
44
-
45
- private
46
-
47
- def fetch(type, content, &block)
48
- request = request(type, content)
49
- block.call(request) if block
50
- handle_response(request)
51
- end
52
-
53
- def handle_response(request)
54
- case (response = http.request(request))
55
- when Net::HTTPSuccess
56
- @response = Nokogiri::XML(response.body.clean_xml!).tap do |xml|
57
- # rubocop:disable Style/RaiseArgs
58
- raise ExceptionReport.new(xml) if ExceptionReport.exception?(xml)
59
- # rubocop:enable Style/RaiseArgs
60
- end
61
- else
62
- # rubocop:disable Style/RaiseArgs
63
- raise RequestFailedException.new(response)
64
- # rubocop:enable Style/RaiseArgs
65
- end
66
- rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError,
67
- Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError,
68
- Net::ProtocolError
69
- raise RequestErrorException
70
- end
71
-
72
- def request(type, content)
73
- case type
74
- when :get then Net::HTTP::Get.new(uri_with_params(content))
75
- when :post
76
- Net::HTTP::Post.new(uri_without_params).tap do |req|
77
- req.body = content
78
- end
79
- end
80
- end
81
-
82
- def uri_with_params(extra_params)
83
- return uri_without_params if extra_params.blank?
84
-
85
- uri_without_params.dup.tap do |uri|
86
- uri.query = Hash.from_query(uri.query).merge!(extra_params).to_query
87
- end
88
- end
89
-
90
- def uri_without_params
91
- @uri ||= URI(@url)
92
- end
93
- alias_method :uri, :uri_without_params
7
+ class Base < AbstractBase
8
+ self.default_params = { 'service' => 'wfs' }.freeze
94
9
  end
95
10
  end
96
11
  end
@@ -1,3 +1,5 @@
1
+ require 'ogc/web_feature_service/base'
2
+
1
3
  module Ogc
2
4
  module WebFeatureService
3
5
  class GetCapabilities < Base
@@ -1,6 +1,9 @@
1
+ require 'ogc/web_feature_service/base'
2
+
1
3
  module Ogc
2
4
  module WebFeatureService
3
5
  class GetFeature < Base
6
+
4
7
  def get(type_name, extra_params = {}, &block)
5
8
  params = {
6
9
  'request' => self.class.request_name,
@@ -0,0 +1,16 @@
1
+ require 'ogc/web_processing_service/base'
2
+ require 'ogc/web_processing_service/execute'
3
+
4
+ require 'active_support/core_ext/string/inflections'
5
+
6
+ module Ogc
7
+ module WebProcessingService
8
+ SUPPORTED_METHODS = %i( execute ).freeze
9
+
10
+ class << self
11
+ def execute(*args)
12
+ Execute.new(*args)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ require 'ogc/abstract_base'
2
+
3
+ module Ogc
4
+ module WebProcessingService
5
+ class Base < AbstractBase
6
+ self.default_params = { 'service' => 'wps' }.freeze
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ require 'ogc/web_processing_service/base'
2
+
3
+ module Ogc
4
+ module WebProcessingService
5
+ class Execute < Base
6
+ def get(type_name, extra_params = {}, &block)
7
+ params = {
8
+ 'request' => self.class.request_name,
9
+ 'identifier' => type_name
10
+ }.merge!(extra_params)
11
+
12
+ super(params, &block)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,137 @@
1
+ require 'test_helper'
2
+
3
+ module Ogc
4
+ class AbstractBaseTest < TestCase
5
+ include Errors
6
+
7
+ URL = 'http://localhost/wfs'
8
+ PARAMS = { 'version' => '1.0.0', 'key' => 'ABCDE' }
9
+
10
+ # Fake exception
11
+ CalledBlockException = Class.new(StandardError)
12
+
13
+ setup do
14
+ @base = AbstractBase.new(URL, PARAMS)
15
+
16
+ # XML files
17
+ @request = read_file('wfs/get_capabilities_request')
18
+ @response = read_file('wfs/get_capabilities_response')
19
+ @exception = read_file('wfs/exception_report')
20
+
21
+ query = PARAMS.merge(request: :hello).to_query
22
+
23
+ # Get method returns xml response:
24
+ stub_request(:get, "#{URL}?#{query}").to_return(body: @response)
25
+
26
+ # Get method returns xml exception:
27
+ stub_request(:get, "#{URL}?ex=xml&#{query}")
28
+ .to_return(body: @exception)
29
+
30
+ # Get method returns Timeout exception:
31
+ stub_request(:get, "#{URL}?ex=timeout&#{query}")
32
+ .to_raise(Timeout::Error)
33
+
34
+ # Get method returns NotFound return:
35
+ stub_request(:get, "#{URL}?ex=notFound&#{query}")
36
+ .to_return(status: [404, 'Not Found'])
37
+
38
+ # Post method returns xml response:
39
+ stub_request(:post, "#{URL}").with(body: @request)
40
+ .to_return(body: @response)
41
+ end
42
+
43
+ test 'request_name class method returns the name of the class' do
44
+ assert_equal 'AbstractBase', AbstractBase.request_name
45
+ assert_same AbstractBase.request_name, AbstractBase.request_name
46
+
47
+ FakeService = Class.new(AbstractBase)
48
+ assert_equal 'FakeService', FakeService.request_name
49
+ end
50
+
51
+ test 'constructor takes an url and some params as arguments' do
52
+ assert_equal URL, @base.url
53
+ refute_same PARAMS, @base.params
54
+ assert_equal PARAMS, @base.params
55
+ end
56
+
57
+ test 'constructor stringifies the keys of params' do
58
+ base = AbstractBase.new(URL, PARAMS.symbolize_keys)
59
+ assert_equal PARAMS, base.params
60
+ end
61
+
62
+ test 'http method exposes the http object' do
63
+ assert_instance_of Net::HTTP, @base.http
64
+ end
65
+
66
+ test 'get method returns xml response' do
67
+ xml = Nokogiri::XML(@response.clean_xml!).to_xml
68
+ assert_equal xml, @base.get(request: 'hello').to_xml
69
+ end
70
+
71
+ test 'get method takes a block to overload the request' do
72
+ assert_raises CalledBlockException do
73
+ @base.get(request: 'hello') do |_|
74
+ raise CalledBlockException
75
+ end
76
+ end
77
+ end
78
+
79
+ test 'get method takes a block which exposes the request' do
80
+ @base.get(request: :hello) do |request|
81
+ assert_instance_of Net::HTTP::Get, request
82
+ end
83
+ end
84
+
85
+ test 'post method returns xml response' do
86
+ xml = Nokogiri::XML(@response.clean_xml!).to_xml
87
+ assert_equal xml, @base.post(@request).to_xml
88
+ end
89
+
90
+ test 'post method takes a block to overload the request' do
91
+ assert_raises CalledBlockException do
92
+ @base.post(@request) do |_|
93
+ raise CalledBlockException
94
+ end
95
+ end
96
+ end
97
+
98
+ test 'post method takes a block which exposes the request' do
99
+ @base.post(@request) do |request|
100
+ assert_instance_of Net::HTTP::Post, request
101
+ end
102
+ end
103
+
104
+ test 'exception is raised if WFS returns exception' do
105
+ assert_raises ExceptionReport do
106
+ @base.get(request: :hello, ex: :xml)
107
+ end
108
+ end
109
+
110
+ test 'exception is raised if Timeout is raised' do
111
+ assert_raises RequestError do
112
+ @base.get(request: :hello, ex: :timeout)
113
+ end
114
+ end
115
+
116
+ test 'exception raised has a cause' do
117
+ begin
118
+ @base.get(request: :hello, ex: :timeout)
119
+ assert false # In case where the exception is not raised.
120
+ rescue RequestError => ex
121
+ assert_instance_of Timeout::Error, ex.cause
122
+ end
123
+ end
124
+
125
+ test 'request error raises ServiceError exception' do
126
+ assert_raises ServiceError do
127
+ @base.get(request: :hello, ex: :notFound)
128
+ end
129
+ end
130
+
131
+ test 'response is cached' do
132
+ assert_nil @base.response
133
+ @base.get(request: 'hello')
134
+ refute_nil @base.response
135
+ end
136
+ end
137
+ end
@@ -2,8 +2,7 @@ require 'test_helper'
2
2
  require 'active_support/core_ext/string/strip'
3
3
 
4
4
  module Ogc
5
- class CleanXMLTest < TestCase
6
- using CleanXML
5
+ class StringTest < TestCase
7
6
 
8
7
  setup do
9
8
  @xml = <<-XML.strip_heredoc
@@ -1,10 +1,8 @@
1
1
  require 'test_helper'
2
2
 
3
3
  module Ogc
4
- module Exceptions
4
+ module Errors
5
5
  class ExceptionReportTest < TestCase
6
- using CleanXML
7
-
8
6
  setup do
9
7
  @xml_100 = read_xml('wfs/service_exception_report')
10
8
  @report_100 = ExceptionReport.new(@xml_100)
@@ -15,8 +13,8 @@ module Ogc
15
13
  @xml_fake = read_xml('wfs/fake_report')
16
14
  end
17
15
 
18
- test 'class inherits from OgcException' do
19
- assert ExceptionReport < OgcException
16
+ test 'class inherits from OgcError' do
17
+ assert ExceptionReport < OgcError
20
18
  end
21
19
 
22
20
  test 'ROOTS constant is a frozen array of string' do
@@ -1,10 +1,10 @@
1
1
  require 'test_helper'
2
2
 
3
3
  module Ogc
4
- module Exceptions
5
- class OgcExceptionTest < TestCase
4
+ module Errors
5
+ class OgcErrorTest < TestCase
6
6
  test 'class inherits from StandardError' do
7
- assert OgcException < StandardError
7
+ assert OgcError < StandardError
8
8
  end
9
9
  end
10
10
  end
@@ -0,0 +1,11 @@
1
+ require 'test_helper'
2
+
3
+ module Ogc
4
+ module Errors
5
+ class RequestErrorTest < TestCase
6
+ test 'class inherits from OgcError' do
7
+ assert RequestError < OgcError
8
+ end
9
+ end
10
+ end
11
+ end
@@ -2,20 +2,20 @@ require 'test_helper'
2
2
  require 'minitest/mock'
3
3
 
4
4
  module Ogc
5
- module Exceptions
6
- class RequestFailedExceptionTest < TestCase
5
+ module Errors
6
+ class ServiceErrorTest < TestCase
7
7
  setup do
8
8
  @mock = Minitest::Mock.new
9
9
  @mock.expect :code, 666
10
10
  @mock.expect :message, 'Hello Wolrd'
11
11
  end
12
12
 
13
- test 'class inherits from OgcException' do
14
- assert RequestFailedException < OgcException
13
+ test 'class inherits from OgcError' do
14
+ assert ServiceError < OgcError
15
15
  end
16
16
 
17
17
  test 'constructor takes a HTTP error' do
18
- ex = RequestFailedException.new(@mock)
18
+ ex = ServiceError.new(@mock)
19
19
  assert 666, ex.code
20
20
  assert 'Hello World', ex.message
21
21
  @mock.verify
@@ -0,0 +1,9 @@
1
+ require 'test_helper'
2
+
3
+ module Ogc
4
+ class ErrorsTest < TestCase
5
+ test 'Errors module is defined' do
6
+ refute_nil Errors
7
+ end
8
+ end
9
+ end
@@ -3,142 +3,9 @@ require 'test_helper'
3
3
  module Ogc
4
4
  module WebFeatureService
5
5
  class BaseTest < TestCase
6
- include Exceptions
7
- using CleanXML
8
-
9
- URL = 'http://localhost/wfs'
10
- PARAMS = { 'version' => '1.0.0', 'key' => 'ABCDE' }
11
- FULL_PARAMS = PARAMS.merge(Base::DEFAULT_PARAMS)
12
-
13
- # Fake exception
14
- CalledBlockException = Class.new(StandardError)
15
-
16
- setup do
17
- @base = Base.new(URL, PARAMS)
18
-
19
- # XML files
20
- @request = read_file('wfs/get_capabilities_request')
21
- @response = read_file('wfs/get_capabilities_response')
22
- @exception = read_file('wfs/exception_report')
23
-
24
- query = FULL_PARAMS.merge(request: :hello).to_query
25
-
26
- # Get method returns xml response:
27
- stub_request(:get, "#{URL}?#{query}").to_return(body: @response)
28
-
29
- # Get method returns xml exception:
30
- stub_request(:get, "#{URL}?ex=xml&#{query}")
31
- .to_return(body: @exception)
32
-
33
- # Get method returns Timeout exception:
34
- stub_request(:get, "#{URL}?ex=timeout&#{query}")
35
- .to_raise(Timeout::Error)
36
-
37
- # Get method returns NotFound return:
38
- stub_request(:get, "#{URL}?ex=notFound&#{query}")
39
- .to_return(status: [404, 'Not Found'])
40
-
41
- # Post method returns xml response:
42
- stub_request(:post, "#{URL}").with(body: @request)
43
- .to_return(body: @response)
44
- end
45
-
46
- test 'DEFAULT_PARAMS constant is frozen' do
47
- assert Base::DEFAULT_PARAMS.frozen?
48
- end
49
-
50
- test 'request_name class method returns the name of the class' do
51
- assert_equal 'Base', Base.request_name
52
- assert_same Base.request_name, Base.request_name
53
-
54
- FakeService = Class.new(Base)
55
- assert_equal 'FakeService', FakeService.request_name
56
- end
57
-
58
- test 'constructor takes an url and some params as arguments' do
59
- assert_equal URL, @base.url
60
- refute_same PARAMS, @base.params
61
- assert_equal FULL_PARAMS, @base.params
62
- end
63
-
64
- test 'constructor stringifies the keys of params' do
65
- base = Base.new(URL, PARAMS.symbolize_keys)
66
- assert_equal FULL_PARAMS, base.params
67
- end
68
-
69
- test 'http method exposes the http object' do
70
- assert_instance_of Net::HTTP, @base.http
71
- end
72
-
73
- test 'get method returns xml response' do
74
- xml = Nokogiri::XML(@response.clean_xml!).to_xml
75
- assert_equal xml, @base.get(request: 'hello').to_xml
76
- end
77
-
78
- test 'get method takes a block to overload the request' do
79
- assert_raises CalledBlockException do
80
- @base.get(request: 'hello') do |_|
81
- raise CalledBlockException
82
- end
83
- end
84
- end
85
-
86
- test 'get method takes a block which exposes the request' do
87
- @base.get(request: :hello) do |request|
88
- assert_instance_of Net::HTTP::Get, request
89
- end
90
- end
91
-
92
- test 'post method returns xml response' do
93
- xml = Nokogiri::XML(@response.clean_xml!).to_xml
94
- assert_equal xml, @base.post(@request).to_xml
95
- end
96
-
97
- test 'post method takes a block to overload the request' do
98
- assert_raises CalledBlockException do
99
- @base.post(@request) do |_|
100
- raise CalledBlockException
101
- end
102
- end
103
- end
104
-
105
- test 'post method takes a block which exposes the request' do
106
- @base.post(@request) do |request|
107
- assert_instance_of Net::HTTP::Post, request
108
- end
109
- end
110
-
111
- test 'exception is raised if WFS returns exception' do
112
- assert_raises ExceptionReport do
113
- @base.get(request: :hello, ex: :xml)
114
- end
115
- end
116
-
117
- test 'exception is raised if Timeout is raised' do
118
- assert_raises RequestErrorException do
119
- @base.get(request: :hello, ex: :timeout)
120
- end
121
- end
122
-
123
- test 'exception raised has a cause' do
124
- begin
125
- @base.get(request: :hello, ex: :timeout)
126
- assert false # In case where the exception is not raised.
127
- rescue RequestErrorException => ex
128
- assert_instance_of Timeout::Error, ex.cause
129
- end
130
- end
131
-
132
- test 'request error raises RequestFailedException exception' do
133
- assert_raises RequestFailedException do
134
- @base.get(request: :hello, ex: :notFound)
135
- end
136
- end
137
-
138
- test 'response is cached' do
139
- assert_nil @base.response
140
- @base.get(request: 'hello')
141
- refute_nil @base.response
6
+ test 'default_params class attribute is frozen' do
7
+ assert_instance_of Hash, Base.default_params
8
+ assert Base.default_params.frozen?
142
9
  end
143
10
  end
144
11
  end
@@ -3,11 +3,9 @@ require 'test_helper'
3
3
  module Ogc
4
4
  module WebFeatureService
5
5
  class GetCapabilitiesTest < TestCase
6
- using CleanXML
7
-
8
6
  URL = 'http://localhost/wfs'
9
7
  PARAMS = { 'version' => '1.0.0', 'key' => 'ABCDE' }
10
- FULL_PARAMS = PARAMS.merge(Base::DEFAULT_PARAMS)
8
+ FULL_PARAMS = PARAMS.merge(Base.default_params)
11
9
 
12
10
  setup do
13
11
  @base = GetCapabilities.new(URL, PARAMS)
@@ -3,15 +3,13 @@ require 'test_helper'
3
3
  module Ogc
4
4
  module WebFeatureService
5
5
  class GetFeatureTest < TestCase
6
- using CleanXML
7
-
8
6
  URL = 'http://localhost/wfs'
9
7
  PARAMS = {
10
8
  'version' => '1.0.0',
11
9
  'key' => 'ABCDE',
12
10
  'typeName' => 'HYDROGRAPHY'
13
11
  }
14
- FULL_PARAMS = PARAMS.merge(Base::DEFAULT_PARAMS)
12
+ FULL_PARAMS = PARAMS.merge(Base.default_params)
15
13
 
16
14
  setup do
17
15
  @base = GetFeature.new(URL, PARAMS)
@@ -0,0 +1,12 @@
1
+ require 'test_helper'
2
+
3
+ module Ogc
4
+ module WebProcessingService
5
+ class BaseTest < TestCase
6
+ test 'default_params class attribute is frozen' do
7
+ assert_instance_of Hash, Base.default_params
8
+ assert Base.default_params.frozen?
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,36 @@
1
+ require 'test_helper'
2
+
3
+ module Ogc
4
+ module WebProcessingService
5
+ class ExecuteTest < TestCase
6
+ URL = 'http://localhost/wfs'
7
+ PARAMS = {
8
+ 'version' => '1.0.0',
9
+ 'key' => 'ABCDE',
10
+ 'identifier' => 'HYDROGRAPHY'
11
+ }
12
+ FULL_PARAMS = PARAMS.merge(Base.default_params)
13
+
14
+ setup do
15
+ @base = Execute.new(URL, PARAMS)
16
+
17
+ # XML files
18
+ @response = read_file('wps/execute_response')
19
+
20
+ query = FULL_PARAMS.merge(request: Execute.request_name).to_query
21
+
22
+ # Get method returns xml response:
23
+ stub_request(:get, "#{URL}?#{query}").to_return(body: @response)
24
+ end
25
+
26
+ test 'class inherits from Base' do
27
+ assert Execute < Base
28
+ end
29
+
30
+ test 'get method returns xml response' do
31
+ xml = Nokogiri::XML(@response.clean_xml!).to_xml
32
+ assert_equal xml, @base.get(:HYDROGRAPHY).to_xml
33
+ end
34
+ end
35
+ end
36
+ end
data/test/test_helper.rb CHANGED
@@ -10,8 +10,6 @@ require 'minitest/autorun'
10
10
 
11
11
  module Ogc
12
12
  class TestCase < Minitest::Test
13
- using CleanXML
14
-
15
13
  class << self
16
14
  def setup(&block)
17
15
  define_method(:setup, &block)
@@ -0,0 +1,35 @@
1
+ <wps:ExecuteResponse xmlns:wps="http://www.opengis.net/wps/1.0.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:cub="http://data.bordeaux-metropole.fr" service="WPS" version="1.0.0" xml:lang="fr" xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsExecuteResponse_response.xsd" serviceInstance="http://data.bordeaux-metropole.fr/wps?key=27Y2TBGE91&amp;service=WPS&amp;version=1.0.0&amp;request=getcapabilities">
2
+ <wps:Process wps:processVersion="1.0.0">
3
+ <ows:Identifier>SV_HORAI_A</ows:Identifier>
4
+ <ows:Title>Horaire de bus</ows:Title>
5
+ <ows:Abstract>Retourne les horaires sur SAEIV Bus - Tram</ows:Abstract>
6
+ </wps:Process>
7
+ <wps:Status creationTime="2015-12-01T14:26:26+01:00">
8
+ <wps:ProcessSucceeded>Traitement terminé</wps:ProcessSucceeded>
9
+ </wps:Status>
10
+ <wps:ProcessOutputs>
11
+ <wps:Output>
12
+ <ows:Identifier>result</ows:Identifier>
13
+ <ows:Title>Tous les objets de la couche</ows:Title>
14
+ <ows:Abstract>Tous les objets de la couche</ows:Abstract>
15
+ <wps:Data>
16
+ <wps:ComplexData mimeType="text/xml">
17
+ <gml:featureMember>
18
+ <cub:SV_HORAI_A>
19
+ <cub:GID>267436295</cub:GID>
20
+ <cub:HOR_THEO>2015-12-01T08:18:57</cub:HOR_THEO>
21
+ <cub:HOR_APP>2015-12-01T08:18:57</cub:HOR_APP>
22
+ <cub:HOR_REAL/>
23
+ <cub:ETAT>REALISE</cub:ETAT>
24
+ <cub:TYPE>REGULIER</cub:TYPE>
25
+ <cub:CDATE>2015-12-01T08:40:09</cub:CDATE>
26
+ <cub:MDATE>2015-12-01T08:40:09</cub:MDATE>
27
+ <cub:RS_SV_ARRET_P>592</cub:RS_SV_ARRET_P>
28
+ <cub:RS_SV_COURS_A>258470616</cub:RS_SV_COURS_A>
29
+ </cub:SV_HORAI_A>
30
+ </gml:featureMember>
31
+ </wps:ComplexData>
32
+ </wps:Data>
33
+ </wps:Output>
34
+ </wps:ProcessOutputs>
35
+ </wps:ExecuteResponse>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ogc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Geoffrey Roguelon
@@ -170,31 +170,37 @@ files:
170
170
  - bin/guard
171
171
  - bin/setup
172
172
  - lib/ogc.rb
173
- - lib/ogc/clean_xml.rb
174
- - lib/ogc/exceptions.rb
175
- - lib/ogc/exceptions/exception_report.rb
176
- - lib/ogc/exceptions/ogc_exception.rb
177
- - lib/ogc/exceptions/request_error_exception.rb
178
- - lib/ogc/exceptions/request_failed_exception.rb
179
- - lib/ogc/query.rb
173
+ - lib/ogc/abstract_base.rb
174
+ - lib/ogc/core_ext.rb
175
+ - lib/ogc/core_ext/string.rb
176
+ - lib/ogc/errors.rb
177
+ - lib/ogc/errors/exception_report.rb
178
+ - lib/ogc/errors/ogc_error.rb
179
+ - lib/ogc/errors/request_error.rb
180
+ - lib/ogc/errors/service_error.rb
180
181
  - lib/ogc/version.rb
181
182
  - lib/ogc/web_feature_service.rb
182
183
  - lib/ogc/web_feature_service/base.rb
183
184
  - lib/ogc/web_feature_service/get_capabilities.rb
184
185
  - lib/ogc/web_feature_service/get_feature.rb
186
+ - lib/ogc/web_processing_service.rb
187
+ - lib/ogc/web_processing_service/base.rb
188
+ - lib/ogc/web_processing_service/execute.rb
185
189
  - ogc.gemspec
186
- - test/ogc/clean_xml_test.rb
187
- - test/ogc/exceptions/exception_report_test.rb
188
- - test/ogc/exceptions/ogc_exception_test.rb
189
- - test/ogc/exceptions/request_error_exception_test.rb
190
- - test/ogc/exceptions/request_failed_exception_test.rb
191
- - test/ogc/exceptions_test.rb
192
- - test/ogc/query_test.rb
190
+ - test/ogc/abstract_base_test.rb
191
+ - test/ogc/core_ext/string_test.rb
192
+ - test/ogc/errors/exception_report_test.rb
193
+ - test/ogc/errors/ogc_error_test.rb
194
+ - test/ogc/errors/request_error_test.rb
195
+ - test/ogc/errors/service_error_test.rb
196
+ - test/ogc/errors_test.rb
193
197
  - test/ogc/version_test.rb
194
198
  - test/ogc/web_feature_service/base_test.rb
195
199
  - test/ogc/web_feature_service/get_capabilities_test.rb
196
200
  - test/ogc/web_feature_service/get_feature_test.rb
197
201
  - test/ogc/web_feature_service_test.rb
202
+ - test/ogc/web_processing_service/base_test.rb
203
+ - test/ogc/web_processing_service/execute_test.rb
198
204
  - test/ogc_test.rb
199
205
  - test/test_helper.rb
200
206
  - test/xml/wfs/exception_report.xml
@@ -203,6 +209,7 @@ files:
203
209
  - test/xml/wfs/get_capabilities_response.xml
204
210
  - test/xml/wfs/get_feature_response.xml
205
211
  - test/xml/wfs/service_exception_report.xml
212
+ - test/xml/wps/execute_response.xml
206
213
  homepage: https://github.com/GRoguelon/ogc
207
214
  licenses:
208
215
  - MIT
data/lib/ogc/clean_xml.rb DELETED
@@ -1,13 +0,0 @@
1
- require 'active_support/core_ext/string/filters'
2
-
3
- module Ogc
4
- module CleanXML
5
- refine String do
6
- def clean_xml!
7
- self.gsub!(/>\n+ *\t*</, '><')
8
- self.squish!
9
- self
10
- end
11
- end
12
- end
13
- end
@@ -1,8 +0,0 @@
1
- module Ogc
2
- module Exceptions; end
3
- end
4
-
5
- require 'ogc/exceptions/ogc_exception'
6
- require 'ogc/exceptions/exception_report'
7
- require 'ogc/exceptions/request_error_exception'
8
- require 'ogc/exceptions/request_failed_exception'
@@ -1,5 +0,0 @@
1
- module Ogc
2
- module Exceptions
3
- class OgcException < StandardError; end
4
- end
5
- end
@@ -1,7 +0,0 @@
1
- require 'ogc/exceptions/ogc_exception'
2
-
3
- module Ogc
4
- module Exceptions
5
- class RequestErrorException < OgcException; end
6
- end
7
- end
data/lib/ogc/query.rb DELETED
@@ -1,11 +0,0 @@
1
- require 'uri'
2
-
3
- module Ogc
4
- module Query
5
- refine Hash.singleton_class do
6
- def from_query(query)
7
- Hash[URI.decode_www_form(query.to_s)]
8
- end
9
- end
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- require 'test_helper'
2
-
3
- module Ogc
4
- module Exceptions
5
- class RequestErrorExceptionTest < TestCase
6
- test 'class inherits from OgcException' do
7
- assert RequestErrorException < OgcException
8
- end
9
- end
10
- end
11
- end
@@ -1,9 +0,0 @@
1
- require 'test_helper'
2
-
3
- module Ogc
4
- class ExceptionsTest < TestCase
5
- test 'Exceptions module is defined' do
6
- refute_nil Exceptions
7
- end
8
- end
9
- end
@@ -1,21 +0,0 @@
1
- require 'test_helper'
2
- require 'active_support/core_ext/object/to_query'
3
-
4
- module Ogc
5
- class QueryTest < TestCase
6
- using Query
7
-
8
- setup do
9
- @hash = {
10
- 'service' => 'wfs',
11
- 'srsname' => 'epsg:4326',
12
- 'version' => '1.0.0'
13
- }
14
- @query = @hash.to_query
15
- end
16
-
17
- test 'query method converts a query to hash' do
18
- assert_equal @hash, Hash.from_query(@query)
19
- end
20
- end
21
- end