open311 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,4 +1,5 @@
1
1
  *.gem
2
+ *.rbc
2
3
  .DS_Store
3
4
  .bundle
4
5
  .yardoc
data/Gemfile.lock CHANGED
@@ -1,9 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- open311 (0.0.1)
5
- faraday (~> 0.5.2)
6
- faraday_middleware (~> 0.2.3)
4
+ open311 (0.1.0)
5
+ faraday (~> 0.5.3)
6
+ faraday_middleware (~> 0.3.0)
7
7
  hashie (~> 0.4.0)
8
8
  multi_json (~> 0.0.5)
9
9
  multi_xml (~> 0.2.0)
@@ -15,52 +15,61 @@ GEM
15
15
  addressable (2.2.2)
16
16
  crack (0.1.8)
17
17
  diff-lcs (1.1.2)
18
- faraday (0.5.2)
18
+ faraday (0.5.3)
19
19
  addressable (~> 2.2.2)
20
20
  multipart-post (~> 1.0.1)
21
21
  rack (>= 1.1.0, < 2)
22
- faraday_middleware (0.2.3)
23
- faraday (~> 0.5.2)
22
+ faraday_middleware (0.3.0)
23
+ faraday (~> 0.5.3)
24
24
  hashie (0.4.0)
25
- libxml-ruby (1.1.4)
25
+ json (1.4.6)
26
+ json (1.4.6-java)
27
+ maruku (0.6.0)
28
+ syntax (>= 1.0.0)
26
29
  multi_json (0.0.5)
27
30
  multi_xml (0.2.0)
28
31
  multipart-post (1.0.1)
32
+ nokogiri (1.4.4)
33
+ nokogiri (1.4.4-java)
34
+ weakling (>= 0.0.3)
29
35
  rack (1.2.1)
30
36
  rake (0.8.7)
31
- rcov (0.9.9)
32
- rspec (2.0.1)
33
- rspec-core (~> 2.0.1)
34
- rspec-expectations (~> 2.0.1)
35
- rspec-mocks (~> 2.0.1)
36
- rspec-core (2.0.1)
37
- rspec-expectations (2.0.1)
38
- diff-lcs (>= 1.1.2)
39
- rspec-mocks (2.0.1)
40
- rspec-core (~> 2.0.1)
41
- rspec-expectations (~> 2.0.1)
42
- webmock (1.5.0)
37
+ rspec (2.1.0)
38
+ rspec-core (~> 2.1.0)
39
+ rspec-expectations (~> 2.1.0)
40
+ rspec-mocks (~> 2.1.0)
41
+ rspec-core (2.1.0)
42
+ rspec-expectations (2.1.0)
43
+ diff-lcs (~> 1.1.2)
44
+ rspec-mocks (2.1.0)
45
+ simplecov (0.3.7)
46
+ simplecov-html (>= 0.3.7)
47
+ simplecov-html (0.3.9)
48
+ syntax (1.0.0)
49
+ weakling (0.0.4-java)
50
+ webmock (1.6.1)
43
51
  addressable (>= 2.2.2)
44
52
  crack (>= 0.1.7)
45
- yajl-ruby (0.7.8)
46
- yard (0.6.1)
53
+ yard (0.6.2)
47
54
 
48
55
  PLATFORMS
56
+ java
49
57
  ruby
50
58
 
51
59
  DEPENDENCIES
52
60
  ZenTest (~> 4.4)
53
61
  bundler (~> 1.0)
54
- faraday (~> 0.5.2)
55
- faraday_middleware (~> 0.2.3)
62
+ faraday (~> 0.5.3)
63
+ faraday_middleware (~> 0.3.0)
56
64
  hashie (~> 0.4.0)
57
- libxml-ruby (~> 1.1)
65
+ json (~> 1.4)
66
+ maruku (~> 0.6)
58
67
  multi_json (~> 0.0.5)
59
68
  multi_xml (~> 0.2.0)
69
+ nokogiri (~> 1.4)
60
70
  open311!
61
71
  rake (~> 0.8)
62
- rcov (~> 0.9)
63
- rspec (~> 2.0.1)
72
+ rspec (~> 2.1)
73
+ simplecov (~> 0.3)
64
74
  webmock (~> 1.5)
65
- yajl-ruby (~> 0.7)
66
75
  yard (~> 0.6)
data/README.mkd CHANGED
@@ -12,7 +12,7 @@ Installation
12
12
 
13
13
  Documentation
14
14
  -------------
15
- <http://rdoc.info/gems/open311>
15
+ <http://rdoc.info/github/cfalabs/open311/master/frames>
16
16
 
17
17
  Usage Examples
18
18
  --------------
@@ -20,13 +20,28 @@ Usage Examples
20
20
 
21
21
  # Certain methods require an API key
22
22
  Open311.configure do |config|
23
- config.endpoint = 'https://open311.sfgov.org/'
24
- config.format = 'xml'
23
+ config.endpoint = 'https://open311.sfgov.org/dev/v2/'
24
+ config.api_key = 'yourkeyforpostrequests'
25
25
  config.jurisdiction = 'sfgov.org'
26
26
  end
27
27
 
28
28
  # Provide a list of acceptable 311 service request types and their associated service codes
29
29
  Open311.service_list
30
+
31
+ # If meta data is available, provide attributes and definition for the service code
32
+ Open311.service_definition('033')
33
+
34
+ # Grab service requests, limited to 90 days or 1000 entries
35
+ Open311.service_requests
36
+
37
+ # Grab a service request, requires ID
38
+ Open311.get_service_request('12345')
39
+
40
+ # Post a service request, requires an api key
41
+ Open311.post_service_request
42
+
43
+ # Get a service_request_id using a token after a post_service_request
44
+ Open311.request_id('12345')
30
45
 
31
46
  Contributing
32
47
  ------------
@@ -61,7 +76,7 @@ Submitting a Pull Request
61
76
  4. Add documentation for your feature or bug fix.
62
77
  5. Run <tt>bundle exec rake doc:yard</tt>. If your changes are not 100% documented, go back to step 4.
63
78
  6. Add specs for your feature or bug fix.
64
- 7. Run <tt>bundle exec rake spec:rcov</tt>. If your changes are not 100% covered, go back to step 6.
79
+ 7. Run <tt>bundle exec rake spec</tt>. If your changes are not 100% covered, go back to step 6.
65
80
  8. Commit and push your changes.
66
81
  9. Submit a pull request. Please do not include changes to the gemspec, version, or history file. (If you want to create your own version for some reason, please do so in a separate commit.)
67
82
 
data/Rakefile CHANGED
@@ -4,19 +4,7 @@ Bundler::GemHelper.install_tasks
4
4
  require 'rspec/core/rake_task'
5
5
  RSpec::Core::RakeTask.new(:spec)
6
6
 
7
- namespace :spec do
8
- desc "Run all examples using rcov"
9
- RSpec::Core::RakeTask.new(:rcov => :cleanup_rcov_files) do |task|
10
- task.rcov = true
11
- task.rcov_opts = %[-Ilib -Ispec --exclude "gems/*,features,specs" --text-report --sort coverage]
12
- end
13
- end
14
-
15
- task :cleanup_rcov_files do
16
- rm_rf 'coverage'
17
- end
18
-
19
- task :default => ["spec:rcov"]
7
+ task :default => :spec
20
8
 
21
9
  namespace :doc do
22
10
  require 'yard'
@@ -28,7 +28,6 @@ module Faraday
28
28
 
29
29
  def initialize(app)
30
30
  super
31
- @parser = nil
32
31
  end
33
32
 
34
33
  private
data/lib/open311.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require File.expand_path('../open311/configuration', __FILE__)
2
2
  require File.expand_path('../open311/client', __FILE__)
3
+ require File.expand_path('../open311/service_request', __FILE__)
3
4
 
4
5
  module Open311
5
6
  extend Configuration
@@ -15,12 +15,17 @@ module Open311
15
15
  :url => endpoint
16
16
  }
17
17
 
18
- Faraday::Connection.new(options) do |builder|
19
- builder.use Faraday::Request::Multipart
20
- builder.adapter(adapter)
21
- builder.use Faraday::Response::RaiseError
22
- builder.use Faraday::Response::Parse unless raw
23
- builder.use Faraday::Response::Mashify unless raw
18
+ Faraday::Connection.new(options) do |connection|
19
+ connection.use Faraday::Request::Multipart
20
+ connection.adapter(adapter)
21
+ connection.use Faraday::Response::RaiseError
22
+ unless raw
23
+ case format.to_s.downcase
24
+ when 'json' then connection.use Faraday::Response::ParseJson
25
+ when 'xml' then connection.use Faraday::Response::ParseXml
26
+ end
27
+ connection.use Faraday::Response::Mashify
28
+ end
24
29
  end
25
30
  end
26
31
  end
@@ -26,7 +26,7 @@ module Open311
26
26
  request.url(formatted_path(path), options)
27
27
  when :post, :put
28
28
  request.path = formatted_path(path)
29
- request.body = options
29
+ request.body = options unless options.empty?
30
30
  end
31
31
  end
32
32
  raw ? response : response.body
@@ -3,7 +3,6 @@ module Open311
3
3
  module Service
4
4
  # Provide a list of acceptable 311 service request types and their associated service codes
5
5
  #
6
- # @todo Overload the method to allow fetching of the authenticated user's screen name from configurati
7
6
  # @format :xml
8
7
  # @key false
9
8
  # @param options [Hash] A customizable set of options.
@@ -13,9 +12,79 @@ module Open311
13
12
  # Open311.service_list
14
13
  def service_list(options={})
15
14
  options.merge!(:jurisdiction_id => jurisdiction)
16
- response = get('dev/v2/services', options)
15
+ response = get('services', options)
17
16
  format.to_s.downcase == 'xml' ? response['services']['service'] : response
18
17
  end
18
+
19
+ # @format :xml
20
+ # @key false
21
+ # @param id String the service code
22
+ # @param options [Hash] A customizable set of options.
23
+ # @return Hash
24
+ # @see http://wiki.open311.org/GeoReport_v2#GET_Service_Definition
25
+ # @example define attributes associated with a service code, i.e. 033
26
+ # Open311.service_definition
27
+ def service_definition(id, options={})
28
+ options.merge!(:jurisdiction_id => jurisdiction)
29
+ response = get("services/#{id}", options)
30
+ format.to_s.downcase == 'xml' ? response['service_definition'] : response
31
+ end
32
+
33
+ # @format :xml
34
+ # @key false
35
+ # @param options [Hash] A customizable set of options.
36
+ # @return [Array]
37
+ # @see http://wiki.open311.org/GeoReport_v2#GET_Service_Requests
38
+ # Open311.service_requests
39
+ def service_requests(options={})
40
+ options.merge!(:jurisdiction_id => jurisdiction)
41
+ response = get("requests", options)
42
+ if format.to_s.downcase == 'xml'
43
+ response.service_requests.request.map do |request|
44
+ ServiceRequest.new(request)
45
+ end
46
+ else
47
+ response
48
+ end
49
+ end
50
+
51
+ # @format :xml
52
+ # @key true
53
+ # @param options [Hash] A customizable set of options.
54
+ # @return Hash
55
+ # @see http://wiki.open311.org/GeoReport_v2#POST_Service_Request
56
+ # Open311.post_service_request
57
+ def post_service_request(options={})
58
+ options.merge!(:jurisdiction_id => jurisdiction, :api_key => api_key)
59
+ response = post("requests", options)
60
+ format.to_s.downcase == 'xml' ? response['service_requests']['request'] : response
61
+ end
62
+
63
+ # @format :xml
64
+ # @key false
65
+ # @param id String of the service request id
66
+ # @param options [Hash] A customizable set of options.
67
+ # @return Hash
68
+ # @see http://wiki.open311.org/GeoReport_v2#GET_Service_Requests
69
+ # Open311.get_service_request
70
+ def get_service_request(id, options={})
71
+ options.merge!(:jurisdiction_id => jurisdiction)
72
+ response = get("requests/#{id}", options)
73
+ format.to_s.downcase == 'xml' ? ServiceRequest.new(response.service_requests.request.first) : response
74
+ end
75
+
76
+ # @format :xml
77
+ # @key false
78
+ # @param token_id A token included in the response to .service_response request
79
+ # @param options [Hash] A customizable set of options.
80
+ # @return Array
81
+ # @see http://wiki.open311.org/GeoReport_v2#GET_request_id_from_a_token
82
+ # Open311.request_id
83
+ def request_id(token_id, options = {})
84
+ options.merge!(:jurisdiction_id => jurisdiction)
85
+ response = get("tokens/#{token_id}", options)
86
+ format.to_s.downcase == 'xml' ? ServiceRequest.new(response.service_requests.request) : response
87
+ end
19
88
  end
20
89
  end
21
90
  end
@@ -9,7 +9,7 @@ module Open311
9
9
  DEFAULT_ADAPTER = Faraday.default_adapter.freeze
10
10
  DEFAULT_API_KEY = nil.freeze
11
11
  DEFAULT_ENDPOINT = nil.freeze
12
- DEFAULT_FORMAT = :json.freeze
12
+ DEFAULT_FORMAT = :xml.freeze
13
13
  DEFAULT_JURISDICTION = nil.freeze
14
14
  DEFAULT_PROXY = nil.freeze
15
15
  DEFAULT_USER_AGENT = "Open311 Ruby Gem #{Open311::VERSION}".freeze
@@ -0,0 +1,17 @@
1
+ module Open311
2
+ class ServiceRequest
3
+ attr_reader :token, :id
4
+
5
+ def initialize(hash)
6
+ @hash = hash
7
+ @id = hash.service_request_id.to_i
8
+ @token = hash.token.to_i
9
+ end
10
+
11
+ # Delegate to the hash
12
+ def self.method_missing(method, *args, &block)
13
+ return super unless @hash.has_key?(method)
14
+ @hash[method]
15
+ end
16
+ end
17
+ end
@@ -1,3 +1,3 @@
1
1
  module Open311
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
data/open311.gemspec CHANGED
@@ -3,17 +3,18 @@ require File.expand_path("../lib/open311/version", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.add_development_dependency("bundler", "~> 1.0")
6
- s.add_development_dependency("libxml-ruby", "~> 1.1")
6
+ s.add_development_dependency("json", "~> 1.4")
7
+ s.add_development_dependency("maruku", "~> 0.6")
8
+ s.add_development_dependency("nokogiri", "~> 1.4")
7
9
  s.add_development_dependency("rake", "~> 0.8")
8
- s.add_development_dependency("rcov", "~> 0.9")
9
- s.add_development_dependency("rspec", "~> 2.0.1")
10
+ s.add_development_dependency("rspec", "~> 2.1")
11
+ s.add_development_dependency("simplecov", "~> 0.3")
10
12
  s.add_development_dependency("webmock", "~> 1.5")
11
- s.add_development_dependency("yajl-ruby", "~> 0.7")
12
13
  s.add_development_dependency("yard", "~> 0.6")
13
14
  s.add_development_dependency("ZenTest", "~> 4.4")
14
15
  s.add_runtime_dependency("hashie", "~> 0.4.0")
15
- s.add_runtime_dependency("faraday", "~> 0.5.2")
16
- s.add_runtime_dependency("faraday_middleware", "~> 0.2.3")
16
+ s.add_runtime_dependency("faraday", "~> 0.5.3")
17
+ s.add_runtime_dependency("faraday_middleware", "~> 0.3.0")
17
18
  s.add_runtime_dependency("multi_json", "~> 0.0.5")
18
19
  s.add_runtime_dependency("multi_xml", "~> 0.2.0")
19
20
  s.authors = ["Dan Melton", "Erik Michaels-Ober"]
@@ -0,0 +1,4 @@
1
+ HTTP/1.1 403 Forbidden
2
+
3
+ <?xml version="1.0" encoding="utf-8"?>
4
+ <error>Invalid api_key received -- can't proceed with create_request.</error>
@@ -0,0 +1,23 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <service_requests>
3
+ <request>
4
+ <service_request_id>638344</service_request_id>
5
+ <status>closed</status>
6
+ <status_notes>Duplicate request.</status_notes>
7
+ <service_name>Sidewalk and Curb Issues</service_name>
8
+ <service_code>006</service_code>
9
+ <description></description>
10
+ <agency_responsible></agency_responsible>
11
+ <service_notice></service_notice>
12
+ <requested_datetime>2010-04-14T06:37:38-08:00</requested_datetime>
13
+ <updated_datetime>2010-04-14T06:37:38-08:00</updated_datetime>
14
+ <expected_datetime>2010-04-15T06:37:38-08:00</expected_datetime>
15
+ <address>8TH AVE and JUDAH ST</address>
16
+ <address_id>545483</address_id>
17
+ <zipcode>94122</zipcode>
18
+ <lat>37.762221815</lat>
19
+ <long>-122.4651145</long>
20
+ <media_url>http://open311.city.gov.s3.amazonaws.com/requests/media/638344.rss </media_url>
21
+ </request>
22
+
23
+ </service_requests>
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <service_requests>
3
+ <request>
4
+ <service_request_id>293944</service_request_id>
5
+ <service_notice>
6
+ The City will inspect and require the responsible party to correct within 24 hours and/or issue a Correction Notice or Notice of Violation of the Public Works Code
7
+ </service_notice>
8
+ <account_id/>
9
+ </request>
10
+ </service_requests>
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <service_requests>
3
+ <request>
4
+ <service_request_id>638344</service_request_id>
5
+ <token>12345</token>
6
+ </request>
7
+ </service_requests>
@@ -0,0 +1,23 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <service_definition>
3
+ <service_code>DMV66</service_code>
4
+ <attribute>
5
+ <variable>true</variable>
6
+ <code>WHISHETN</code>
7
+ <datatype>singlevaluelist</datatype>
8
+ <required>true</required>
9
+ <datatype_description></datatype_description>
10
+ <order>1</order>
11
+ <description>What is the ticket/tag/DL number?</description>
12
+ <values>
13
+ <value>
14
+ <key>123</key>
15
+ <name>Ford</name>
16
+ </value>
17
+ <value>
18
+ <key>124</key>
19
+ <name>Chrysler</name>
20
+ </value>
21
+ </values>
22
+ </attribute>
23
+ </service_definition>
@@ -0,0 +1,41 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <service_requests>
3
+ <request>
4
+ <service_request_id>638344</service_request_id>
5
+ <status>closed</status>
6
+ <status_notes>Duplicate request.</status_notes>
7
+ <service_name>Sidewalk and Curb Issues</service_name>
8
+ <service_code>006</service_code>
9
+ <description></description>
10
+ <agency_responsible></agency_responsible>
11
+ <service_notice></service_notice>
12
+ <requested_datetime>2010-04-14T06:37:38-08:00</requested_datetime>
13
+ <updated_datetime>2010-04-14T06:37:38-08:00</updated_datetime>
14
+ <expected_datetime>2010-04-15T06:37:38-08:00</expected_datetime>
15
+ <address>8TH AVE and JUDAH ST</address>
16
+ <address_id>545483</address_id>
17
+ <zipcode>94122</zipcode>
18
+ <lat>37.762221815</lat>
19
+ <long>-122.4651145</long>
20
+ <media_url>http://open311.city.gov.s3.amazonaws.com/requests/media/638344.rss </media_url>
21
+ </request>
22
+ <request>
23
+ <service_request_id>638349</service_request_id>
24
+ <status>open</status>
25
+ <status_notes></status_notes>
26
+ <service_name>Sidewalk and Curb Issues</service_name>
27
+ <service_code>006</service_code>
28
+ <description></description>
29
+ <agency_responsible></agency_responsible>
30
+ <service_notice></service_notice>
31
+ <requested_datetime>2010-04-19T06:37:38-08:00</requested_datetime>
32
+ <updated_datetime>2010-04-19T06:37:38-08:00</updated_datetime>
33
+ <expected_datetime>2010-04-19T06:37:38-08:00</expected_datetime>
34
+ <address>8TH AVE and JUDAH ST</address>
35
+ <address_id>545483</address_id>
36
+ <zipcode>94122</zipcode>
37
+ <lat>37.762221815</lat>
38
+ <long>-122.4651145</long>
39
+ <media_url>http://open311.city.gov.s3.amazonaws.com/requests/media/638349.rss </media_url>
40
+ </request>
41
+ </service_requests>
data/spec/open311_spec.rb CHANGED
@@ -1,27 +1,163 @@
1
+ require 'rubygems'
2
+ require 'json'
1
3
  require File.expand_path('../spec_helper', __FILE__)
2
4
 
3
5
  describe Open311, ".service_list" do
4
6
  before do
5
7
  Open311.configure do |config|
6
- config.endpoint = 'https://open311.sfgov.org/'
7
- config.format = 'xml'
8
- config.jurisdiction = 'sfgov.org'
8
+ config.endpoint = 'http://api.dc.org/open311/v2_dev/'
9
+ config.jurisdiction = 'dc.gov'
9
10
  end
10
- stub_request(:get, 'https://open311.sfgov.org/dev/v2/services.xml').
11
- with(:query => {:jurisdiction_id => 'sfgov.org'}).
11
+ stub_request(:get, 'http://api.dc.org/open311/v2_dev/services.xml').
12
+ with(:query => {:jurisdiction_id => 'dc.gov', :lat => '38.888486', :long => '-77.020179'}).
12
13
  to_return(:body => fixture('services.xml'), :headers => {'Content-Type' => 'text/xml; charset=utf-8'})
13
14
  end
14
15
 
15
16
  it "should request the correct resource" do
16
- Open311.service_list
17
- a_request(:get, 'https://open311.sfgov.org/dev/v2/services.xml').
18
- with(:query => {:jurisdiction_id => 'sfgov.org'}).
17
+ Open311.service_list(:lat => '38.888486', :long => '-77.020179')
18
+ a_request(:get, 'http://api.dc.org/open311/v2_dev/services.xml').
19
+ with(:query => {:jurisdiction_id => 'dc.gov', :lat => '38.888486', :long => '-77.020179'}).
19
20
  should have_been_made
20
21
  end
21
22
 
22
23
  it "should return the correct results" do
23
- services = Open311.service_list
24
+ services = Open311.service_list(:lat => '38.888486', :long => '-77.020179')
24
25
  services.should be_an Array
25
26
  services.first.service_code.should == '001'
26
27
  end
27
28
  end
29
+
30
+ describe Open311, ".service_definition" do
31
+ before do
32
+ Open311.configure do |config|
33
+ config.endpoint = 'http://blasius.ws:3003/open311/'
34
+ config.jurisdiction = 'dc.gov'
35
+ end
36
+ stub_request(:get, 'http://blasius.ws:3003/open311/services/033.xml').
37
+ with(:query => {:jurisdiction_id => 'dc.gov', :lat => '38.888486', :long => '-77.020179'}).
38
+ to_return(:body => fixture('service_definition.xml'), :headers => {'Content-Type' => 'text/xml; charset=utf-8'})
39
+ end
40
+
41
+ it "should request the correct resource" do
42
+ Open311.service_definition('033', :lat => '38.888486', :long => '-77.020179')
43
+ a_request(:get, 'http://blasius.ws:3003/open311/services/033.xml').
44
+ with(:query => {:jurisdiction_id => 'dc.gov', :lat => '38.888486', :long => '-77.020179'}).
45
+ should have_been_made
46
+ end
47
+
48
+ it "should return the correct results" do
49
+ service_def = Open311.service_definition('033', :lat => '38.888486', :long => '-77.020179')
50
+ service_def.should be_an Hash
51
+ service_def.service_code.should == "DMV66"
52
+ end
53
+ end
54
+
55
+ describe Open311, ".service_requests" do
56
+ before do
57
+ Open311.configure do |config|
58
+ config.endpoint = 'http://blasius.ws:3003/open311/'
59
+ config.jurisdiction = 'dc.gov'
60
+ end
61
+ stub_request(:get, 'http://blasius.ws:3003/open311/requests.xml').
62
+ with(:query => {:jurisdiction_id => 'dc.gov', :lat => '38.888486', :long => '-77.020179'}).
63
+ to_return(:body => fixture('service_requests.xml'), :headers => {'Content-Type' => 'text/xml; charset=utf-8'})
64
+ end
65
+
66
+ it "should request the correct resource" do
67
+ Open311.service_requests(:lat => '38.888486', :long => '-77.020179')
68
+ a_request(:get, 'http://blasius.ws:3003/open311/requests.xml').
69
+ with(:query => {:jurisdiction_id => 'dc.gov', :lat => '38.888486', :long => '-77.020179'}).
70
+ should have_been_made
71
+ end
72
+
73
+ it "should return the correct results" do
74
+ service_requests = Open311.service_requests(:lat => '38.888486', :long => '-77.020179')
75
+ service_requests.should be_an Array
76
+ service_requests.length.should == 2
77
+ service_requests.first.id.should == 638344
78
+ end
79
+ end
80
+
81
+ describe Open311, ".get_service_request" do
82
+ before do
83
+ Open311.configure do |config|
84
+ config.endpoint = 'http://blasius.ws:3003/open311/'
85
+ config.jurisdiction = 'dc.gov'
86
+ end
87
+ stub_request(:get, 'http://blasius.ws:3003/open311/requests/638344.xml').
88
+ with(:query => {:jurisdiction_id => 'dc.gov', :lat => '38.888486', :long => '-77.020179'}).
89
+ to_return(:body => fixture('service_requests.xml'), :headers => {'Content-Type' => 'text/xml; charset=utf-8'})
90
+ end
91
+
92
+ it "should request the correct resource" do
93
+ Open311.get_service_request('638344', :lat => '38.888486', :long => '-77.020179')
94
+ a_request(:get, 'http://blasius.ws:3003/open311/requests/638344.xml').
95
+ with(:query => {:jurisdiction_id => 'dc.gov', :lat => '38.888486', :long => '-77.020179'}).
96
+ should have_been_made
97
+ end
98
+
99
+ it "should return the correct results" do
100
+ service_request = Open311.get_service_request(638344, :lat => '38.888486', :long => '-77.020179')
101
+ service_request.id.should == 638344
102
+ end
103
+ end
104
+
105
+ describe Open311, ".post_service_request" do
106
+ before do
107
+ Open311.configure do |config|
108
+ config.endpoint = 'http://blasius.ws:3003/open311/'
109
+ config.jurisdiction = 'dc.gov'
110
+ config.api_key = 'xyz'
111
+ end
112
+
113
+ @service_request_params = {
114
+ :service_code => '001',
115
+ :address_string => '1234 5th street',
116
+ :email => 'smit222@sfgov.edu',
117
+ :device_id => 'tt222111',
118
+ :account_id => '123456',
119
+ :first_name => 'john',
120
+ :last_name => 'smith',
121
+ :phone => '111111111',
122
+ :description => 'A large sinkhole is destroying the street',
123
+ :media_url => 'http://farm3.static.flickr.com/2002/2212426634_5ed477a060.jpg',
124
+ :lat => '38.888486',
125
+ :long => '-77.020179',
126
+ }
127
+ stub_request(:post, 'blasius.ws:3003/open311/requests.xml').
128
+ with(:body => {:jurisdiction_id => 'dc.gov', :api_key => 'xyz'}.merge(@service_request_params)).
129
+ to_return(:body => fixture('post_service_request.xml'), :headers => {'Content-Type' => 'text/xml; charset=utf-8'})
130
+ end
131
+
132
+ it "should return the correct results" do
133
+ service_request_response = Open311.post_service_request(@service_request_params)
134
+ service_request_response.service_request_id.should == '293944'
135
+ end
136
+ end
137
+
138
+ describe Open311, ".request_id" do
139
+
140
+ before do
141
+ Open311.configure do |config|
142
+ config.endpoint = 'http://open311.sfgov.org/dev/v2/'
143
+ config.jurisdiction = 'sfgov.org'
144
+ end
145
+ stub_request(:get, 'http://open311.sfgov.org/dev/v2/tokens/12345.xml').
146
+ with(:query => {:jurisdiction_id => 'sfgov.org'}).
147
+ to_return(:body => fixture('request_id_from_token.xml'), :headers => {'Content-Type' => 'text/xml; charset=utf-8'})
148
+ end
149
+
150
+ it "should request the correct resource" do
151
+ Open311.request_id(12345)
152
+ a_request(:get, 'http://open311.sfgov.org/dev/v2/tokens/12345.xml').
153
+ with(:query => {:jurisdiction_id => 'sfgov.org'}).
154
+ should have_been_made
155
+ end
156
+
157
+ it "should return the correct result" do
158
+ service_request = Open311.request_id(12345)
159
+ service_request.id.should == 638344
160
+ service_request.token.should == 12345
161
+ end
162
+
163
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,12 @@
1
+ require 'simplecov'
2
+ SimpleCov.start do
3
+ add_group 'Open311', 'lib/open311'
4
+ add_group 'Faraday', 'lib/faraday'
5
+ end
6
+
1
7
  require File.expand_path('../../lib/open311', __FILE__)
2
8
 
9
+ require 'rspec'
3
10
  require 'webmock/rspec'
4
11
  RSpec.configure do |config|
5
12
  config.include WebMock::API
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: open311
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
5
4
  prerelease: false
6
5
  segments:
7
6
  - 0
8
- - 0
9
7
  - 1
10
- version: 0.0.1
8
+ - 0
9
+ version: 0.1.0
11
10
  platform: ruby
12
11
  authors:
13
12
  - Dan Melton
@@ -16,7 +15,7 @@ autorequire:
16
15
  bindir: bin
17
16
  cert_chain: []
18
17
 
19
- date: 2010-11-08 00:00:00 -08:00
18
+ date: 2010-11-18 00:00:00 -08:00
20
19
  default_executable:
21
20
  dependencies:
22
21
  - !ruby/object:Gem::Dependency
@@ -27,7 +26,6 @@ dependencies:
27
26
  requirements:
28
27
  - - ~>
29
28
  - !ruby/object:Gem::Version
30
- hash: 15
31
29
  segments:
32
30
  - 1
33
31
  - 0
@@ -35,206 +33,206 @@ dependencies:
35
33
  type: :development
36
34
  version_requirements: *id001
37
35
  - !ruby/object:Gem::Dependency
38
- name: libxml-ruby
36
+ name: json
39
37
  prerelease: false
40
38
  requirement: &id002 !ruby/object:Gem::Requirement
41
39
  none: false
42
40
  requirements:
43
41
  - - ~>
44
42
  - !ruby/object:Gem::Version
45
- hash: 13
46
43
  segments:
47
44
  - 1
48
- - 1
49
- version: "1.1"
45
+ - 4
46
+ version: "1.4"
50
47
  type: :development
51
48
  version_requirements: *id002
52
49
  - !ruby/object:Gem::Dependency
53
- name: rake
50
+ name: maruku
54
51
  prerelease: false
55
52
  requirement: &id003 !ruby/object:Gem::Requirement
56
53
  none: false
57
54
  requirements:
58
55
  - - ~>
59
56
  - !ruby/object:Gem::Version
60
- hash: 27
61
57
  segments:
62
58
  - 0
63
- - 8
64
- version: "0.8"
59
+ - 6
60
+ version: "0.6"
65
61
  type: :development
66
62
  version_requirements: *id003
67
63
  - !ruby/object:Gem::Dependency
68
- name: rcov
64
+ name: nokogiri
69
65
  prerelease: false
70
66
  requirement: &id004 !ruby/object:Gem::Requirement
71
67
  none: false
72
68
  requirements:
73
69
  - - ~>
74
70
  - !ruby/object:Gem::Version
75
- hash: 25
76
71
  segments:
77
- - 0
78
- - 9
79
- version: "0.9"
72
+ - 1
73
+ - 4
74
+ version: "1.4"
80
75
  type: :development
81
76
  version_requirements: *id004
82
77
  - !ruby/object:Gem::Dependency
83
- name: rspec
78
+ name: rake
84
79
  prerelease: false
85
80
  requirement: &id005 !ruby/object:Gem::Requirement
86
81
  none: false
87
82
  requirements:
88
83
  - - ~>
89
84
  - !ruby/object:Gem::Version
90
- hash: 13
91
85
  segments:
92
- - 2
93
86
  - 0
94
- - 1
95
- version: 2.0.1
87
+ - 8
88
+ version: "0.8"
96
89
  type: :development
97
90
  version_requirements: *id005
98
91
  - !ruby/object:Gem::Dependency
99
- name: webmock
92
+ name: rspec
100
93
  prerelease: false
101
94
  requirement: &id006 !ruby/object:Gem::Requirement
102
95
  none: false
103
96
  requirements:
104
97
  - - ~>
105
98
  - !ruby/object:Gem::Version
106
- hash: 5
107
99
  segments:
100
+ - 2
108
101
  - 1
109
- - 5
110
- version: "1.5"
102
+ version: "2.1"
111
103
  type: :development
112
104
  version_requirements: *id006
113
105
  - !ruby/object:Gem::Dependency
114
- name: yajl-ruby
106
+ name: simplecov
115
107
  prerelease: false
116
108
  requirement: &id007 !ruby/object:Gem::Requirement
117
109
  none: false
118
110
  requirements:
119
111
  - - ~>
120
112
  - !ruby/object:Gem::Version
121
- hash: 5
122
113
  segments:
123
114
  - 0
124
- - 7
125
- version: "0.7"
115
+ - 3
116
+ version: "0.3"
126
117
  type: :development
127
118
  version_requirements: *id007
128
119
  - !ruby/object:Gem::Dependency
129
- name: yard
120
+ name: webmock
130
121
  prerelease: false
131
122
  requirement: &id008 !ruby/object:Gem::Requirement
132
123
  none: false
133
124
  requirements:
134
125
  - - ~>
135
126
  - !ruby/object:Gem::Version
136
- hash: 7
127
+ segments:
128
+ - 1
129
+ - 5
130
+ version: "1.5"
131
+ type: :development
132
+ version_requirements: *id008
133
+ - !ruby/object:Gem::Dependency
134
+ name: yard
135
+ prerelease: false
136
+ requirement: &id009 !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
137
141
  segments:
138
142
  - 0
139
143
  - 6
140
144
  version: "0.6"
141
145
  type: :development
142
- version_requirements: *id008
146
+ version_requirements: *id009
143
147
  - !ruby/object:Gem::Dependency
144
148
  name: ZenTest
145
149
  prerelease: false
146
- requirement: &id009 !ruby/object:Gem::Requirement
150
+ requirement: &id010 !ruby/object:Gem::Requirement
147
151
  none: false
148
152
  requirements:
149
153
  - - ~>
150
154
  - !ruby/object:Gem::Version
151
- hash: 19
152
155
  segments:
153
156
  - 4
154
157
  - 4
155
158
  version: "4.4"
156
159
  type: :development
157
- version_requirements: *id009
160
+ version_requirements: *id010
158
161
  - !ruby/object:Gem::Dependency
159
162
  name: hashie
160
163
  prerelease: false
161
- requirement: &id010 !ruby/object:Gem::Requirement
164
+ requirement: &id011 !ruby/object:Gem::Requirement
162
165
  none: false
163
166
  requirements:
164
167
  - - ~>
165
168
  - !ruby/object:Gem::Version
166
- hash: 15
167
169
  segments:
168
170
  - 0
169
171
  - 4
170
172
  - 0
171
173
  version: 0.4.0
172
174
  type: :runtime
173
- version_requirements: *id010
175
+ version_requirements: *id011
174
176
  - !ruby/object:Gem::Dependency
175
177
  name: faraday
176
178
  prerelease: false
177
- requirement: &id011 !ruby/object:Gem::Requirement
179
+ requirement: &id012 !ruby/object:Gem::Requirement
178
180
  none: false
179
181
  requirements:
180
182
  - - ~>
181
183
  - !ruby/object:Gem::Version
182
- hash: 15
183
184
  segments:
184
185
  - 0
185
186
  - 5
186
- - 2
187
- version: 0.5.2
187
+ - 3
188
+ version: 0.5.3
188
189
  type: :runtime
189
- version_requirements: *id011
190
+ version_requirements: *id012
190
191
  - !ruby/object:Gem::Dependency
191
192
  name: faraday_middleware
192
193
  prerelease: false
193
- requirement: &id012 !ruby/object:Gem::Requirement
194
+ requirement: &id013 !ruby/object:Gem::Requirement
194
195
  none: false
195
196
  requirements:
196
197
  - - ~>
197
198
  - !ruby/object:Gem::Version
198
- hash: 17
199
199
  segments:
200
200
  - 0
201
- - 2
202
201
  - 3
203
- version: 0.2.3
202
+ - 0
203
+ version: 0.3.0
204
204
  type: :runtime
205
- version_requirements: *id012
205
+ version_requirements: *id013
206
206
  - !ruby/object:Gem::Dependency
207
207
  name: multi_json
208
208
  prerelease: false
209
- requirement: &id013 !ruby/object:Gem::Requirement
209
+ requirement: &id014 !ruby/object:Gem::Requirement
210
210
  none: false
211
211
  requirements:
212
212
  - - ~>
213
213
  - !ruby/object:Gem::Version
214
- hash: 21
215
214
  segments:
216
215
  - 0
217
216
  - 0
218
217
  - 5
219
218
  version: 0.0.5
220
219
  type: :runtime
221
- version_requirements: *id013
220
+ version_requirements: *id014
222
221
  - !ruby/object:Gem::Dependency
223
222
  name: multi_xml
224
223
  prerelease: false
225
- requirement: &id014 !ruby/object:Gem::Requirement
224
+ requirement: &id015 !ruby/object:Gem::Requirement
226
225
  none: false
227
226
  requirements:
228
227
  - - ~>
229
228
  - !ruby/object:Gem::Version
230
- hash: 23
231
229
  segments:
232
230
  - 0
233
231
  - 2
234
232
  - 0
235
233
  version: 0.2.0
236
234
  type: :runtime
237
- version_requirements: *id014
235
+ version_requirements: *id015
238
236
  description: A Ruby wrapper for the Open311 API v2.
239
237
  email:
240
238
  - dan@codeforamerica.org
@@ -262,8 +260,15 @@ files:
262
260
  - lib/open311/client/request.rb
263
261
  - lib/open311/client/service.rb
264
262
  - lib/open311/configuration.rb
263
+ - lib/open311/service_request.rb
265
264
  - lib/open311/version.rb
266
265
  - open311.gemspec
266
+ - spec/fixtures/403.xml
267
+ - spec/fixtures/get_service_request.xml
268
+ - spec/fixtures/post_service_request.xml
269
+ - spec/fixtures/request_id_from_token.xml
270
+ - spec/fixtures/service_definition.xml
271
+ - spec/fixtures/service_requests.xml
267
272
  - spec/fixtures/services.xml
268
273
  - spec/open311_spec.rb
269
274
  - spec/spec_helper.rb
@@ -284,7 +289,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
284
289
  requirements:
285
290
  - - ">="
286
291
  - !ruby/object:Gem::Version
287
- hash: 3
288
292
  segments:
289
293
  - 0
290
294
  version: "0"
@@ -293,7 +297,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
293
297
  requirements:
294
298
  - - ">="
295
299
  - !ruby/object:Gem::Version
296
- hash: 23
297
300
  segments:
298
301
  - 1
299
302
  - 3
@@ -307,6 +310,12 @@ signing_key:
307
310
  specification_version: 3
308
311
  summary: A Ruby wrapper for the Open311 API v2.
309
312
  test_files:
313
+ - spec/fixtures/403.xml
314
+ - spec/fixtures/get_service_request.xml
315
+ - spec/fixtures/post_service_request.xml
316
+ - spec/fixtures/request_id_from_token.xml
317
+ - spec/fixtures/service_definition.xml
318
+ - spec/fixtures/service_requests.xml
310
319
  - spec/fixtures/services.xml
311
320
  - spec/open311_spec.rb
312
321
  - spec/spec_helper.rb