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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fc6e0e949d909c453328c4ad695aebb4b4c05d6aefe60c71926112ed1376f18b
4
- data.tar.gz: 7f5732c274402cea99e7be2c595c39bb0008894856aea5678609c471503c0ac8
3
+ metadata.gz: 30a5116e9d7df158ef1d36af1d2ef9161649ad9daf2f595b9f2baae6024752ac
4
+ data.tar.gz: fa55ef6189912822f61e5c89a8d3d0277898fadb4e24bdab10f1919477716a7e
5
5
  SHA512:
6
- metadata.gz: e48d76aa2f7e2cbb6f1b27f33f9626c315ebfe5695acac88dedb39cb290ec96592039332999b41505e505ed2884e407b0993636d62a178d70b46e374684933f5
7
- data.tar.gz: 672a690dd7a6f9713a1922df8f7f0227052137b29a1cbe7052dda7c2a3db047745bde455634905ab10642cc5516da41dc58e4f946f70e1a7e03bee1db58d1110
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.0)
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.17.1)
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.0.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
- #=> ["someone@example.com", "someone-else@example.com"]
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
- #=> ["someone@example.com", "someone-else@example.com"]
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:)
@@ -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 { |name| participant_usernames.include?(name) }
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
@@ -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=#{CGI.escape datetime.to_s}" unless datetime.nil?
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,11 @@
1
+ module Opsgenie
2
+ class TimelineRotation
3
+ attr_reader :id, :name, :periods
4
+
5
+ def initialize(attrs)
6
+ @id = attrs["id"]
7
+ @name = attrs["name"]
8
+ @periods = attrs["periods"].map { |p| TimelinePeriod.new(p) }
9
+ end
10
+ end
11
+ 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
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
 
4
4
  Gem::Specification.new do |spec|
5
5
  spec.name = "opsgenie-schedule"
6
- spec.version = "0.1.0"
6
+ spec.version = "0.1.1"
7
7
  spec.authors = ["Stuart Harrison"]
8
8
  spec.email = ["stuart@dxw.com"]
9
9
 
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.0
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: