bitbucket_rest_api2 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 (116) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +7 -0
  3. data/README.md +169 -0
  4. data/lib/bitbucket_rest_api.rb +90 -0
  5. data/lib/bitbucket_rest_api/api.rb +106 -0
  6. data/lib/bitbucket_rest_api/api/actions.rb +35 -0
  7. data/lib/bitbucket_rest_api/api_factory.rb +30 -0
  8. data/lib/bitbucket_rest_api/authorization.rb +34 -0
  9. data/lib/bitbucket_rest_api/client.rb +56 -0
  10. data/lib/bitbucket_rest_api/configuration.rb +106 -0
  11. data/lib/bitbucket_rest_api/connection.rb +98 -0
  12. data/lib/bitbucket_rest_api/constants.rb +58 -0
  13. data/lib/bitbucket_rest_api/core_ext/array.rb +7 -0
  14. data/lib/bitbucket_rest_api/core_ext/hash.rb +46 -0
  15. data/lib/bitbucket_rest_api/deprecation.rb +39 -0
  16. data/lib/bitbucket_rest_api/error.rb +38 -0
  17. data/lib/bitbucket_rest_api/error/bad_events.rb +9 -0
  18. data/lib/bitbucket_rest_api/error/bad_request.rb +12 -0
  19. data/lib/bitbucket_rest_api/error/blank_value.rb +9 -0
  20. data/lib/bitbucket_rest_api/error/client_error.rb +20 -0
  21. data/lib/bitbucket_rest_api/error/forbidden.rb +12 -0
  22. data/lib/bitbucket_rest_api/error/internal_server_error.rb +12 -0
  23. data/lib/bitbucket_rest_api/error/invalid_options.rb +18 -0
  24. data/lib/bitbucket_rest_api/error/no_events.rb +9 -0
  25. data/lib/bitbucket_rest_api/error/not_found.rb +12 -0
  26. data/lib/bitbucket_rest_api/error/required_params.rb +18 -0
  27. data/lib/bitbucket_rest_api/error/service_error.rb +19 -0
  28. data/lib/bitbucket_rest_api/error/service_unavailable.rb +12 -0
  29. data/lib/bitbucket_rest_api/error/unauthorized.rb +12 -0
  30. data/lib/bitbucket_rest_api/error/unknown_value.rb +18 -0
  31. data/lib/bitbucket_rest_api/error/unprocessable_entity.rb +12 -0
  32. data/lib/bitbucket_rest_api/error/validations.rb +18 -0
  33. data/lib/bitbucket_rest_api/invitations.rb +15 -0
  34. data/lib/bitbucket_rest_api/issues.rb +230 -0
  35. data/lib/bitbucket_rest_api/issues/comments.rb +118 -0
  36. data/lib/bitbucket_rest_api/issues/components.rb +106 -0
  37. data/lib/bitbucket_rest_api/issues/milestones.rb +107 -0
  38. data/lib/bitbucket_rest_api/normalizer.rb +27 -0
  39. data/lib/bitbucket_rest_api/parameter_filter.rb +32 -0
  40. data/lib/bitbucket_rest_api/repos.rb +264 -0
  41. data/lib/bitbucket_rest_api/repos/changesets.rb +54 -0
  42. data/lib/bitbucket_rest_api/repos/commits.rb +40 -0
  43. data/lib/bitbucket_rest_api/repos/default_reviewers.rb +59 -0
  44. data/lib/bitbucket_rest_api/repos/download.rb +21 -0
  45. data/lib/bitbucket_rest_api/repos/following.rb +39 -0
  46. data/lib/bitbucket_rest_api/repos/forks.rb +69 -0
  47. data/lib/bitbucket_rest_api/repos/keys.rb +87 -0
  48. data/lib/bitbucket_rest_api/repos/pull_request.rb +160 -0
  49. data/lib/bitbucket_rest_api/repos/services.rb +103 -0
  50. data/lib/bitbucket_rest_api/repos/sources.rb +39 -0
  51. data/lib/bitbucket_rest_api/repos/webhooks.rb +96 -0
  52. data/lib/bitbucket_rest_api/request.rb +76 -0
  53. data/lib/bitbucket_rest_api/request/basic_auth.rb +31 -0
  54. data/lib/bitbucket_rest_api/request/jsonize.rb +46 -0
  55. data/lib/bitbucket_rest_api/request/oauth.rb +53 -0
  56. data/lib/bitbucket_rest_api/response.rb +28 -0
  57. data/lib/bitbucket_rest_api/response/helpers.rb +21 -0
  58. data/lib/bitbucket_rest_api/response/jsonize.rb +30 -0
  59. data/lib/bitbucket_rest_api/response/mashify.rb +24 -0
  60. data/lib/bitbucket_rest_api/response/raise_error.rb +31 -0
  61. data/lib/bitbucket_rest_api/response/xmlize.rb +26 -0
  62. data/lib/bitbucket_rest_api/result.rb +140 -0
  63. data/lib/bitbucket_rest_api/user.rb +101 -0
  64. data/lib/bitbucket_rest_api/users.rb +24 -0
  65. data/lib/bitbucket_rest_api/users/account.rb +53 -0
  66. data/lib/bitbucket_rest_api/utils/url.rb +56 -0
  67. data/lib/bitbucket_rest_api/validations.rb +25 -0
  68. data/lib/bitbucket_rest_api/validations/format.rb +24 -0
  69. data/lib/bitbucket_rest_api/validations/presence.rb +25 -0
  70. data/lib/bitbucket_rest_api/validations/required.rb +44 -0
  71. data/lib/bitbucket_rest_api/validations/token.rb +43 -0
  72. data/lib/bitbucket_rest_api/version.rb +11 -0
  73. data/spec/bitbucket_rest_api/api/actions_spec.rb +17 -0
  74. data/spec/bitbucket_rest_api/api_factory_spec.rb +30 -0
  75. data/spec/bitbucket_rest_api/api_spec.rb +86 -0
  76. data/spec/bitbucket_rest_api/authorization_spec.rb +72 -0
  77. data/spec/bitbucket_rest_api/client_spec.rb +15 -0
  78. data/spec/bitbucket_rest_api/core_ext/array_spec.rb +12 -0
  79. data/spec/bitbucket_rest_api/core_ext/hash_spec.rb +49 -0
  80. data/spec/bitbucket_rest_api/deprecation_spec.rb +30 -0
  81. data/spec/bitbucket_rest_api/error/bad_events_spec.rb +10 -0
  82. data/spec/bitbucket_rest_api/error/blank_value_spec.rb +13 -0
  83. data/spec/bitbucket_rest_api/error/no_events_spec.rb +10 -0
  84. data/spec/bitbucket_rest_api/invitations_spec.rb +21 -0
  85. data/spec/bitbucket_rest_api/issues/comments_spec.rb +89 -0
  86. data/spec/bitbucket_rest_api/issues/components_spec.rb +88 -0
  87. data/spec/bitbucket_rest_api/issues/milestones_spec.rb +88 -0
  88. data/spec/bitbucket_rest_api/issues_spec.rb +90 -0
  89. data/spec/bitbucket_rest_api/normalizer_spec.rb +30 -0
  90. data/spec/bitbucket_rest_api/parameter_filter_spec.rb +41 -0
  91. data/spec/bitbucket_rest_api/repos/changesets_spec.rb +43 -0
  92. data/spec/bitbucket_rest_api/repos/commits_spec.rb +20 -0
  93. data/spec/bitbucket_rest_api/repos/default_reviewers_spec.rb +64 -0
  94. data/spec/bitbucket_rest_api/repos/download_spec.rb +9 -0
  95. data/spec/bitbucket_rest_api/repos/following_spec.rb +52 -0
  96. data/spec/bitbucket_rest_api/repos/forks_spec.rb +45 -0
  97. data/spec/bitbucket_rest_api/repos/keys_spec.rb +72 -0
  98. data/spec/bitbucket_rest_api/repos/pull_request_spec.rb +288 -0
  99. data/spec/bitbucket_rest_api/repos/sources_spec.rb +77 -0
  100. data/spec/bitbucket_rest_api/repos/webhooks_spec.rb +245 -0
  101. data/spec/bitbucket_rest_api/repos_spec.rb +157 -0
  102. data/spec/bitbucket_rest_api/request/jsonize_spec.rb +18 -0
  103. data/spec/bitbucket_rest_api/request/oauth_spec.rb +27 -0
  104. data/spec/bitbucket_rest_api/request_spec.rb +81 -0
  105. data/spec/bitbucket_rest_api/response/jsonize_spec.rb +12 -0
  106. data/spec/bitbucket_rest_api/response/mashify_spec.rb +32 -0
  107. data/spec/bitbucket_rest_api/response/raise_error_spec.rb +41 -0
  108. data/spec/bitbucket_rest_api/user_spec.rb +77 -0
  109. data/spec/bitbucket_rest_api/utils/url_spec.rb +33 -0
  110. data/spec/bitbucket_rest_api/validations/format_spec.rb +29 -0
  111. data/spec/bitbucket_rest_api/validations/presence_spec.rb +12 -0
  112. data/spec/bitbucket_rest_api/validations/required_spec.rb +43 -0
  113. data/spec/bitbucket_rest_api/validations/token_spec.rb +16 -0
  114. data/spec/bitbucket_rest_api_spec.rb +17 -0
  115. data/spec/spec_helper.rb +24 -0
  116. metadata +373 -0
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+
3
+ module BitBucket
4
+ module Error
5
+ class BitBucketError < StandardError
6
+ attr_reader :response_message, :response_headers
7
+
8
+ def initialize(message)
9
+ super message
10
+ @response_message = message
11
+ end
12
+
13
+ # def inspect
14
+ # %(#<#{self.class}>)
15
+ # end
16
+ end
17
+ end # Error
18
+ end # BitBucket
19
+
20
+ %w[
21
+ service_error
22
+ not_found
23
+ forbidden
24
+ bad_request
25
+ unauthorized
26
+ service_unavailable
27
+ internal_server_error
28
+ unprocessable_entity
29
+ client_error
30
+ invalid_options
31
+ required_params
32
+ unknown_value
33
+ bad_events
34
+ no_events
35
+ blank_value
36
+ ].each do |error|
37
+ require "bitbucket_rest_api/error/#{error}"
38
+ end
@@ -0,0 +1,9 @@
1
+ module BitBucket
2
+ module Error
3
+ class BadEvents < ClientError
4
+ def initialize(event)
5
+ super "The event: '#{event}', does not exist :("
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ module BitBucket
4
+ module Error
5
+ # Raised when BitBucket returns the HTTP status code 400
6
+ class BadRequest < ServiceError
7
+ def initialize(env)
8
+ super(env)
9
+ end
10
+ end
11
+ end
12
+ end # BitBucket
@@ -0,0 +1,9 @@
1
+ module BitBucket
2
+ module Error
3
+ class BlankValue < ClientError
4
+ def initialize(required_key)
5
+ super "The value for: '#{required_key}', cannot be blank :("
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+
3
+ module BitBucket #:nodoc
4
+ # Raised when BitBucket returns the HTTP status code 404
5
+ module Error
6
+ class ClientError < BitBucketError
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 # BitBucket
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ module BitBucket #:nodoc
4
+ # Raised when BitBucket returns the HTTP status code 403
5
+ module Error
6
+ class Forbidden < BitBucketError
7
+ def initialize(env)
8
+ super(env)
9
+ end
10
+ end
11
+ end # Error
12
+ end # BitBucket
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ module BitBucket #:nodoc
4
+ # Raised when BitBucket returns the HTTP status code 500
5
+ module Error
6
+ class InternalServerError < BitBucketError
7
+ def initialize(env)
8
+ super(env)
9
+ end
10
+ end
11
+ end # Error
12
+ end # BitBucket
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ module BitBucket #: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 => "BitBucket gem checks the request parameters passed to ensure that github 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 # BitBucket
@@ -0,0 +1,9 @@
1
+ module BitBucket
2
+ module Error
3
+ class NoEvents < ClientError
4
+ def initialize
5
+ super "At least one event is required, none given :("
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ module BitBucket #:nodoc
4
+ # Raised when BitBucket returns the HTTP status code 404
5
+ module Error
6
+ class NotFound < ServiceError
7
+ def initialize(env)
8
+ super(env)
9
+ end
10
+ end
11
+ end # Error
12
+ end # BitBucket
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ module BitBucket #: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 => "BitBucket gem checks the request parameters passed to ensure that github 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 # BitBucket
@@ -0,0 +1,19 @@
1
+ # encoding: utf-8
2
+
3
+ module BitBucket #:nodoc
4
+ # Raised when BitBucket returns any of the HTTP status codes
5
+ module Error
6
+ class ServiceError < BitBucketError
7
+ attr_accessor :http_headers
8
+
9
+ def initialize(env)
10
+ super(generate_message(env))
11
+ @http_headers = env[:response_headers]
12
+ end
13
+
14
+ def generate_message(env)
15
+ "#{env[:method].to_s.upcase} #{env[:url].to_s}: #{env[:status]} #{env[:body]}"
16
+ end
17
+ end
18
+ end # Error
19
+ end # BitBucket
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ module BitBucket #:nodoc
4
+ # Raised when BitBucket returns the HTTP status code 404
5
+ module Error
6
+ class ServiceUnavailable < BitBucketError
7
+ def initialize(env)
8
+ super(env)
9
+ end
10
+ end
11
+ end # Error
12
+ end # BitBucket
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ module BitBucket #:nodoc
4
+ # Raised when BitBucket returns the HTTP status code 401
5
+ module Error
6
+ class Unauthorized < BitBucketError
7
+ def initialize(env)
8
+ super(env)
9
+ end
10
+ end
11
+ end # Error
12
+ end # BitBucket
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ module BitBucket #: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 => "BitBucket gem checks the request parameters passed to ensure that github 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 # BitBucket
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ module BitBucket #:nodoc
4
+ # Raised when BitBucket returns the HTTP status code 422
5
+ module Error
6
+ class UnprocessableEntity < BitBucketError
7
+ def initialize(env)
8
+ super(env)
9
+ end
10
+ end
11
+ end # Error
12
+ end # BitBucket
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ module BitBucket #: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 => '',
11
+ :summary => '',
12
+ :resolution => ''
13
+ )
14
+ )
15
+ end
16
+ end
17
+ end # Error
18
+ end # BitBucket
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+
3
+ module BitBucket
4
+ class Invitations < API
5
+ def invite(user_name, repo_name, emailaddress, perm)
6
+ _update_user_repo_params(user_name, repo_name)
7
+ _validate_user_repo_params(user, repo) unless user? && repo?
8
+ _validate_presence_of emailaddress
9
+ perm ||= "write"
10
+
11
+ post_request("/2.0/invitations/#{user}/#{repo.downcase}/#{emailaddress}",
12
+ permission: perm)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,230 @@
1
+ # encoding: utf-8
2
+
3
+ module BitBucket
4
+ class Issues < API
5
+ extend AutoloadHelper
6
+
7
+ autoload_all 'bitbucket_rest_api/issues',
8
+ :Comments => 'comments',
9
+ :Components => 'components',
10
+ :Milestones => 'milestones'
11
+
12
+ VALID_ISSUE_PARAM_NAMES = %w[
13
+ title
14
+ content
15
+ component
16
+ milestone
17
+ version
18
+ responsible
19
+ priority
20
+ status
21
+ kind
22
+ limit
23
+ start
24
+ search
25
+ sort
26
+ reported_by
27
+ ].freeze
28
+
29
+ VALID_ISSUE_PARAM_VALUES = {
30
+ 'priority' => %w[ trivial minor major critical blocker ],
31
+ 'status' => ['new', 'open', 'resolved', 'on hold', 'invalid', 'duplicate', 'wontfix'],
32
+ 'kind' => %w[ bug enhancement proposal task ]
33
+ }
34
+
35
+ # Creates new Issues API
36
+ def initialize(options = { })
37
+ super(options)
38
+ end
39
+
40
+ # Access to Issues::Comments API
41
+ def comments
42
+ @comments ||= ApiFactory.new 'Issues::Comments'
43
+ end
44
+
45
+ # Access to Issues::Components API
46
+ def components
47
+ @components ||= ApiFactory.new 'Issues::Components'
48
+ end
49
+
50
+ # Access to Issues::Milestones API
51
+ def milestones
52
+ @milestones ||= ApiFactory.new 'Issues::Milestones'
53
+ end
54
+
55
+ # List issues for a repository
56
+ #
57
+ # = Inputs
58
+ # <tt>:limit</tt> - Optional - Number of issues to retrieve, default 15
59
+ # <tt>:start</tt> - Optional - Issue offset, default 0
60
+ # <tt>:search</tt> - Optional - A string to search for
61
+ # <tt>:sort</tt> - Optional - Sorts the output by any of the metadata fields
62
+ # <tt>:title</tt> - Optional - Contains a filter operation to restrict the list of issues by the issue title
63
+ # <tt>:content</tt> - Optional - Contains a filter operation to restrict the list of issues by the issue content
64
+ # <tt>:version</tt> - Optional - Contains an is or ! ( is not) filter to restrict the list of issues by the version
65
+ # <tt>:milestone</tt> - Optional - Contains an is or ! ( is not) filter to restrict the list of issues by the milestone
66
+ # <tt>:component</tt> - Optional - Contains an is or ! ( is not) filter to restrict the list of issues by the component
67
+ # <tt>:kind</tt> - Optional - Contains an is or ! ( is not) filter to restrict the list of issues by the issue kind
68
+ # <tt>:status</tt> - Optional - Contains an is or ! ( is not) filter to restrict the list of issues by the issue status
69
+ # <tt>:responsible</tt> - Optional - Contains an is or ! ( is not) filter to restrict the list of issues by the user responsible
70
+ # <tt>:reported_by</tt> - Optional - Contains a filter operation to restrict the list of issues by the user that reported the issue
71
+ #
72
+ # = Examples
73
+ # bitbucket = BitBucket.new :user => 'user-name', :repo => 'repo-name'
74
+ # bitbucket.issues.list_repo :filter => 'kind=bug&kind=enhancement'
75
+ #
76
+ def list_repo(user_name, repo_name, params={ })
77
+ _update_user_repo_params(user_name, repo_name)
78
+ _validate_user_repo_params(user, repo) unless user? && repo?
79
+
80
+ normalize! params
81
+ filter! VALID_ISSUE_PARAM_NAMES, params
82
+ # _merge_mime_type(:issue, params)
83
+ assert_valid_values(VALID_ISSUE_PARAM_VALUES, params)
84
+
85
+ response = get_request("/2.0/repositories/#{user}/#{repo.downcase}/issues", params)
86
+ return response.issues unless block_given?
87
+ response.issues.each { |el| yield el }
88
+ end
89
+
90
+ alias :list_repository :list_repo
91
+
92
+ # Get a single issue
93
+ #
94
+ # = Examples
95
+ # bitbucket = BitBucket.new
96
+ # bitbucket.issues.get 'user-name', 'repo-name', 'issue-id'
97
+ #
98
+ def get(user_name, repo_name, issue_id, params={ })
99
+ _update_user_repo_params(user_name, repo_name)
100
+ _validate_user_repo_params(user, repo) unless user? && repo?
101
+ _validate_presence_of issue_id
102
+
103
+ normalize! params
104
+ # _merge_mime_type(:issue, params)
105
+
106
+ get_request("/2.0/repositories/#{user}/#{repo.downcase}/issues/#{issue_id}", params)
107
+ end
108
+
109
+ alias :find :get
110
+
111
+ # Delete a single issue
112
+ #
113
+ # = Examples
114
+ # bitbucket = BitBucket.new
115
+ # bitbucket.issues.delete 'user-name', 'repo-name', 'issue-id'
116
+ #
117
+ def delete(user_name, repo_name, issue_id, params={ })
118
+ _update_user_repo_params(user_name, repo_name)
119
+ _validate_user_repo_params(user, repo) unless user? && repo?
120
+ _validate_presence_of issue_id
121
+
122
+ normalize! params
123
+ # _merge_mime_type(:issue, params)
124
+
125
+ delete_request("/2.0/repositories/#{user}/#{repo}/issues/#{issue_id}", params)
126
+ end
127
+
128
+ # Create an issue
129
+ #
130
+ # = Inputs
131
+ # <tt>:title</tt> - Required string
132
+ # <tt>:content</tt> - Optional string
133
+ # <tt>:responsible</tt> - Optional string - Login for the user that this issue should be assigned to.
134
+ # <tt>:milestone</tt> - Optional number - Milestone to associate this issue with
135
+ # <tt>:version</tt> - Optional number - Version to associate this issue with
136
+ # <tt>:component</tt> - Optional number - Component to associate this issue with
137
+ # <tt>:priority</tt> - Optional string - The priority of this issue
138
+ # * <tt>trivial</tt>
139
+ # * <tt>minor</tt>
140
+ # * <tt>major</tt>
141
+ # * <tt>critical</tt>
142
+ # * <tt>blocker</tt>
143
+ # <tt>:status</tt> - Optional string - The status of this issue
144
+ # * <tt>new</tt>
145
+ # * <tt>open</tt>
146
+ # * <tt>resolved</tt>
147
+ # * <tt>on hold</tt>
148
+ # * <tt>invalid</tt>
149
+ # * <tt>duplicate</tt>
150
+ # * <tt>wontfix</tt>
151
+ # <tt>:kind</tt> - Optional string - The kind of issue
152
+ # * <tt>bug</tt>
153
+ # * <tt>enhancement</tt>
154
+ # * <tt>proposal</tt>
155
+ # * <tt>task</tt>
156
+ #
157
+ # = Examples
158
+ # bitbucket = BitBucket.new :user => 'user-name', :repo => 'repo-name'
159
+ # bitbucket.issues.create
160
+ # "title" => "Found a bug",
161
+ # "content" => "I'm having a problem with this.",
162
+ # "responsible" => "octocat",
163
+ # "milestone" => 1,
164
+ # "priority" => "blocker"
165
+ #
166
+ def create(user_name, repo_name, params={ })
167
+ _update_user_repo_params(user_name, repo_name)
168
+ _validate_user_repo_params(user, repo) unless user? && repo?
169
+
170
+ normalize! params
171
+ _merge_user_into_params!(params) unless params.has_key?('user')
172
+ # _merge_mime_type(:issue, params)
173
+ filter! VALID_ISSUE_PARAM_NAMES, params
174
+ assert_required_keys(%w[ title ], params)
175
+
176
+ post_request("/2.0/repositories/#{user}/#{repo.downcase}/issues/", params)
177
+ end
178
+
179
+ # Edit an issue
180
+ #
181
+ # = Inputs
182
+ # <tt>:title</tt> - Required string
183
+ # <tt>:content</tt> - Optional string
184
+ # <tt>:responsible</tt> - Optional string - Login for the user that this issue should be assigned to.
185
+ # <tt>:milestone</tt> - Optional number - Milestone to associate this issue with
186
+ # <tt>:version</tt> - Optional number - Version to associate this issue with
187
+ # <tt>:component</tt> - Optional number - Component to associate this issue with
188
+ # <tt>:priority</tt> - Optional string - The priority of this issue
189
+ # * <tt>trivial</tt>
190
+ # * <tt>minor</tt>
191
+ # * <tt>major</tt>
192
+ # * <tt>critical</tt>
193
+ # * <tt>blocker</tt>
194
+ # <tt>:status</tt> - Optional string - The status of this issue
195
+ # * <tt>new</tt>
196
+ # * <tt>open</tt>
197
+ # * <tt>resolved</tt>
198
+ # * <tt>on hold</tt>
199
+ # * <tt>invalid</tt>
200
+ # * <tt>duplicate</tt>
201
+ # * <tt>wontfix</tt>
202
+ # <tt>:kind</tt> - Optional string - The kind of issue
203
+ # * <tt>bug</tt>
204
+ # * <tt>enhancement</tt>
205
+ # * <tt>proposal</tt>
206
+ # * <tt>task</tt>
207
+ #
208
+ # = Examples
209
+ # bitbucket = BitBucket.new :user => 'user-name', :repo => 'repo-name'
210
+ # bitbucket.issues.create
211
+ # "title" => "Found a bug",
212
+ # "content" => "I'm having a problem with this.",
213
+ # "responsible" => "octocat",
214
+ # "milestone" => 1,
215
+ # "priority" => "blocker"
216
+ #
217
+ def edit(user_name, repo_name, issue_id, params={ })
218
+ _update_user_repo_params(user_name, repo_name)
219
+ _validate_user_repo_params(user, repo) unless user? && repo?
220
+ _validate_presence_of issue_id
221
+
222
+ normalize! params
223
+ # _merge_mime_type(:issue, params)
224
+ filter! VALID_ISSUE_PARAM_NAMES, params
225
+
226
+ put_request("/2.0/repositories/#{user}/#{repo.downcase}/issues/#{issue_id}/", params)
227
+ end
228
+
229
+ end # Issues
230
+ end # BitBucket