gitlab_support_readiness 1.0.11 → 1.0.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/lib/support_readiness/calendly/client.rb +64 -0
  3. data/lib/support_readiness/calendly/configuration.rb +45 -0
  4. data/lib/support_readiness/calendly/organization_memberships.rb +67 -0
  5. data/lib/support_readiness/calendly/organizations.rb +123 -0
  6. data/lib/support_readiness/calendly/users.rb +105 -0
  7. data/lib/support_readiness/calendly.rb +16 -0
  8. data/lib/support_readiness/client.rb +88 -1
  9. data/lib/support_readiness/dates.rb +90 -0
  10. data/lib/support_readiness/gitlab/configuration.rb +0 -1
  11. data/lib/support_readiness/gitlab/groups.rb +35 -0
  12. data/lib/support_readiness/gitlab/jobs.rb +189 -0
  13. data/lib/support_readiness/gitlab/markdown.rb +37 -0
  14. data/lib/support_readiness/gitlab/merge_requests.rb +127 -0
  15. data/lib/support_readiness/gitlab/namespaces.rb +22 -0
  16. data/lib/support_readiness/gitlab/pipelines.rb +191 -0
  17. data/lib/support_readiness/gitlab/projects.rb +85 -1
  18. data/lib/support_readiness/gitlab/repositories.rb +174 -0
  19. data/lib/support_readiness/gitlab/users.rb +24 -0
  20. data/lib/support_readiness/gitlab.rb +4 -0
  21. data/lib/support_readiness/google_calendar/client.rb +59 -0
  22. data/lib/support_readiness/google_calendar/configuration.rb +39 -0
  23. data/lib/support_readiness/google_calendar/events.rb +169 -0
  24. data/lib/support_readiness/google_calendar.rb +14 -0
  25. data/lib/support_readiness/mailgun/bounces.rb +103 -0
  26. data/lib/support_readiness/mailgun/client.rb +65 -0
  27. data/lib/support_readiness/mailgun/configuration.rb +46 -0
  28. data/lib/support_readiness/mailgun/emails.rb +95 -0
  29. data/lib/support_readiness/mailgun.rb +15 -0
  30. data/lib/support_readiness/pagerduty/escalation_policies.rb +1 -1
  31. data/lib/support_readiness/pagerduty/schedules.rb +27 -3
  32. data/lib/support_readiness/pagerduty/services.rb +1 -1
  33. data/lib/support_readiness/pagerduty/users.rb +197 -0
  34. data/lib/support_readiness/pagerduty.rb +1 -0
  35. data/lib/support_readiness/repos/articles.rb +335 -0
  36. data/lib/support_readiness/repos/automations.rb +247 -0
  37. data/lib/support_readiness/repos/groups.rb +188 -0
  38. data/lib/support_readiness/repos/macros.rb +224 -0
  39. data/lib/support_readiness/repos/organization_fields.rb +193 -0
  40. data/lib/support_readiness/repos/sla_policies.rb +192 -0
  41. data/lib/support_readiness/repos/ticket_fields.rb +200 -0
  42. data/lib/support_readiness/repos/ticket_forms.rb +200 -0
  43. data/lib/support_readiness/repos/triggers.rb +255 -0
  44. data/lib/support_readiness/repos/user_fields.rb +201 -0
  45. data/lib/support_readiness/repos/views.rb +362 -0
  46. data/lib/support_readiness/repos.rb +22 -0
  47. data/lib/support_readiness/salesforce/accounts.rb +109 -0
  48. data/lib/support_readiness/salesforce/cases.rb +109 -0
  49. data/lib/support_readiness/salesforce/client.rb +64 -0
  50. data/lib/support_readiness/salesforce/configuration.rb +49 -0
  51. data/lib/support_readiness/salesforce/queries.rb +62 -0
  52. data/lib/support_readiness/salesforce.rb +16 -0
  53. data/lib/support_readiness/slack/client.rb +63 -0
  54. data/lib/support_readiness/slack/configuration.rb +43 -0
  55. data/lib/support_readiness/slack/messages.rb +37 -0
  56. data/lib/support_readiness/slack.rb +14 -0
  57. data/lib/support_readiness/zendesk/app_job_statuses.rb +140 -0
  58. data/lib/support_readiness/zendesk/apps.rb +209 -0
  59. data/lib/support_readiness/zendesk/automations.rb +1 -2
  60. data/lib/support_readiness/zendesk/macros.rb +1 -3
  61. data/lib/support_readiness/zendesk/organization_fields.rb +1 -1
  62. data/lib/support_readiness/zendesk/theme_job_statuses.rb +136 -0
  63. data/lib/support_readiness/zendesk/themes.rb +303 -0
  64. data/lib/support_readiness/zendesk/ticket_field_options.rb +110 -0
  65. data/lib/support_readiness/zendesk/ticket_fields.rb +85 -16
  66. data/lib/support_readiness/zendesk/ticket_forms.rb +65 -2
  67. data/lib/support_readiness/zendesk/tickets.rb +77 -0
  68. data/lib/support_readiness/zendesk/triggers.rb +1 -2
  69. data/lib/support_readiness/zendesk/user_field_options.rb +110 -0
  70. data/lib/support_readiness/zendesk/user_fields.rb +257 -0
  71. data/lib/support_readiness/zendesk/views.rb +49 -2
  72. data/lib/support_readiness/zendesk.rb +7 -0
  73. data/lib/support_readiness.rb +16 -0
  74. metadata +122 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7b80e496307fbfaa496e95ca2af86a765ec8264d08cd70c5dde730305c597d2e
4
- data.tar.gz: 0c1b9bf16c261245a4c8d8928d581bfe08d7b8e5dde42cee7fc55129233b42c4
3
+ metadata.gz: 8ea6f1d80c924ce2c4c9f4cb929873f6244376d783f507b71f42c2abc39a4943
4
+ data.tar.gz: 1f1902a265ada7bac8aad9b3183f068fb80cf7e0f841e92b9ef408ccc7cdef30
5
5
  SHA512:
6
- metadata.gz: 9d38234f4a29dc2965e3544eb4e8f75830992cde999619b655ea1941c63255e1debb8aacccc841d92ecf6580a8ea2faf2d2c7edfbb9064df40fa5cd88c333977
7
- data.tar.gz: 7419e41c9dbbe22058e0e567dc79b26c5408b3d4766e9d618dc3dfbd494f6b6619cf1d6a312c14dbd2df852c230098b75cbb76161c0f03b586638505e20a107d
6
+ metadata.gz: 6d8e2f831f94c90507f758dd744c4e8e84f4a7eb0041a763059b7a212d8a2e5a892a5f62ff692312a710c17b018ddc811be533dbdfb1c9a147779210e9327aac
7
+ data.tar.gz: 893eab1474c5eecdfcf18aa18cf6c6426e05e43e0ed8781f6dcf9107fecbc301277547f7b4aafe2f00bb02fa673135f72e0df0cdcd0df4c6ff03337236ab626d
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Defines the module Readiness.
4
+ module Readiness
5
+ # Defines the module Calendly
6
+ module Calendly
7
+ ##
8
+ # Defines the class Client within the module {Readiness::Calendly}.
9
+ #
10
+ # @author Jason Colyer
11
+ # @since 1.0.12
12
+ class Client
13
+ attr_reader :connection
14
+
15
+ ##
16
+ # Creates a new {Readiness::Calendly::Client} instance
17
+ #
18
+ # @author Jason Colyer
19
+ # @since 1.0.12
20
+ # @param config [Object] An instance of {Readiness::Calendly::Configuration}
21
+ # @example
22
+ # require 'support_readiness'
23
+ # config = Readiness::GitLab::Configuration.new
24
+ # config.token = 'test123abc'
25
+ # client = Readiness::GitLab::Client.new(config)
26
+ def initialize(config = Readiness::Calendly::Configuration.new)
27
+ @connection = generate_connection(config)
28
+ end
29
+
30
+ ##
31
+ # Used to generate the retry options passed to Faraday via faraday-retry
32
+ #
33
+ # @author Jason Colyer
34
+ # @since 1.0.12
35
+ # @param config [Object] An instance of {Readiness::Calendly::Configuration}
36
+ # @return [Hash]
37
+ def retry_options(config)
38
+ {
39
+ max: config.retry_max,
40
+ interval: config.retry_interval,
41
+ interval_randomness: config.retry_randomness,
42
+ backoff_factor: config.retry_backoff,
43
+ exceptions: config.retry_exceptions
44
+ }
45
+ end
46
+
47
+ ##
48
+ # Used to generate a Faraday connection
49
+ #
50
+ # @author Jason Colyer
51
+ # @since 1.0.0
52
+ # @param config [Object] An instance of {Readiness::Calendly::Configuration}
53
+ # @return [Object]
54
+ def generate_connection(config)
55
+ Faraday.new(config.url) do |c|
56
+ c.request :retry, retry_options(config)
57
+ c.adapter Faraday.default_adapter
58
+ c.headers['Content-Type'] = 'application/json'
59
+ c.headers['Authorization'] = "Bearer #{config.token}"
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Defines the module Readiness.
4
+ module Readiness
5
+ # Defines the module Calendly
6
+ module Calendly
7
+ ##
8
+ # Defines the class Configuration within the module {Readiness::Calendly}.
9
+ #
10
+ # @author Jason Colyer
11
+ # @since 1.0.12
12
+ class Configuration
13
+ attr_accessor :url, :token, :retry_options, :retry_max, :retry_interval, :retry_randomness, :retry_backoff, :retry_exceptions
14
+
15
+ ##
16
+ # Creates a new {Readiness::Calendly::Configuration} instance
17
+ #
18
+ # @author Jason Colyer
19
+ # @since 1.0.12
20
+ # @example
21
+ # require 'support_readiness'
22
+ # config = Readiness::Calendly::Configuration.new
23
+ # config.token = 'test123abc'
24
+ # pp config
25
+ # # => #<Readiness::Calendly::Configuration:0x00007f352fdd1420
26
+ # @retry_backoff=2,
27
+ # @retry_exceptions=
28
+ # [Errno::ETIMEDOUT, "Timeout::Error", Faraday::TimeoutError, Faraday::RetriableResponse, Faraday::ConnectionFailed],
29
+ # @retry_interval=1,
30
+ # @retry_max=5,
31
+ # @retry_randomness=0.5,
32
+ # @token="test123abc",
33
+ # @url="https://api.calendly.com">
34
+ def initialize
35
+ @url = 'https://api.calendly.com'
36
+ @token = ''
37
+ @retry_max = 5
38
+ @retry_interval = 1
39
+ @retry_randomness = 0.5
40
+ @retry_backoff = 2
41
+ @retry_exceptions = Faraday::Retry::Middleware::DEFAULT_EXCEPTIONS + [Faraday::ConnectionFailed]
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Defines the module Readiness.
4
+ module Readiness
5
+ # Defines the module Calendly
6
+ module Calendly
7
+ ##
8
+ # Defines the class OrganizationMemberships within the module {Readiness::Calendly}.
9
+ #
10
+ # @author Jason Colyer
11
+ # @since 1.0.12
12
+ class OrganizationMemberships < Readiness::Client
13
+ attr_accessor :created_at, :organization, :role, :updated_at, :uri, :user
14
+
15
+ ##
16
+ # Creates a new {Readiness::Calendly::OrganizationMemberships} instance
17
+ #
18
+ # @author Jason Colyer
19
+ # @since 1.0.12
20
+ # @param object [Object] An instance of {Readiness::Calendly::OrganizationMemberships}
21
+ # @example
22
+ # require 'support_readiness'
23
+ # Readiness::Calendly::OrganizationMemberships.new
24
+ def initialize(object = {})
25
+ @created_at = object['created_at']
26
+ @organization = object['organization']
27
+ @role = object['role']
28
+ @updated_at = object['updated_at']
29
+ @uri = object['uri']
30
+ @user = (object['user'].nil? ? Users.new : Users.new(object['user']))
31
+ end
32
+
33
+ ##
34
+ # Provides a list of organization memberships.
35
+ #
36
+ # @author Jason Colyer
37
+ # @since 1.0.12
38
+ # @param client [Object] An instance of {Readiness::Calendly::Client}
39
+ # @param organization [String] An instance of {Readiness::Calendly::Organizations}
40
+ # @return [Array]
41
+ # @see https://developer.calendly.com/api-docs/eaed2e61a6bc3-list-organization-memberships Calendly API > Organizations > List Organization Memberships
42
+ # @example
43
+ # require 'support_readiness'
44
+ # config = Readiness::Calendly::Configuration.new
45
+ # config.token = 'test123abc'
46
+ # client = Readiness::Calendly::Client.new(config)
47
+ # org = Readiness::Calendly::Organizations.find!(client, 'abc123')
48
+ # members = Readiness::Calendly::Organizations.members(client, org)
49
+ # pp members.first.name
50
+ # # => "Jason Colyer"
51
+ def self.list(client, organization)
52
+ members = []
53
+ opts = { organization: organization.uri, count: 100 }
54
+ loop do
55
+ response = client.connection.get "organization_memberships", opts
56
+ handle_request_error(0, 'Calendly', response.status, { action: 'get', id: organization.uri.split('/').last }) unless response.status == 200
57
+ body = Oj.load(response.body)
58
+ members += body['collection'].map { |c| OrganizationMemberships.new(c) }
59
+ break if body['pagination']['next_page_token'].nil?
60
+
61
+ opts = { organization: organization.uri, count: 100, page_token: body['pagination']['next_page_token'] }
62
+ end
63
+ members
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Defines the module Readiness.
4
+ module Readiness
5
+ # Defines the module Calendly
6
+ module Calendly
7
+ ##
8
+ # Defines the class Organizations within the module {Readiness::Calendly}.
9
+ #
10
+ # @author Jason Colyer
11
+ # @since 1.0.12
12
+ class Organizations < Readiness::Client
13
+ attr_accessor :created_at, :name, :plan, :stage, :updated_at, :uri
14
+
15
+ ##
16
+ # Creates a new {Readiness::Calendly::Organizations} instance
17
+ #
18
+ # @author Jason Colyer
19
+ # @since 1.0.12
20
+ # @param object [Object] An instance of {Readiness::Calendly::Organizations}
21
+ # @example
22
+ # require 'support_readiness'
23
+ # Readiness::Calendly::Organizations.new
24
+ def initialize(object = {})
25
+ @created_at = object['created_at']
26
+ @name = object['name']
27
+ @plan = object['plan']
28
+ @stage = object['stage']
29
+ @updated_at = object['updated_at']
30
+ @uri = object['uri']
31
+ end
32
+
33
+ ##
34
+ # Returns the current user's organization within Calendly.
35
+ #
36
+ # @author Jason Colyer
37
+ # @since 1.0.12
38
+ # @param client [Object] An instance of {Readiness::Calendly::Client}
39
+ # @return [Object] An instance of {Readiness::Calendly::Organizations}
40
+ # @see https://developer.calendly.com/api-docs/848e5e20591ee-organization Calendly API > Organizations > Organization
41
+ # @example
42
+ # require 'support_readiness'
43
+ # config = Readiness::Calendly::Configuration.new
44
+ # config.token = 'test123abc'
45
+ # client = Readiness::Calendly::Client.new(config)
46
+ # org = Readiness::Calendly::Organizations.current(client)
47
+ # pp org.name
48
+ # # => "GitLab Support"
49
+ def self.current(client)
50
+ user = Users.current(client)
51
+ Organizations.find(client, user.current_organization.split('/').last)
52
+ end
53
+
54
+ ##
55
+ # Locates an organization within Calendly. This will not exit on error (except Authentication errors)
56
+ #
57
+ # @author Jason Colyer
58
+ # @since 1.0.12
59
+ # @param client [Object] An instance of {Readiness::Calendly::Client}
60
+ # @param oid [String] The organization ID to find
61
+ # @return [Object] An instance of {Readiness::Calendly::Organizations}
62
+ # @see https://developer.calendly.com/api-docs/848e5e20591ee-organization Calendly API > Organizations > Organization
63
+ # @example
64
+ # require 'support_readiness'
65
+ # config = Readiness::Calendly::Configuration.new
66
+ # config.token = 'test123abc'
67
+ # client = Readiness::Calendly::Client.new(config)
68
+ # org = Readiness::Calendly::Organizations.find(client, 'abc123')
69
+ # pp org.name
70
+ # # => "GitLab Support"
71
+ def self.find(client, oid)
72
+ response = client.connection.get "organizations/#{oid}"
73
+ handle_request_error(0, 'Calendly', response.status, { action: 'get', id: oid }) unless response.status == 200
74
+ Organizations.new(Oj.load(response.body)['resource'])
75
+ end
76
+
77
+ ##
78
+ # Locates an organization within Calendly. This will exit on error
79
+ #
80
+ # @author Jason Colyer
81
+ # @since 1.0.12
82
+ # @param client [Object] An instance of {Readiness::Calendly::Client}
83
+ # @param oid [String] The organization ID to find
84
+ # @return [Object] An instance of {Readiness::Calendly::Organizations}
85
+ # @see https://developer.calendly.com/api-docs/848e5e20591ee-organization Calendly API > Organizations > Organization
86
+ # @example
87
+ # require 'support_readiness'
88
+ # config = Readiness::Calendly::Configuration.new
89
+ # config.token = 'test123abc'
90
+ # client = Readiness::Calendly::Client.new(config)
91
+ # org = Readiness::Calendly::Organizations.find!(client, 'abc123')
92
+ # pp org.name
93
+ # # => "GitLab Support"
94
+ def self.find!(client, oid)
95
+ response = client.connection.get "organizations/#{oid}"
96
+ handle_request_error(1, 'Calendly', response.status, { action: 'Find organization', id: oid }) unless response.status == 200
97
+ Organizations.new(Oj.load(response.body)['resource'])
98
+ end
99
+
100
+ ##
101
+ # Provides a list of organization memberships. A wrapper for {OrganizationMemberships#list}
102
+ #
103
+ # @author Jason Colyer
104
+ # @since 1.0.12
105
+ # @param client [Object] An instance of {Readiness::Calendly::Client}
106
+ # @param organization [String] An instance of {Readiness::Calendly::Organizations}
107
+ # @return [Array]
108
+ # @see https://developer.calendly.com/api-docs/eaed2e61a6bc3-list-organization-memberships Calendly API > Organizations > List Organization Memberships
109
+ # @example
110
+ # require 'support_readiness'
111
+ # config = Readiness::Calendly::Configuration.new
112
+ # config.token = 'test123abc'
113
+ # client = Readiness::Calendly::Client.new(config)
114
+ # org = Readiness::Calendly::Organizations.find!(client, 'abc123')
115
+ # members = Readiness::Calendly::Organizations.members(client, org)
116
+ # pp members.first.name
117
+ # # => "Jason Colyer"
118
+ def self.members(client, organization)
119
+ Readiness::Calendly::OrganizationMemberships.list(client, organization)
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Defines the module Readiness.
4
+ module Readiness
5
+ # Defines the module Calendly
6
+ module Calendly
7
+ ##
8
+ # Defines the class Users within the module {Readiness::Calendly}.
9
+ #
10
+ # @author Jason Colyer
11
+ # @since 1.0.12
12
+ class Users < Readiness::Client
13
+ attr_accessor :avatar_url, :created_at, :current_organization, :email, :name, :resource_type, :scheduling_url, :slug, :timezone, :updated_at, :uri
14
+
15
+ ##
16
+ # Creates a new {Readiness::Calendly::Users} instance
17
+ #
18
+ # @author Jason Colyer
19
+ # @since 1.0.12
20
+ # @param object [Object] An instance of {Readiness::Calendly::Users}
21
+ # @example
22
+ # require 'support_readiness'
23
+ # Readiness::Calendly::Users.new
24
+ def initialize(object = {})
25
+ @avatar_url = object['avatar_url']
26
+ @created_at = object['created_at']
27
+ @current_organization = object['current_organization']
28
+ @email = object['email']
29
+ @name = object['name']
30
+ @resource_type = object['resource_type']
31
+ @scheduling_url = object['scheduling_url']
32
+ @slug = object['slug']
33
+ @timezone = object['timezone']
34
+ @updated_at = object['updated_at']
35
+ @uri = object['uri']
36
+ end
37
+
38
+ ##
39
+ # Gets information on the current user
40
+ #
41
+ # @author Jason Colyer
42
+ # @since 1.0.12
43
+ # @param client [Object] An instance of {Readiness::Calendly::Client}
44
+ # @example
45
+ # require 'support_readiness'
46
+ # config = Readiness::Calendly::Configuration.new
47
+ # config.token = 'abc123'
48
+ # client = Readiness::Calendly::Client.new(config)
49
+ # user = Readiness::Calendly::Users.current(client)
50
+ # pp user.name
51
+ # # => "John Doe"
52
+ def self.current(client)
53
+ response = client.connection.get 'users/me'
54
+ handle_request_error(0, 'Calendly', response.status) unless response.status == 200
55
+ Users.new(Oj.load(response.body)['resource'])
56
+ end
57
+
58
+ ##
59
+ # Locates an user within Calendly. This will not exit on error (except Authentication errors)
60
+ #
61
+ # @author Jason Colyer
62
+ # @since 1.0.12
63
+ # @param client [Object] An instance of {Readiness::Calendly::Client}
64
+ # @param uid [String] The user ID to find
65
+ # @return [Object] An instance of {Readiness::Calendly::Users}
66
+ # @see https://developer.calendly.com/api-docs/ff9832c5a6640-get-user Calendly API > Users > Get user
67
+ # @example
68
+ # require 'support_readiness'
69
+ # config = Readiness::Calendly::Configuration.new
70
+ # config.token = 'test123abc'
71
+ # client = Readiness::Calendly::Client.new(config)
72
+ # user = Readiness::Calendly::Users.find(client, 'abc123')
73
+ # pp user.name
74
+ # # => "Jason Colyer"
75
+ def self.find(client, uid)
76
+ response = client.connection.get "users/#{uid}"
77
+ handle_request_error(0, 'Calendly', response.status, { action: 'get', id: uid }) unless response.status == 200
78
+ Users.new(Oj.load(response.body)['resource'])
79
+ end
80
+
81
+ ##
82
+ # Locates an user within Calendly. This will exit on error
83
+ #
84
+ # @author Jason Colyer
85
+ # @since 1.0.12
86
+ # @param client [Object] An instance of {Readiness::Calendly::Client}
87
+ # @param uid [String] The user ID to find
88
+ # @return [Object] An instance of {Readiness::Calendly::Users}
89
+ # @see https://developer.calendly.com/api-docs/ff9832c5a6640-get-user Calendly API > Users > Get user
90
+ # @example
91
+ # require 'support_readiness'
92
+ # config = Readiness::Calendly::Configuration.new
93
+ # config.token = 'test123abc'
94
+ # client = Readiness::Calendly::Client.new(config)
95
+ # user = Readiness::Calendly::Users.find!(client, 'abc123')
96
+ # pp user.name
97
+ # # => "Jason Colyer"
98
+ def self.find!(client, uid)
99
+ response = client.connection.get "users/#{uid}"
100
+ handle_request_error(1, 'Calendly', response.status, { action: 'Find user', id: uid }) unless response.status == 200
101
+ Users.new(Oj.load(response.body)['resource'])
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Defines the module Readiness.
4
+ module Readiness
5
+ ##
6
+ # Defines the module Calendly
7
+ # @author Jason Colyer
8
+ # @since 1.0.12
9
+ module Calendly
10
+ require "#{__dir__}/calendly/client"
11
+ require "#{__dir__}/calendly/configuration"
12
+ require "#{__dir__}/calendly/users"
13
+ require "#{__dir__}/calendly/organization_memberships"
14
+ require "#{__dir__}/calendly/organizations"
15
+ end
16
+ end
@@ -127,7 +127,7 @@ module Readiness
127
127
  # @param system [String] The system the error occurred on
128
128
  # @param params [Hash] A Hash of information about the request
129
129
  def self.bad_request_error(system, params)
130
- puts "Action '#{params[:action]}' to ID #{params[:id]} on #{system} returned a 404 error"
130
+ puts "Action '#{params[:action]}' to ID #{params[:id]} on #{system} returned a 400 error"
131
131
  exit 1
132
132
  end
133
133
 
@@ -143,5 +143,92 @@ module Readiness
143
143
  pp params[:message]
144
144
  exit 1
145
145
  end
146
+
147
+ ##
148
+ # Generates a Time String to be used in zip file generation
149
+ #
150
+ # @author Jason Colyer
151
+ # @since 1.0.12
152
+ def self.timestamp_filename
153
+ @name ||= Time.now.strftime('%Y%m%d%H%M%S%L')
154
+ end
155
+
156
+ ##
157
+ # Generates a Time String to be used in zip file generation
158
+ #
159
+ # @author Jason Colyer
160
+ # @since 1.0.12
161
+ # @param item_list [Array] An Array of items to zip
162
+ # @return [String] The path to the zip file
163
+ def self.create_package!(item_list, input_dir = './')
164
+ @output_file = "data/#{timestamp_filename}.zip"
165
+ @input_dir = input_dir
166
+ Zip::File.open(@output_file, create: true) do |zipfile|
167
+ write_entries item_list, '', zipfile
168
+ end
169
+ @output_file
170
+ end
171
+
172
+ ##
173
+ # Writes entries to a zip file
174
+ #
175
+ # @author Jason Colyer
176
+ # @since 1.0.12
177
+ # @param items [Array] An Array of items to zip
178
+ # @param path [String] The path to the items
179
+ # @param zipfile [Object] The Zip object
180
+ def self.write_entries(items, path, zipfile)
181
+ items.each do |i|
182
+ zipfile_path = path == '' ? i : File.join(path, i)
183
+ disk_file_path = File.join(@input_dir, zipfile_path)
184
+ if File.directory? disk_file_path
185
+ recursively_deflate_directory(disk_file_path, zipfile, zipfile_path)
186
+ else
187
+ put_into_archive(disk_file_path, zipfile, zipfile_path)
188
+ end
189
+ end
190
+ end
191
+
192
+ ##
193
+ # Recusrively zips a folder
194
+ #
195
+ # @author Jason Colyer
196
+ # @since 1.0.12
197
+ # @param disk_file_path [String] The path to the folder
198
+ # @param zipfile [Object] The Zip object
199
+ # @param zipfile_path [String] The path to the folder within the zip file
200
+ def self.recursively_deflate_directory(disk_file_path, zipfile, zipfile_path)
201
+ zipfile.mkdir zipfile_path
202
+ subdir = Dir.entries(disk_file_path) - %w[. ..]
203
+ write_entries subdir, zipfile_path, zipfile
204
+ end
205
+
206
+ ##
207
+ # Adds an item to the zip file
208
+ #
209
+ # @author Jason Colyer
210
+ # @since 1.0.12
211
+ # @param disk_file_path [String] The path to the folder
212
+ # @param zipfile [Object] The Zip object
213
+ # @param zipfile_path [String] The path to the folder within the zip file
214
+ def self.put_into_archive(disk_file_path, zipfile, zipfile_path)
215
+ zipfile.add(zipfile_path, disk_file_path)
216
+ end
217
+
218
+ ##
219
+ # Generate an ERB renderer for a specific file
220
+ #
221
+ # @author Jason Colyer
222
+ # @since 1.0.12
223
+ # @param file [String] The path (relative or absolute) to the file to render
224
+ # @example
225
+ # require 'support_readiness'
226
+ # renderer = Readiness::Client.erb_renderer('temp.erb')
227
+ # body = renderer.result_with_hash(name: 'Jason')
228
+ # pp body
229
+ # # => "\n" + "Hello Jason!\n"
230
+ def self.erb_renderer(file)
231
+ ERB.new(File.read(file))
232
+ end
146
233
  end
147
234
  end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Defines the module Readiness.
4
+ module Readiness
5
+ ##
6
+ # Defines the class Dates within the module {Readiness}.
7
+ #
8
+ # @author Jason Colyer
9
+ # @since 1.0.12
10
+ class Dates
11
+ ##
12
+ # Return the current GitLab quarter as of the current date in format "FY##Q#"
13
+ #
14
+ # @return [String]
15
+ # @example
16
+ # require 'support_readiness'
17
+ # pp Readiness::Dates.current_quarter
18
+ # # => "FY25Q3"
19
+ def self.current_quarter
20
+ determine_quarter(Time.now)
21
+ end
22
+
23
+ ##
24
+ # Return the next GitLab quarter in format "FY##Q#". Defaults to assuming you mean for the current date
25
+ #
26
+ # @param date [Various] The date to reference. Can take a String, Date, DateTime, or Time object
27
+ # @return [String]
28
+ # @example
29
+ # require 'support_readiness'
30
+ # pp Readiness::Dates.next_quarter
31
+ # # => "FY25Q4"
32
+ def self.next_quarter(date = Time.now)
33
+ current = determine_quarter(date)
34
+ year = current.split('Q').first.split('FY').last.to_i
35
+ quarter = current.split('Q').last.to_i
36
+ if quarter == 4
37
+ "FY#{year + 1}Q1"
38
+ else
39
+ "FY#{year}Q#{quarter + 1}"
40
+ end
41
+ end
42
+
43
+ ##
44
+ # Return the previous GitLab quarter in format "FY##Q#". Defaults to assuming you mean for the current date
45
+ #
46
+ # @param date [Various] The date to reference. Can take a String, Date, DateTime, or Time object
47
+ # @return [String]
48
+ # @example
49
+ # require 'support_readiness'
50
+ # pp Readiness::Dates.next_quarter
51
+ # # => "FY25Q4"
52
+ def self.previous_quarter(date = Time.now)
53
+ current = determine_quarter(date)
54
+ year = current.split('Q').first.split('FY').last.to_i
55
+ quarter = current.split('Q').last.to_i
56
+ if quarter == 1
57
+ "FY#{year - 1}Q4"
58
+ else
59
+ "FY#{year}Q#{quarter - 1}"
60
+ end
61
+ end
62
+
63
+ ##
64
+ # Returns the GitLab quarter in format "FY##Q#" from a give date
65
+ #
66
+ # @param date [Various] The date to reference. Can take a String, Date, DateTime, or Time object
67
+ # @return [String]
68
+ # @example
69
+ # require 'support_readiness'
70
+ # pp Readiness::Dates.next_quarter
71
+ # # => "FY25Q4"
72
+ def self.determine_quarter(date)
73
+ date = Time.parse(date) unless [DateTime, Date, Time].include? date.class
74
+ month = date.month
75
+ year = date.year.digits(100).first
76
+ case month
77
+ when 1
78
+ "FY#{year}Q4"
79
+ when 2..4
80
+ "FY#{year + 1}Q1"
81
+ when 5..7
82
+ "FY#{year + 1}Q2"
83
+ when 8..10
84
+ "FY#{year + 1}Q3"
85
+ when 11..12
86
+ "FY#{year + 1}Q4"
87
+ end
88
+ end
89
+ end
90
+ end
@@ -31,7 +31,6 @@ module Readiness
31
31
  # @retry_randomness=0.5,
32
32
  # @token="test123abc",
33
33
  # @url="https://gitlab.com/api/v4">
34
-
35
34
  def initialize
36
35
  @url = 'https://gitlab.com/api/v4'
37
36
  @token = ''
@@ -175,6 +175,41 @@ module Readiness
175
175
  end
176
176
  array
177
177
  end
178
+
179
+ ##
180
+ # Lists all milestones in a group.
181
+ # This method can take a long time to run depending on the parameters used.
182
+ #
183
+ # @author Jason Colyer
184
+ # @since 1.0.12
185
+ # @param client [Object] An instance of {Readiness::GitLab::Client}
186
+ # @param group [Object] An instance of {Readiness::GitLab::Groups}
187
+ # @param filters [Array] An array of filter Strings to use. Should be in the format of key=value
188
+ # @return [Array]
189
+ # @see https://docs.gitlab.com/ee/api/group_milestones.html#list-group-milestones GitLab API > Groups > Milestones > List group milestones
190
+ # @example
191
+ # require 'support_readiness'
192
+ # config = Readiness::GitLab::Configuration.new
193
+ # config.token = 'test123abc'
194
+ # client = Readiness::GitLab::Client.new(config)
195
+ # group = Readiness::GitLab::Groups.find!(client, 1083469)
196
+ # milestones = Readiness::GitLab::Groups.milestones(client, project)
197
+ # pp milestones.count
198
+ # # => 25
199
+ def self.milestones(client, group, filters = [])
200
+ array = []
201
+ page = 0
202
+ loop do
203
+ response = client.connection.get "groups/#{group.id}/milestones?per_page=100&page=#{page}&#{to_param_string(filters)}"
204
+ handle_request_error(0, 'GitLab', response.status) unless response.status == 200
205
+ body = Oj.load(response.body)
206
+ array += body
207
+ break if body.count < 100
208
+
209
+ page += 1
210
+ end
211
+ array
212
+ end
178
213
  end
179
214
  end
180
215
  end