assembla_api 0.1.2

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 (112) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +20 -0
  3. data/Rakefile +22 -0
  4. data/lib/assembla_api.rb +130 -0
  5. data/lib/assembla_api/api.rb +373 -0
  6. data/lib/assembla_api/api/actions.rb +58 -0
  7. data/lib/assembla_api/api/arguments.rb +248 -0
  8. data/lib/assembla_api/api/config.rb +107 -0
  9. data/lib/assembla_api/api/config/property.rb +30 -0
  10. data/lib/assembla_api/api/config/property_set.rb +119 -0
  11. data/lib/assembla_api/api/factory.rb +33 -0
  12. data/lib/assembla_api/authorization.rb +76 -0
  13. data/lib/assembla_api/client.rb +21 -0
  14. data/lib/assembla_api/client/activity.rb +30 -0
  15. data/lib/assembla_api/client/authorizations.rb +143 -0
  16. data/lib/assembla_api/client/authorizations/app.rb +98 -0
  17. data/lib/assembla_api/client/portfolio.rb +19 -0
  18. data/lib/assembla_api/client/portfolio/invitations.rb +30 -0
  19. data/lib/assembla_api/client/portfolio/spaces.rb +13 -0
  20. data/lib/assembla_api/client/portfolio/standup_reports.rb +34 -0
  21. data/lib/assembla_api/client/portfolio/tasks.rb +13 -0
  22. data/lib/assembla_api/client/portfolio/ticket_reports.rb +13 -0
  23. data/lib/assembla_api/client/portfolio/tickets.rb +13 -0
  24. data/lib/assembla_api/client/portfolio/users.rb +13 -0
  25. data/lib/assembla_api/client/spaces.rb +140 -0
  26. data/lib/assembla_api/client/spaces/documents.rb +87 -0
  27. data/lib/assembla_api/client/spaces/milestones.rb +102 -0
  28. data/lib/assembla_api/client/spaces/space_tools.rb +65 -0
  29. data/lib/assembla_api/client/spaces/space_tools/merge_requests.rb +105 -0
  30. data/lib/assembla_api/client/spaces/space_tools/merge_requests/versions.rb +41 -0
  31. data/lib/assembla_api/client/spaces/space_tools/merge_requests/versions/comments.rb +34 -0
  32. data/lib/assembla_api/client/spaces/space_tools/merge_requests/versions/votes.rb +46 -0
  33. data/lib/assembla_api/client/spaces/ssh.rb +14 -0
  34. data/lib/assembla_api/client/spaces/ssh/actions.rb +76 -0
  35. data/lib/assembla_api/client/spaces/ssh/actions/launches.rb +14 -0
  36. data/lib/assembla_api/client/spaces/ssh/keys.rb +18 -0
  37. data/lib/assembla_api/client/spaces/ssh/launches.rb +29 -0
  38. data/lib/assembla_api/client/spaces/ssh/servers.rb +63 -0
  39. data/lib/assembla_api/client/spaces/standup_away_reports.rb +41 -0
  40. data/lib/assembla_api/client/spaces/standup_reports.rb +41 -0
  41. data/lib/assembla_api/client/spaces/tags.rb +96 -0
  42. data/lib/assembla_api/client/spaces/tickets.rb +154 -0
  43. data/lib/assembla_api/client/spaces/tickets/associations.rb +57 -0
  44. data/lib/assembla_api/client/spaces/tickets/comments.rb +45 -0
  45. data/lib/assembla_api/client/spaces/tickets/custom_fields.rb +57 -0
  46. data/lib/assembla_api/client/spaces/tickets/statuses.rb +55 -0
  47. data/lib/assembla_api/client/spaces/user_roles.rb +61 -0
  48. data/lib/assembla_api/client/spaces/users.rb +11 -0
  49. data/lib/assembla_api/client/spaces/webhooks.rb +63 -0
  50. data/lib/assembla_api/client/spaces/wiki_pages.rb +78 -0
  51. data/lib/assembla_api/client/spaces/wiki_pages/versions.rb +20 -0
  52. data/lib/assembla_api/client/tasks.rb +72 -0
  53. data/lib/assembla_api/client/users.rb +49 -0
  54. data/lib/assembla_api/client/users/keys.rb +97 -0
  55. data/lib/assembla_api/configuration.rb +71 -0
  56. data/lib/assembla_api/connection.rb +66 -0
  57. data/lib/assembla_api/constants.rb +74 -0
  58. data/lib/assembla_api/core_ext/array.rb +25 -0
  59. data/lib/assembla_api/core_ext/hash.rb +92 -0
  60. data/lib/assembla_api/core_ext/ordered_hash.rb +107 -0
  61. data/lib/assembla_api/deprecation.rb +39 -0
  62. data/lib/assembla_api/error.rb +37 -0
  63. data/lib/assembla_api/error/bad_request.rb +14 -0
  64. data/lib/assembla_api/error/client_error.rb +20 -0
  65. data/lib/assembla_api/error/forbidden.rb +14 -0
  66. data/lib/assembla_api/error/internal_server_error.rb +15 -0
  67. data/lib/assembla_api/error/invalid_options.rb +18 -0
  68. data/lib/assembla_api/error/not_acceptable.rb +15 -0
  69. data/lib/assembla_api/error/not_found.rb +14 -0
  70. data/lib/assembla_api/error/required_params.rb +18 -0
  71. data/lib/assembla_api/error/service_error.rb +68 -0
  72. data/lib/assembla_api/error/service_unavailable.rb +15 -0
  73. data/lib/assembla_api/error/unauthorized.rb +15 -0
  74. data/lib/assembla_api/error/unknown_media.rb +18 -0
  75. data/lib/assembla_api/error/unknown_value.rb +18 -0
  76. data/lib/assembla_api/error/unprocessable_entity.rb +14 -0
  77. data/lib/assembla_api/error/validations.rb +18 -0
  78. data/lib/assembla_api/ext/faraday.rb +38 -0
  79. data/lib/assembla_api/jsonable.rb +18 -0
  80. data/lib/assembla_api/middleware.rb +31 -0
  81. data/lib/assembla_api/mime_type.rb +33 -0
  82. data/lib/assembla_api/normalizer.rb +25 -0
  83. data/lib/assembla_api/null_encoder.rb +25 -0
  84. data/lib/assembla_api/page_iterator.rb +142 -0
  85. data/lib/assembla_api/page_links.rb +45 -0
  86. data/lib/assembla_api/paged_request.rb +40 -0
  87. data/lib/assembla_api/pagination.rb +102 -0
  88. data/lib/assembla_api/parameter_filter.rb +32 -0
  89. data/lib/assembla_api/params_hash.rb +101 -0
  90. data/lib/assembla_api/rate_limit.rb +25 -0
  91. data/lib/assembla_api/request.rb +85 -0
  92. data/lib/assembla_api/request/basic_auth.rb +33 -0
  93. data/lib/assembla_api/request/jsonize.rb +53 -0
  94. data/lib/assembla_api/request/key_auth.rb +31 -0
  95. data/lib/assembla_api/request/oauth2.rb +42 -0
  96. data/lib/assembla_api/request/verbs.rb +60 -0
  97. data/lib/assembla_api/response.rb +28 -0
  98. data/lib/assembla_api/response/header.rb +76 -0
  99. data/lib/assembla_api/response/jsonize.rb +29 -0
  100. data/lib/assembla_api/response/mashify.rb +24 -0
  101. data/lib/assembla_api/response/raise_error.rb +18 -0
  102. data/lib/assembla_api/response/xmlize.rb +26 -0
  103. data/lib/assembla_api/response_wrapper.rb +157 -0
  104. data/lib/assembla_api/ssl_certs/cacerts.pem +2183 -0
  105. data/lib/assembla_api/utils/url.rb +59 -0
  106. data/lib/assembla_api/validations.rb +25 -0
  107. data/lib/assembla_api/validations/format.rb +24 -0
  108. data/lib/assembla_api/validations/presence.rb +30 -0
  109. data/lib/assembla_api/validations/required.rb +24 -0
  110. data/lib/assembla_api/validations/token.rb +41 -0
  111. data/lib/assembla_api/version.rb +12 -0
  112. metadata +347 -0
@@ -0,0 +1,37 @@
1
+ # encoding: utf-8
2
+
3
+ require 'descendants_tracker'
4
+
5
+ module Assembla
6
+ module Error
7
+ class AssemblaError < StandardError
8
+ extend DescendantsTracker
9
+
10
+ attr_reader :response_message, :response_headers
11
+
12
+ # Initialize a new Assembla error object.
13
+ #
14
+ def initialize(message=$!)
15
+ if message.respond_to?(:backtrace)
16
+ super(message.message)
17
+ @response_message = message
18
+ else
19
+ super(message.to_s)
20
+ end
21
+ end
22
+
23
+ def backtrace
24
+ @response_message ? @response_message.backtrace : super
25
+ end
26
+
27
+ end # AssemblaError
28
+ end # Error
29
+ end # Assembla
30
+
31
+ require 'assembla_api/error/service_error'
32
+ require 'assembla_api/error/client_error'
33
+ Dir[File.dirname(__FILE__) + '/error/*.rb'].sort.each do |path|
34
+ filename = File.basename(path)
35
+ next if ['service_error.rb', 'client_error.rb'].include?(filename)
36
+ require "assembla_api/error/#{filename}"
37
+ end
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+
3
+ module Assembla
4
+ module Error
5
+ # Raised when Assembla returns the HTTP status code 400
6
+ class BadRequest < ServiceError
7
+ http_status_code 400
8
+
9
+ def initialize(response)
10
+ super(response)
11
+ end
12
+ end
13
+ end
14
+ end # Assembla
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+
3
+ module Assembla #:nodoc
4
+ # Raised when Assembla returns the HTTP status code 404
5
+ module Error
6
+ class ClientError < AssemblaError
7
+ attr_reader :problem, :summary, :resolution
8
+
9
+ def initialize(message)
10
+ super(message)
11
+ end
12
+
13
+ def generate_message(attributes)
14
+ "\nProblem:\n #{attributes[:problem]}"+
15
+ "\nSummary:\n #{attributes[:summary]}"+
16
+ "\nResolution:\n #{attributes[:resolution]}"
17
+ end
18
+ end
19
+ end # Error
20
+ end # Assembla
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+
3
+ module Assembla #:nodoc
4
+ # Raised when Assembla returns the HTTP status code 403
5
+ module Error
6
+ class Forbidden < ServiceError
7
+ http_status_code 403
8
+
9
+ def initialize(response)
10
+ super(response)
11
+ end
12
+ end
13
+ end # Error
14
+ end # Assembla
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+
3
+ module Assembla #:nodoc
4
+ # Raised when Assembla returns the HTTP status code 500
5
+ module Error
6
+ class InternalServerError < ServiceError
7
+ http_status_code 500
8
+
9
+ def initialize(response)
10
+ super(response)
11
+ end
12
+
13
+ end # InternalServerError
14
+ end # Error
15
+ end # Assembla
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ module Assembla #:nodoc
4
+ # Raised when invalid options are passed to a request body
5
+ module Error
6
+ class InvalidOptions < ClientError
7
+ def initialize(invalid, valid)
8
+ super(
9
+ generate_message(
10
+ :problem => "Invalid option #{invalid.keys.join(', ')} provided for this request.",
11
+ :summary => "Assembla gem checks the request parameters passed to ensure that assembla api is not hit unnecessairly and to fail fast.",
12
+ :resolution => "Valid options are: #{valid.join(', ')}, make sure these are the ones you are using"
13
+ )
14
+ )
15
+ end
16
+ end
17
+ end # Error
18
+ end # Assembla
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+
3
+ module Assembla #:nodoc
4
+ # Raised when Assembla returns the HTTP status code 406
5
+ module Error
6
+ class NotAcceptable < ServiceError
7
+ http_status_code 406
8
+
9
+ def initialize(response)
10
+ super(response)
11
+ end
12
+
13
+ end # NotAcceptable
14
+ end # Error
15
+ end # Assembla
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+
3
+ module Assembla #:nodoc
4
+ # Raised when Assembla returns the HTTP status code 404
5
+ module Error
6
+ class NotFound < ServiceError
7
+ http_status_code 404
8
+
9
+ def initialize(env)
10
+ super(env)
11
+ end
12
+ end
13
+ end # Error
14
+ end # Assembla
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ module Assembla #:nodoc
4
+ # Raised when invalid options are passed to a request body
5
+ module Error
6
+ class RequiredParams < ClientError
7
+ def initialize(provided, required)
8
+ super(
9
+ generate_message(
10
+ :problem => "Missing required parameters: #{provided.keys.join(', ')} provided for this request.",
11
+ :summary => "Assembla gem checks the request parameters passed to ensure that assembla api is not hit unnecessairly and to fail fast.",
12
+ :resolution => "Required parameters are: #{required.join(', ')}, make sure these are the ones you are using"
13
+ )
14
+ )
15
+ end
16
+ end
17
+ end # Error
18
+ end # Assembla
@@ -0,0 +1,68 @@
1
+ # encoding: utf-8
2
+ # require 'multi_json'
3
+ require 'assembla_api/jsonable'
4
+
5
+ module Assembla
6
+ # Raised when Assembla returns any of the HTTP status codes
7
+ module Error
8
+ class ServiceError < AssemblaError
9
+ include ::Assembla::Jsonable
10
+
11
+ attr_reader :http_headers, :body, :status
12
+
13
+ MIN_BODY_LENGTH = 2
14
+
15
+ def initialize(response)
16
+ @http_headers = response[:response_headers]
17
+ message = parse_response(response)
18
+ super(message)
19
+ end
20
+
21
+ def parse_response(response)
22
+ @body = parse_body(response[:body])
23
+ @status = response[:status]
24
+ "#{response[:method].to_s.upcase} #{response[:url].to_s}: #{@status} #{@body}"
25
+ end
26
+
27
+ def decode_body(body)
28
+ if body.respond_to?(:to_str) && body.length >= MIN_BODY_LENGTH
29
+ decode body, symbolize_keys: true
30
+ else
31
+ body
32
+ end
33
+ end
34
+
35
+ def parse_body(body)
36
+ body = decode_body(body)
37
+
38
+ return '' if body.nil? || body.empty?
39
+
40
+ if body[:error]
41
+ body[:error]
42
+ elsif body[:errors]
43
+ error = Array(body[:errors]).first
44
+ if error.kind_of?(Hash)
45
+ error[:message]
46
+ else
47
+ error
48
+ end
49
+ elsif body[:message]
50
+ body[:message]
51
+ else
52
+ ''
53
+ end
54
+ end
55
+
56
+ def self.http_status_code(code)
57
+ define_method(:http_status_code) { code }
58
+ end
59
+
60
+ def self.errors
61
+ @errors ||= Hash[
62
+ descendants.map { |klass| [klass.new({}).http_status_code, klass] }
63
+ ]
64
+ end
65
+
66
+ end
67
+ end # Error
68
+ end # Assembla
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+
3
+ module Assembla #:nodoc
4
+ # Raised when Assembla returns the HTTP status code 503
5
+ module Error
6
+ class ServiceUnavailable < ServiceError
7
+ http_status_code 503
8
+
9
+ def initialize(response)
10
+ super(response)
11
+ end
12
+
13
+ end # ServiceUnavailable
14
+ end # Error
15
+ end # Assembla
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+
3
+ module Assembla #:nodoc
4
+ # Raised when Assembla returns the HTTP status code 401
5
+ module Error
6
+ class Unauthorized < ServiceError
7
+ http_status_code 401
8
+
9
+ def initialize(response)
10
+ super(response)
11
+ end
12
+
13
+ end # Unauthorized
14
+ end # Error
15
+ end # Assembla
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ module Assembla #:nodoc
4
+ # Raised when invalid options are passed to a request body
5
+ module Error
6
+ class UnknownMedia < ClientError
7
+ def initialize(file)
8
+ super(
9
+ generate_message(
10
+ :problem => "Unknown content type for: '#{file}' provided for this request.",
11
+ :summary => "Assembla gem infers the content type of the resource by calling the mime-types gem type inference.",
12
+ :resolution => "Please install mime-types gem to infer the resource content type."
13
+ )
14
+ )
15
+ end
16
+ end
17
+ end # Error
18
+ end # Assembla
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ module Assembla #:nodoc
4
+ # Raised when invalid options are passed to a request body
5
+ module Error
6
+ class UnknownValue < ClientError
7
+ def initialize(key, value, permitted)
8
+ super(
9
+ generate_message(
10
+ :problem => "Wrong value of '#{value}' for the parameter: #{key} provided for this request.",
11
+ :summary => "Assembla gem checks the request parameters passed to ensure that assembla api is not hit unnecessairly and fails fast.",
12
+ :resolution => "Permitted values are: #{permitted}, make sure these are the ones you are using"
13
+ )
14
+ )
15
+ end
16
+ end
17
+ end # Error
18
+ end # Assembla
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+
3
+ module Assembla #:nodoc
4
+ # Raised when Assembla returns the HTTP status code 422
5
+ module Error
6
+ class UnprocessableEntity < ServiceError
7
+ http_status_code 422
8
+
9
+ def initialize(response)
10
+ super(response)
11
+ end
12
+ end
13
+ end # Error
14
+ end # Assembla
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ module Assembla #:nodoc
4
+ # Raised when passed parameters are missing or contain wrong values.
5
+ module Error
6
+ class Validations < ClientError
7
+ def initialize(errors)
8
+ super(
9
+ generate_message(
10
+ :problem => "Attempted to send request with nil arguments for #{errors.keys.join(', ')}.",
11
+ :summary => 'Each request expects certain number of required arguments.',
12
+ :resolution => 'Double check that the provided arguments are set to some value that is neither nil nor empty string.'
13
+ )
14
+ )
15
+ end
16
+ end
17
+ end # Error
18
+ end # Assembla
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+
3
+ module Faraday
4
+ module Utils
5
+
6
+ class ParamsHash
7
+ def params_encoder(encoder = nil)
8
+ if encoder
9
+ @encoder = encoder
10
+ else
11
+ @encoder
12
+ end
13
+ end
14
+
15
+ def to_query(encoder = nil)
16
+ Utils.build_nested_query(self, nil, params_encoder)
17
+ end
18
+ end
19
+
20
+ def build_nested_query(value, prefix = nil, encoder = nil)
21
+ case value
22
+ when Array
23
+ value.map { |v| build_nested_query(v, "#{prefix}%5B%5D", encoder) }.join("&")
24
+ when Hash
25
+ value.map { |k, v|
26
+ processed_value = encoder ? encoder.escape(k) : escape(k)
27
+ build_nested_query(v, prefix ? "#{prefix}%5B#{processed_value}%5D" : processed_value, encoder)
28
+ }.join("&")
29
+ when NilClass
30
+ prefix
31
+ else
32
+ raise ArgumentError, "value must be a Hash" if prefix.nil?
33
+ processed_value = encoder ? encoder.escape(value) : escape(value)
34
+ "#{prefix}=#{processed_value}"
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ require 'multi_json'
4
+
5
+ module Assembla
6
+ module Jsonable
7
+ extend self
8
+
9
+ def decode(*args)
10
+ return unless args.first
11
+ if MultiJson.respond_to?(:load)
12
+ MultiJson.load *args
13
+ else
14
+ MultiJson.decode *args
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+
3
+ require 'assembla_api/response'
4
+ require 'assembla_api/response/mashify'
5
+ require 'assembla_api/response/jsonize'
6
+ require 'assembla_api/response/raise_error'
7
+ require 'assembla_api/response/header'
8
+
9
+ module Assembla
10
+ class Middleware
11
+ def self.default(options = {})
12
+ api = options[:api]
13
+ proc do |builder|
14
+ builder.use Faraday::Request::Multipart
15
+ builder.use Assembla::Request::Jsonize
16
+ builder.use Faraday::Request::UrlEncoded
17
+ builder.use Assembla::Request::OAuth2, api.oauth_token if api.oauth_token?
18
+ builder.use Assembla::Request::BasicAuth, api.authentication if api.basic_authed?
19
+ builder.use Assembla::Request::KeyAuth, { api_key: api.api_key, api_secret: api.api_secret } if api.api_key?
20
+
21
+ builder.use Faraday::Response::Logger if ENV['DEBUG']
22
+ unless options[:raw]
23
+ builder.use Assembla::Response::Mashify
24
+ builder.use Assembla::Response::Jsonize
25
+ end
26
+ builder.use Assembla::Response::RaiseError
27
+ builder.adapter options[:adapter]
28
+ end
29
+ end
30
+ end # Middleware
31
+ end # Assembla