opsgenie-schedule 0.1.0 → 0.1.1
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.
- checksums.yaml +4 -4
- data/Gemfile.lock +4 -4
- data/README.md +62 -2
- data/lib/opsgenie.rb +3 -0
- data/lib/opsgenie/rotation.rb +11 -1
- data/lib/opsgenie/schedule.rb +29 -2
- data/lib/opsgenie/timeline_period.rb +10 -0
- data/lib/opsgenie/timeline_rotation.rb +11 -0
- data/lib/opsgenie/user.rb +35 -0
- data/opsgenie-schedule.gemspec +1 -1
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 30a5116e9d7df158ef1d36af1d2ef9161649ad9daf2f595b9f2baae6024752ac
|
4
|
+
data.tar.gz: fa55ef6189912822f61e5c89a8d3d0277898fadb4e24bdab10f1919477716a7e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 59feea9672af23f41393fd19c8f214df82167d289205534ff21eae7bb60ce565da504480816124849408eec2b94e42f26062f5fd7e7f6fcf630af64cc1d8fe66
|
7
|
+
data.tar.gz: 2b4133e8e963682a795e4044d79b41334d6892423ef710a82e0cae450cf7368113f251f7b042260dc6e50aa9c893e0d64fda59705304aaf2fe2d38f35137abfd
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
opsgenie-schedule (0.1.
|
4
|
+
opsgenie-schedule (0.1.1)
|
5
5
|
httparty (~> 0.17)
|
6
6
|
|
7
7
|
GEM
|
@@ -16,12 +16,12 @@ GEM
|
|
16
16
|
diff-lcs (1.3)
|
17
17
|
dotenv (2.7.5)
|
18
18
|
hashdiff (1.0.0)
|
19
|
-
httparty (0.
|
19
|
+
httparty (0.18.0)
|
20
20
|
mime-types (~> 3.0)
|
21
21
|
multi_xml (>= 0.5.2)
|
22
22
|
jaro_winkler (1.5.3)
|
23
23
|
method_source (0.9.2)
|
24
|
-
mime-types (3.3)
|
24
|
+
mime-types (3.3.1)
|
25
25
|
mime-types-data (~> 3.2015)
|
26
26
|
mime-types-data (3.2019.1009)
|
27
27
|
multi_xml (0.6.0)
|
@@ -81,4 +81,4 @@ DEPENDENCIES
|
|
81
81
|
webmock (~> 3.5)
|
82
82
|
|
83
83
|
BUNDLED WITH
|
84
|
-
2.
|
84
|
+
2.1.4
|
data/README.md
CHANGED
@@ -50,7 +50,10 @@ You can then fetch the people scheduled for today like so:
|
|
50
50
|
|
51
51
|
```ruby
|
52
52
|
schedule.on_calls
|
53
|
-
#=> [
|
53
|
+
#=> [
|
54
|
+
# <Opsgenie::User @full_name="Someone", @id=1234, @username="someone@example.com">,
|
55
|
+
# <Opsgenie::User @full_name="Someone Else", @id=1236, @username="somesomeone-elseone@example.com">
|
56
|
+
#]
|
54
57
|
```
|
55
58
|
|
56
59
|
Or a given date time like so:
|
@@ -58,7 +61,64 @@ Or a given date time like so:
|
|
58
61
|
```ruby
|
59
62
|
date = DateTime.parse("2019-01-01T10:00:00")
|
60
63
|
schedule.on_calls(date)
|
61
|
-
#=> [
|
64
|
+
#=> [
|
65
|
+
# <Opsgenie::User @full_name="Someone", @id=1234, @username="someone@example.com">,
|
66
|
+
# <Opsgenie::User @full_name="Someone Else", @id=1236, @username="somesomeone-elseone@example.com">
|
67
|
+
#]
|
68
|
+
```
|
69
|
+
|
70
|
+
You can also fetch a timeline for a schedule:
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
schedule.timeline
|
74
|
+
```
|
75
|
+
|
76
|
+
Or a specific rotation:
|
77
|
+
|
78
|
+
```ruby
|
79
|
+
schedule.rotation[0].timeline
|
80
|
+
```
|
81
|
+
|
82
|
+
You can also specify where you want a timeline to start from:
|
83
|
+
|
84
|
+
```ruby
|
85
|
+
schedule.timeline(date: Date.parse("2019-01-01"))
|
86
|
+
# => [#<Opsgenie::TimelineRotation:0x00007f9b2f974cb8
|
87
|
+
# @id="69e7d46d-538e-4fca-95d0-5c316a54424e",
|
88
|
+
# @name="On Call Phone",
|
89
|
+
# @periods=
|
90
|
+
# [#<Opsgenie::TimelinePeriod:0x00007f9b2f974c40
|
91
|
+
# @end_date=#<DateTime: 2019-12-05T11:55:29+00:00 ((2458823j,42929s,816000000n),+0s,2299161j)>,
|
92
|
+
# @start_date=#<DateTime: 2019-12-02T00:00:00+00:00 ((2458820j,0s,0n),+0s,2299161j)>,
|
93
|
+
# @user=
|
94
|
+
# #<Opsgenie::User:0x00007f9b2f329520
|
95
|
+
# @full_name="On Call Phone",
|
96
|
+
# @id="19e39115-07d5-4924-8295-332a66dd1569",
|
97
|
+
# @username="systems@dxw.com">>,
|
98
|
+
# ...]
|
99
|
+
# ],
|
100
|
+
# ...
|
101
|
+
# ]
|
102
|
+
# >
|
103
|
+
```
|
104
|
+
|
105
|
+
As well as the interval you want to see a timeline for:
|
106
|
+
|
107
|
+
```ruby
|
108
|
+
# `interval_unit` can be one of `:days`, `:weeks` or `:months`
|
109
|
+
schedule.timeline(interval: 1, interval_unit: :months)
|
110
|
+
#=> [...]
|
111
|
+
```
|
112
|
+
|
113
|
+
These options also work for a rotation's timeline too:
|
114
|
+
|
115
|
+
```ruby
|
116
|
+
schedule.rotation[0].timeline(
|
117
|
+
date: Date.parse("2019-01-01"),
|
118
|
+
interval: 1,
|
119
|
+
interval_unit: :months
|
120
|
+
)
|
121
|
+
#=> <Opsgenie::TimelineRotation:0x00007f9b2f974cb8>
|
62
122
|
```
|
63
123
|
|
64
124
|
## Development
|
data/lib/opsgenie.rb
CHANGED
@@ -3,7 +3,10 @@ require "httparty"
|
|
3
3
|
require "opsgenie/client"
|
4
4
|
require "opsgenie/schedule"
|
5
5
|
require "opsgenie/rotation"
|
6
|
+
require "opsgenie/user"
|
6
7
|
require "opsgenie/config"
|
8
|
+
require "opsgenie/timeline_rotation"
|
9
|
+
require "opsgenie/timeline_period"
|
7
10
|
|
8
11
|
module Opsgenie
|
9
12
|
def self.configure(api_key:)
|
data/lib/opsgenie/rotation.rb
CHANGED
@@ -35,7 +35,17 @@ module Opsgenie
|
|
35
35
|
)
|
36
36
|
|
37
37
|
on_calls = schedule.on_calls((time + 60).to_datetime)
|
38
|
-
on_calls.select { |
|
38
|
+
on_calls.select { |user| participant_usernames.include?(user.username) }
|
39
|
+
end
|
40
|
+
|
41
|
+
def timeline(date: Date.today, interval: nil, interval_unit: nil)
|
42
|
+
rotations = schedule.timeline(
|
43
|
+
date: date,
|
44
|
+
interval: interval,
|
45
|
+
interval_unit: interval_unit
|
46
|
+
)
|
47
|
+
|
48
|
+
rotations.find { |r| r.name == name }
|
39
49
|
end
|
40
50
|
|
41
51
|
private
|
data/lib/opsgenie/schedule.rb
CHANGED
@@ -32,9 +32,22 @@ module Opsgenie
|
|
32
32
|
|
33
33
|
def on_calls(datetime = nil)
|
34
34
|
endpoint = "schedules/#{id}/on-calls"
|
35
|
-
endpoint += "?date=#{
|
35
|
+
endpoint += "?date=#{escape_datetime(datetime)}" unless datetime.nil?
|
36
36
|
body = Opsgenie::Client.get(endpoint)
|
37
|
-
get_participants(body).map { |u| u["name"] }
|
37
|
+
get_participants(body).map { |u| User.find_by_username(u["name"]) }
|
38
|
+
end
|
39
|
+
|
40
|
+
def timeline(date: Date.today, interval: nil, interval_unit: nil)
|
41
|
+
check_interval_unit(interval_unit) if interval_unit
|
42
|
+
|
43
|
+
datetime = date.to_datetime
|
44
|
+
endpoint = "schedules/#{id}/timeline?date=#{escape_datetime(datetime)}"
|
45
|
+
endpoint += "&interval=#{interval}" if interval
|
46
|
+
endpoint += "&intervalUnit=#{interval_unit}" if interval_unit
|
47
|
+
body = Opsgenie::Client.get(endpoint)
|
48
|
+
body.dig("data", "finalTimeline", "rotations").map do |rotation|
|
49
|
+
TimelineRotation.new(rotation)
|
50
|
+
end
|
38
51
|
end
|
39
52
|
|
40
53
|
private
|
@@ -44,5 +57,19 @@ module Opsgenie
|
|
44
57
|
p["type"] == "user"
|
45
58
|
end
|
46
59
|
end
|
60
|
+
|
61
|
+
def escape_datetime(datetime)
|
62
|
+
CGI.escape(datetime.to_s)
|
63
|
+
end
|
64
|
+
|
65
|
+
def check_interval_unit(value)
|
66
|
+
return if valid_intervals.include?(value)
|
67
|
+
|
68
|
+
raise ArgumentError, "`interval_unit` must be one of `#{valid_intervals}``"
|
69
|
+
end
|
70
|
+
|
71
|
+
def valid_intervals
|
72
|
+
%i[days weeks months]
|
73
|
+
end
|
47
74
|
end
|
48
75
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module Opsgenie
|
2
|
+
class TimelinePeriod
|
3
|
+
attr_reader :start_date, :end_date, :user
|
4
|
+
def initialize(attrs)
|
5
|
+
@start_date = DateTime.parse(attrs["startDate"])
|
6
|
+
@end_date = DateTime.parse(attrs["endDate"])
|
7
|
+
@user = Opsgenie::User.find(attrs["recipient"]["id"])
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "date"
|
2
|
+
|
3
|
+
module Opsgenie
|
4
|
+
class User
|
5
|
+
class << self
|
6
|
+
def all
|
7
|
+
body = Opsgenie::Client.get("users?limit=500")
|
8
|
+
body["data"].map { |s| new(s) }
|
9
|
+
end
|
10
|
+
|
11
|
+
def find_by_username(username)
|
12
|
+
find_by(:username, username)
|
13
|
+
end
|
14
|
+
|
15
|
+
def find(id)
|
16
|
+
find_by(:id, id)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def find_by(key, value)
|
22
|
+
@users ||= all
|
23
|
+
@users.find { |user| user.send(key) == value }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
attr_reader :id, :username, :full_name
|
28
|
+
|
29
|
+
def initialize(attrs)
|
30
|
+
@id = attrs["id"]
|
31
|
+
@username = attrs["username"]
|
32
|
+
@full_name = attrs["fullName"]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/opsgenie-schedule.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opsgenie-schedule
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stuart Harrison
|
@@ -145,6 +145,9 @@ files:
|
|
145
145
|
- lib/opsgenie/config.rb
|
146
146
|
- lib/opsgenie/rotation.rb
|
147
147
|
- lib/opsgenie/schedule.rb
|
148
|
+
- lib/opsgenie/timeline_period.rb
|
149
|
+
- lib/opsgenie/timeline_rotation.rb
|
150
|
+
- lib/opsgenie/user.rb
|
148
151
|
- opsgenie-schedule.gemspec
|
149
152
|
homepage: https://github.com/dxw/opsgenie-schedule
|
150
153
|
licenses:
|