opsgenie-schedule 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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: