open311 0.2.3 → 0.3.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 91e2d7979b5e169e433be4e1cc56b25a2394c1e4
4
+ data.tar.gz: ec14c1ef94d7094e7ba1dc0a2f419a9a0b34857e
5
+ SHA512:
6
+ metadata.gz: 12650fcbf7c2e86417735ae72a635127bd7194e60cbd644bb0b6936cd9ccfe78e6139202a3b101e8ffb6520425c30eb1468240980b8588afd3dcd094fe9eceb9
7
+ data.tar.gz: 39008e419f2d23b02fe20602da6eaf89f64caddd6a0e01b45124a209c7de63293e51a63b57f6ea1a7f0d1c2c39a56a33399896e1b70fea37933b3511c03dce95
@@ -0,0 +1,49 @@
1
+ ## Contributing
2
+ In the spirit of [free software][free-sw], **everyone** is encouraged to help improve
3
+ this project.
4
+
5
+ [free-sw]: http://www.fsf.org/licensing/essays/free-sw.html
6
+
7
+ Here are some ways *you* can contribute:
8
+
9
+ * by using alpha, beta, and prerelease versions
10
+ * by reporting bugs
11
+ * by suggesting new features
12
+ * by writing or editing documentation
13
+ * by writing specifications
14
+ * by writing code (**no patch is too small**: fix typos, add comments, clean up
15
+ inconsistent whitespace)
16
+ * by refactoring code
17
+ * by fixing [issues][]
18
+ * by reviewing patches
19
+
20
+ [issues]: https://github.com/codeforamerica/open311/issues
21
+
22
+ ## Submitting an Issue
23
+ We use the [GitHub issue tracker][issues] to track bugs and features. Before
24
+ submitting a bug report or feature request, check to make sure it hasn't
25
+ already been submitted. When submitting a bug report, please include a [Gist][]
26
+ that includes a stack trace and any details that may be necessary to reproduce
27
+ the bug, including your gem version, Ruby version, and operating system.
28
+ Ideally, a bug report should include a pull request with failing specs.
29
+
30
+ [gist]: https://gist.github.com/
31
+
32
+ ## Submitting a Pull Request
33
+ 1. [Fork the repository.][fork]
34
+ 2. [Create a topic branch.][branch]
35
+ 3. Add specs for your unimplemented feature or bug fix.
36
+ 4. Run `bundle exec rake spec`. If your specs pass, return to step 3.
37
+ 5. Implement your feature or bug fix.
38
+ 6. Run `bundle exec rake`. If your specs fail, return to step 5.
39
+ 7. Run `open coverage/index.html`. If your changes are not completely covered
40
+ by your tests, return to step 3.
41
+ 8. Add documentation for your feature or bug fix.
42
+ 9. Run `bundle exec rake verify_measurements`. If your changes are not 100%
43
+ documented, go back to step 8.
44
+ 10. Commit and push your changes.
45
+ 11. [Submit a pull request.][pr]
46
+
47
+ [fork]: http://help.github.com/fork-a-repo/
48
+ [branch]: http://learn.github.com/p/branching.html
49
+ [pr]: http://help.github.com/send-pull-requests/
data/README.md CHANGED
@@ -1,19 +1,19 @@
1
- # Open311
1
+ # Open311 [![Build Status](https://secure.travis-ci.org/codeforamerica/open311.png)][travis]
2
2
  A Ruby wrapper for the Open311 API v2.
3
3
 
4
- ## <a name="apps">Does your project or organization use this gem?</a>
4
+ [travis]: http://travis-ci.org/codeforamerica/open311
5
+
6
+ ## Does your project or organization use this gem?
5
7
  Add it to the [apps](https://github.com/codeforamerica/open311/wiki/apps) wiki!
6
8
 
7
- ## <a name="installation">Installation</a>
9
+ ## Installation
8
10
  gem install open311
9
11
 
10
- ## <a name="documentation">Documentation</a>
12
+ ## Documentation
11
13
  [http://rdoc.info/gems/open311](http://rdoc.info/gems/open311)
12
14
 
13
- ## <a name="ci">Continuous Integration</a>
14
- [![Build Status](https://secure.travis-ci.org/codeforamerica/open311.png)](http://travis-ci.org/codeforamerica/open311)
15
15
 
16
- ## <a name="examples">Usage Examples</a>
16
+ ## Usage Examples
17
17
  require 'open311'
18
18
 
19
19
  # Certain methods require an API key
@@ -52,48 +52,14 @@ Add it to the [apps](https://github.com/codeforamerica/open311/wiki/apps) wiki!
52
52
  # Get multiple service requests by ids, comma separated
53
53
  Open311.service_requests({"service_request_id" => "101000119824,101000119823"})
54
54
 
55
- ## <a name="contributing">Contributing</a>
56
- In the spirit of [free software](http://www.fsf.org/licensing/essays/free-sw.html), **everyone** is encouraged to help improve this project.
57
-
58
- Here are some ways *you* can contribute:
59
-
60
- * by using alpha, beta, and prerelease versions
61
- * by reporting bugs
62
- * by suggesting new features
63
- * by writing or editing documentation
64
- * by writing specifications
65
- * by writing code (**no patch is too small**: fix typos, add comments, clean up inconsistent whitespace)
66
- * by refactoring code
67
- * by resolving [issues](https://github.com/codeforamerica/open311/issues)
68
- * by reviewing patches
69
-
70
- ## <a name="issues">Submitting an Issue</a>
71
- We use the [GitHub issue tracker](https://github.com/codeforamerica/open311/issues) to track bugs and
72
- features. Before submitting a bug report or feature request, check to make sure it hasn't already
73
- been submitted. You can indicate support for an existing issuse by voting it up. When submitting a
74
- bug report, please include a [Gist](https://gist.github.com/) that includes a stack trace and any
75
- details that may be necessary to reproduce the bug, including your gem version, Ruby version, and
76
- operating system. Ideally, a bug report should include a pull request with failing specs.
77
-
78
- ## <a name="pulls">Submitting a Pull Request</a>
79
- 1. Fork the project.
80
- 2. Create a topic branch.
81
- 3. Implement your feature or bug fix.
82
- 4. Add documentation for your feature or bug fix.
83
- 5. Run <tt>bundle exec rake doc:yard</tt>. If your changes are not 100% documented, go back to step 4.
84
- 6. Add specs for your feature or bug fix.
85
- 7. Run <tt>bundle exec rake spec</tt>. If your changes are not 100% covered, go back to step 6.
86
- 8. Commit and push your changes.
87
- 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.)
88
-
89
- ## <a name="rubies">Supported Rubies</a>
55
+ ## Supported Rubies
90
56
  This library aims to support and is [tested
91
57
  against](http://travis-ci.org/codeforamerica/open311) the following Ruby
92
58
  implementations:
93
59
 
94
- * Ruby 1.8.7
95
- * Ruby 1.9.2
96
60
  * Ruby 1.9.3
61
+ * Ruby 2.0.0
62
+ * Ruby 2.1
97
63
  * [JRuby](http://www.jruby.org/)
98
64
  * [Rubinius](http://rubini.us/)
99
65
 
@@ -111,7 +77,7 @@ implementation, you will be personally responsible for providing patches in a
111
77
  timely fashion. If critical issues for a particular implementation exist at the
112
78
  time of a major release, support for that Ruby version may be dropped.
113
79
 
114
- ## <a name="copyright">Copyright</a>
80
+ ## Copyright
115
81
  Copyright (c) 2010 Code for America.
116
82
  See [LICENSE](https://github.com/codeforamerica/open311/blob/master/LICENSE.md) for details.
117
83
 
@@ -8,7 +8,7 @@ module Open311
8
8
  # Alias for Open311::Client.new
9
9
  #
10
10
  # @return [Open311::Client]
11
- def new(options={})
11
+ def new(options = {})
12
12
  Open311::Client.new(options)
13
13
  end
14
14
 
@@ -18,7 +18,7 @@ module Open311
18
18
  new.send(method, *args, &block)
19
19
  end
20
20
 
21
- def respond_to?(method, include_private=false)
21
+ def respond_to?(method, include_private = false)
22
22
  new.respond_to?(method, include_private) || super(method, include_private)
23
23
  end
24
24
  end
@@ -4,9 +4,9 @@ require 'open311/client/service'
4
4
 
5
5
  module Open311
6
6
  class Client
7
- attr_accessor *Configuration::VALID_OPTIONS_KEYS
7
+ attr_accessor(*Configuration::VALID_OPTIONS_KEYS)
8
8
 
9
- def initialize(options={})
9
+ def initialize(options = {})
10
10
  options = Open311.options.merge(options)
11
11
  Configuration::VALID_OPTIONS_KEYS.each do |key|
12
12
  send("#{key}=", options[key])
@@ -1,32 +1,30 @@
1
1
  require 'faraday_middleware'
2
- require 'faraday/response/raise_error'
2
+ require 'open311/response/raise_error'
3
3
 
4
4
  module Open311
5
5
  class Client
6
6
  # @private
7
7
  module Connection
8
- private
8
+ private
9
9
 
10
- def connection(raw=false)
11
- options = {
10
+ def options
11
+ {
12
12
  # :headers => {'Accept' => "*/#{format}", 'User-Agent' => user_agent},
13
- :proxy => proxy,
14
- :ssl => {:verify => false},
15
- :url => endpoint
13
+ proxy: proxy,
14
+ ssl: {verify: false},
15
+ url: endpoint,
16
16
  }
17
+ end
17
18
 
19
+ def connection
18
20
  Faraday.new(options) do |connection|
19
21
  connection.use Faraday::Request::Multipart
20
- unless raw
21
- connection.use Faraday::Response::Mashify
22
- case format.to_s.downcase
23
- when 'json'
24
- connection.use Faraday::Response::ParseJson
25
- when 'xml'
26
- connection.use Faraday::Response::ParseXml
27
- end
22
+ connection.use Faraday::Response::Mashify
23
+ case format.to_s.downcase
24
+ when 'json' then connection.use Faraday::Response::ParseJson
25
+ when 'xml' then connection.use Faraday::Response::ParseXml
28
26
  end
29
- connection.use Faraday::Response::RaiseError
27
+ connection.use Open311::Response::RaiseError
30
28
  connection.adapter(adapter)
31
29
  end
32
30
  end
@@ -1,26 +1,26 @@
1
1
  module Open311
2
2
  class Client
3
3
  module Request
4
- def get(path, options={}, raw=false)
5
- request(:get, path, options, raw)
4
+ def get(path, options = {})
5
+ request(:get, path, options)
6
6
  end
7
7
 
8
- def post(path, options={}, raw=false)
9
- request(:post, path, options, raw)
8
+ def post(path, options = {})
9
+ request(:post, path, options)
10
10
  end
11
11
 
12
- def put(path, options={}, raw=false)
13
- request(:put, path, options, raw)
12
+ def put(path, options = {})
13
+ request(:put, path, options)
14
14
  end
15
15
 
16
- def delete(path, options={}, raw=false)
17
- request(:delete, path, options, raw)
16
+ def delete(path, options = {})
17
+ request(:delete, path, options)
18
18
  end
19
19
 
20
- private
20
+ private
21
21
 
22
- def request(method, path, options, raw)
23
- response = connection(raw).send(method) do |request|
22
+ def request(method, path, options)
23
+ connection.send(method) do |request|
24
24
  case method
25
25
  when :get, :delete
26
26
  request.url(formatted_path(path), options)
@@ -28,8 +28,7 @@ module Open311
28
28
  request.path = formatted_path(path)
29
29
  request.body = options unless options.empty?
30
30
  end
31
- end
32
- raw ? response : response.body
31
+ end.body
33
32
  end
34
33
 
35
34
  def formatted_path(path)
@@ -10,8 +10,8 @@ module Open311
10
10
  # @see http://wiki.open311.org/GeoReport_v2#GET_Service_List
11
11
  # @example Provide a list of acceptable 311 service request types and their associated service codes
12
12
  # Open311.service_list
13
- def service_list(options={})
14
- options.merge!(:jurisdiction_id => jurisdiction)
13
+ def service_list(options = {})
14
+ merge_options!(options)
15
15
  response = get('services', options)
16
16
  unpack_if_xml(response) do
17
17
  response['services']['service']
@@ -26,8 +26,8 @@ module Open311
26
26
  # @see http://wiki.open311.org/GeoReport_v2#GET_Service_Definition
27
27
  # @example define attributes associated with a service code, i.e. 033
28
28
  # Open311.service_definition
29
- def service_definition(id, options={})
30
- options.merge!(:jurisdiction_id => jurisdiction)
29
+ def service_definition(id, options = {})
30
+ merge_options!(options)
31
31
  response = get("services/#{id}", options)
32
32
  unpack_if_xml(response) do
33
33
  response['service_definition']
@@ -40,11 +40,13 @@ module Open311
40
40
  # @return [Array]
41
41
  # @see http://wiki.open311.org/GeoReport_v2#GET_Service_Requests
42
42
  # Open311.service_requests
43
- def service_requests(options={})
44
- options.merge!(:jurisdiction_id => jurisdiction)
45
- response = get("requests", options)
43
+ def service_requests(options = {})
44
+ merge_options!(options)
45
+ response = get('requests', options)
46
46
  unpack_if_xml(response) do
47
- response.service_requests.request.map do |request|
47
+ return [] unless response.service_requests.respond_to? :request
48
+
49
+ response.service_requests.request.map do |_request|
48
50
  response['service_requests']['request']
49
51
  end
50
52
  end
@@ -56,9 +58,9 @@ module Open311
56
58
  # @return Hash
57
59
  # @see http://wiki.open311.org/GeoReport_v2#POST_Service_Request
58
60
  # Open311.post_service_request
59
- def post_service_request(options={})
60
- options.merge!(:jurisdiction_id => jurisdiction, :api_key => api_key)
61
- response = post("requests", options)
61
+ def post_service_request(options = {})
62
+ merge_options!(options, api_key: api_key)
63
+ response = post('requests', options)
62
64
  unpack_if_xml(response) do
63
65
  response['service_requests']['request']
64
66
  end
@@ -71,8 +73,8 @@ module Open311
71
73
  # @return Hash
72
74
  # @see http://wiki.open311.org/GeoReport_v2#GET_Service_Requests
73
75
  # Open311.get_service_request
74
- def get_service_request(id, options={})
75
- options.merge!(:jurisdiction_id => jurisdiction)
76
+ def get_service_request(id, options = {})
77
+ merge_options!(options)
76
78
  response = get("requests/#{id}", options)
77
79
  unpack_if_xml(response) do
78
80
  response['service_requests']['request']
@@ -87,14 +89,19 @@ module Open311
87
89
  # @see http://wiki.open311.org/GeoReport_v2#GET_request_id_from_a_token
88
90
  # Open311.request_id
89
91
  def request_id_from_token(token_id, options = {})
90
- options.merge!(:jurisdiction_id => jurisdiction)
92
+ merge_options!(options)
91
93
  response = get("tokens/#{token_id}", options)
92
94
  unpack_if_xml(response) do
93
95
  response['service_requests']['request']
94
96
  end
95
97
  end
96
98
 
97
- private
99
+ private
100
+
101
+ def merge_options!(options, additional_options = {})
102
+ options.merge!(jurisdiction_id: jurisdiction) if jurisdiction
103
+ options.merge!(additional_options)
104
+ end
98
105
 
99
106
  def unpack_if_xml(response)
100
107
  if format.to_s.downcase == 'xml'
@@ -22,9 +22,9 @@ module Open311
22
22
  DEFAULT_FORMAT = :xml
23
23
  DEFAULT_JURISDICTION = nil
24
24
  DEFAULT_PROXY = nil
25
- DEFAULT_USER_AGENT = "Open311 Ruby Gem #{Open311::VERSION}".freeze
25
+ DEFAULT_USER_AGENT = "Open311 Ruby Gem #{Open311::Version}".freeze
26
26
 
27
- attr_accessor *VALID_OPTIONS_KEYS
27
+ attr_accessor(*VALID_OPTIONS_KEYS)
28
28
 
29
29
  def self.extended(base)
30
30
  base.reset
@@ -35,7 +35,7 @@ module Open311
35
35
  end
36
36
 
37
37
  def options
38
- VALID_OPTIONS_KEYS.inject({}){|o,k| o.merge!(k => send(k)) }
38
+ VALID_OPTIONS_KEYS.inject({}) { |a, e| a.merge!(e => send(e)) }
39
39
  end
40
40
 
41
41
  def reset
@@ -0,0 +1,33 @@
1
+ require 'faraday'
2
+
3
+ # @api private
4
+ module Open311
5
+ module Response
6
+ class RaiseError < Faraday::Response::Middleware
7
+ def on_complete(response) # rubocop:disable AbcSize, CyclomaticComplexity, MethodLength
8
+ case response[:status].to_i
9
+ when 400
10
+ fail Open311::BadRequest.new(error_message(response))
11
+ when 401
12
+ fail Open311::Unauthorized.new(error_message(response))
13
+ when 403
14
+ fail Open311::Forbidden.new(error_message(response))
15
+ when 404
16
+ fail Open311::NotFound.new(error_message(response))
17
+ when 406
18
+ fail Open311::NotAcceptable.new(error_message(response))
19
+ when 500
20
+ fail Open311::InternalServerError.new(error_message(response))
21
+ when 502
22
+ fail Open311::BadGateway.new(error_message(response))
23
+ when 503
24
+ fail Open311::ServiceUnavailable.new(error_message(response))
25
+ end
26
+ end
27
+
28
+ def error_message(response)
29
+ "#{response[:method].to_s.upcase} #{response[:url]}: #{response[:response_headers]['status']}#{(': ' + response[:body]['error']) if response[:body] && response[:body]['error']}"
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,3 +1,15 @@
1
1
  module Open311
2
- VERSION = "0.2.3"
2
+ class Version
3
+ MAJOR = 0
4
+ MINOR = 3
5
+ PATCH = 0
6
+ PRE = nil
7
+
8
+ class << self
9
+ # @return [String]
10
+ def to_s
11
+ [MAJOR, MINOR, PATCH, PRE].compact.join('.')
12
+ end
13
+ end
14
+ end
3
15
  end
@@ -1,32 +1,27 @@
1
- # encoding: utf-8
2
- require File.expand_path('../lib/open311/version', __FILE__)
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'open311/version'
3
4
 
4
- Gem::Specification.new do |gem|
5
- gem.add_dependency 'faraday', '~> 0.7'
6
- gem.add_dependency 'faraday_middleware', '~> 0.7'
7
- gem.add_dependency 'hashie', '~> 1.2'
8
- gem.add_dependency 'multi_json', '~> 1.0'
9
- gem.add_dependency 'multi_xml', '~> 0.4'
10
- gem.add_development_dependency 'ox'
11
- gem.add_development_dependency 'rake'
12
- gem.add_development_dependency 'rdiscount'
13
- gem.add_development_dependency 'rspec'
14
- gem.add_development_dependency 'simplecov'
15
- gem.add_development_dependency 'webmock'
16
- gem.add_development_dependency 'yard'
17
- gem.authors = ["Dan Melton", "Erik Michaels-Ober"]
18
- gem.description = %q{A Ruby wrapper for the Open311 API v2.}
19
- gem.email = ['dan@codeforamerica.org', 'erik@codeforamerica.org']
20
- gem.files = `git ls-files`.split("\n")
21
- gem.homepage = 'https://github.com/codeforamerica/open311'
22
- gem.name = 'open311'
23
- gem.post_install_message =<<eos
5
+ Gem::Specification.new do |spec|
6
+ spec.add_dependency 'faraday', '~> 0.7'
7
+ spec.add_dependency 'faraday_middleware', '~> 0.7'
8
+ spec.add_dependency 'hashie', '~> 3.3'
9
+ spec.add_dependency 'multi_json', '~> 1.0'
10
+ spec.add_dependency 'multi_xml', '~> 0.4'
11
+ spec.add_development_dependency 'bundler', '~> 1.0'
12
+ spec.authors = ['Dan Melton', 'Erik Michaels-Ober']
13
+ spec.description = 'A Ruby wrapper for the Open311 API v2.'
14
+ spec.email = ['dan@codeforamerica.org', 'erik@codeforamerica.org']
15
+ spec.files = %w(.yardopts CONTRIBUTING.md LICENSE.md README.md open311.gemspec) + Dir['lib/**/*.rb']
16
+ spec.homepage = 'https://github.com/codeforamerica/open311'
17
+ spec.name = 'open311'
18
+ spec.post_install_message = <<eos
24
19
  Using this gem in your project or organization? Add it to the apps wiki!
25
20
  https://github.com/codeforamerica/open311/wiki/apps
26
21
  eos
27
- gem.require_paths = ['lib']
28
- gem.required_rubygems_version = Gem::Requirement.new('>= 1.3.6')
29
- gem.summary = gem.description
30
- gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
31
- gem.version = Open311::VERSION
22
+ spec.require_paths = ['lib']
23
+ spec.required_ruby_version = '>= 1.9.3'
24
+ spec.required_rubygems_version = Gem::Requirement.new('>= 1.3.6')
25
+ spec.summary = spec.description
26
+ spec.version = Open311::Version
32
27
  end