cronitor 1.1.3 → 3.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 8f2d92e9bff2665cff64e293fa9a2811fdd0f1ac
4
- data.tar.gz: cc05a4d335a3a7272e1fe5430cc8e8ba5526bdd6
2
+ SHA256:
3
+ metadata.gz: f4b5bc9e1efd7fb5247f7f473195589fb4cb822c52a1ee92f1b6c784086016f7
4
+ data.tar.gz: f617431b175f6c2e9263fc48fece1af7d7bff634285d703e5d3d57d548f70236
5
5
  SHA512:
6
- metadata.gz: 39b1571f0e348dadc27d5df8d36d53afeb8a65e2b750ec6e05dc93f1afa01b42d3da13adf629baa2c32509df988d74ce3717d810c4d70a90c2628943366c5a98
7
- data.tar.gz: 384b8b8dece34c4d81057eafa338d0f9c8374fcb5988acaeb6010ac9241774236065b1b5b37f9af24060aa686f0ac511c4667b0a1e65d2ffaea785c55bb6c5b8
6
+ metadata.gz: 88a42cddedfea16c32fe0ab3716684343f7c6e8adcfa9cd5018a43e28c6e1e86ba9ced38cfe361e1ecc184dde146f2b8b222320ce17c2e8e1194c4d698d55e20
7
+ data.tar.gz: 5ecb82ea549bd5a5ffb5d4298f493e40d3e2569d1517365156315a30f965fbe8b46629daf3bcae9cd029b93ad14c8363d6f06e0f543d8b26a0e270567446dc61
@@ -0,0 +1,15 @@
1
+ ---
2
+ Metrics/AbcSize:
3
+ Enabled: false
4
+
5
+ Metrics/BlockLength:
6
+ Enabled: false
7
+
8
+ Metrics/CyclomaticComplexity:
9
+ Enabled: false
10
+
11
+ Metrics/MethodLength:
12
+ Enabled: false
13
+
14
+ Style/Documentation:
15
+ Enabled: false
@@ -1,4 +1,5 @@
1
+ ---
1
2
  language: ruby
2
3
  rvm:
3
- - 2.2
4
- before_install: gem install bundler -v 1.10
4
+ - 2
5
+ - 2.4
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in cronitor.gemspec
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Cronitor
2
2
 
3
- [![Travis](https://img.shields.io/travis/evertrue/cronitor.svg)](https://github.com/evertrue/cronitor)
3
+ [![Travis](https://img.shields.io/travis/evertrue/cronitor.svg)](https://travis-ci.org/evertrue/cronitor)
4
4
  [![Gem Version](https://badge.fury.io/rb/cronitor.svg)](https://badge.fury.io/rb/cronitor)
5
5
 
6
6
  [Cronitor](https://cronitor.io/) is a service for heartbeat-style monitoring of just about anything that can send an HTTP request.
@@ -25,15 +25,45 @@ Or install it yourself as:
25
25
 
26
26
  ## Usage
27
27
 
28
+
29
+ ### Configure
30
+
31
+ You need to set Cronitor Token in order to create a monitor
32
+
33
+ #### Using configure
34
+
35
+ ```ruby
36
+ require 'cronitor'
37
+
38
+ Cronitor.configure do |cronitor|
39
+ cronitor.default_token = 'token' # default token to be re-used by cronitor
40
+ end
41
+ ```
42
+
43
+ #### Using ENV
44
+
45
+ ```
46
+ # .env
47
+ CRONITOR_TOKEN: token
48
+
49
+ # bash
50
+ export CRONITOR_TOKEN='token'
51
+ ```
52
+
28
53
  ### Creating a Monitor
29
54
 
30
55
  A Cronitor monitor (hereafter referred to only as a monitor for brevity) is created if it does not already exist, and its ID returned.
31
56
 
57
+ Please see the [Cronitor Monitor API docs](https://cronitor.io/docs/monitor-api) for details of all the possible monitor options.
58
+
59
+ Example of creating a heartbeat monitor:
60
+
32
61
  ```ruby
33
62
  require 'cronitor'
34
63
 
35
64
  monitor_options = {
36
65
  name: 'My Fancy Monitor',
66
+ type: 'heartbeat', # Optional: the gem defaults to this; the other value, 'healthcheck', is not yet supported by this gem
37
67
  notifications: {
38
68
  emails: ['test@example.com'],
39
69
  slack: [],
@@ -43,29 +73,21 @@ monitor_options = {
43
73
  },
44
74
  rules: [
45
75
  {
46
- rule_type: 'not_run_in',
47
- duration: 5
48
- rime_unit: 'seconds'
76
+ rule_type: 'run_ping_not_received',
77
+ value: 5,
78
+ time_unit: 'seconds'
49
79
  }
50
80
  ],
51
81
  note: 'A human-friendly description of this monitor'
52
82
  }
83
+
84
+ # The token parameter is optional; if omittted, ENV['CRONITOR_TOKEN'] will be used if not configured
53
85
  my_monitor = Cronitor.new token: 'api_token', opts: monitor_options
54
86
  ```
55
87
 
56
- You may optionally specify a `:human_readable` value for your rule(s), otherwise one will be crafted for you:
88
+ ### Updating an existing monitor
57
89
 
58
- ```ruby
59
- monitor_options = {
60
- rules: [
61
- {
62
- rule_type: 'not_run_in',
63
- duration: 5
64
- time_unit: 'seconds',
65
- human_readable: 'not_run_in 5 seconds'
66
- }
67
- ],
68
- ```
90
+ Currently this gem does not support updating or deleting an existing monitor.
69
91
 
70
92
  ### Pinging a Monitor
71
93
 
@@ -79,7 +101,9 @@ my_monitor.ping 'fail', 'A short description of the failure'
79
101
 
80
102
  ### Pinging a monitor when you have a Cronitor code
81
103
 
82
- You may already have the code for a monitor, in which case, the expense of `Cronitor.new` may seem unnecessary (since it makes an HTTP request to check if a monitor exists, and you already know it does).
104
+ You may already have the code for a monitor, in which case, the expense of `Cronitor.create` may seem unnecessary (since it makes an HTTP request to check if a monitor exists, and you already know it does).
105
+
106
+ Cronitor does not require a token for pinging a monitor unless you have enabled Ping API authentication in your account settings. At the moment, this gem does not support Ping API auth.
83
107
 
84
108
  In that case:
85
109
 
@@ -102,3 +126,10 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
102
126
  3. Commit your changes (`git commit -am 'Add some feature'`)
103
127
  4. Push to the branch (`git push origin my-new-feature`)
104
128
  5. Create a new Pull Request
129
+
130
+ ## Release a new version
131
+
132
+ The `bump` gem makes this easy:
133
+
134
+ 1. `rake bump:(major|minor|patch|pre)`
135
+ 2. `rake release`
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
  require 'bump/tasks'
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'cronitor'
@@ -1,4 +1,6 @@
1
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
5
  require 'cronitor/version'
4
6
 
@@ -18,14 +20,11 @@ Gem::Specification.new do |spec|
18
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
21
  spec.require_paths = ['lib']
20
22
 
21
- spec.add_dependency 'unirest', '~> 1.1'
22
- spec.add_dependency 'hashie', '~> 3.4'
23
-
24
- spec.add_development_dependency 'bundler', '~> 1.10'
25
- spec.add_development_dependency 'rake', '~> 10.0'
26
- spec.add_development_dependency 'rspec', '~> 3.3'
27
- spec.add_development_dependency 'pry', '~> 0.10'
28
- spec.add_development_dependency 'webmock', '~> 1.21'
29
- spec.add_development_dependency 'sinatra', '~> 1.4'
30
23
  spec.add_development_dependency 'bump', '~> 0.1'
24
+ spec.add_development_dependency 'bundler'
25
+ spec.add_development_dependency 'pry', '~> 0.10'
26
+ spec.add_development_dependency 'rake'
27
+ spec.add_development_dependency 'rspec', '~> 3.3'
28
+ spec.add_development_dependency 'sinatra', '~> 2.0'
29
+ spec.add_development_dependency 'webmock', '~> 3.1'
31
30
  end
@@ -1,23 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cronitor/version'
2
4
  require 'cronitor/error'
5
+ require 'json'
3
6
  require 'net/http'
4
- require 'unirest'
5
-
6
- Unirest.default_header 'Accept', 'application/json'
7
- Unirest.default_header 'Content-Type', 'application/json'
7
+ require 'uri'
8
8
 
9
9
  class Cronitor
10
10
  attr_accessor :token, :opts, :code
11
- API_URL = 'https://cronitor.io/v1'
11
+ API_URL = 'https://cronitor.io/v3'
12
12
  PING_URL = 'https://cronitor.link'
13
13
 
14
- def initialize(token: nil, opts: {}, code: nil)
15
- @token = token
14
+ class << self
15
+ attr_accessor :default_token
16
+
17
+ def configure(&block)
18
+ block.call(self)
19
+ end
20
+ end
21
+
22
+ def initialize(token: ENV['CRONITOR_TOKEN'], opts: {}, code: nil)
23
+ @token = token || self.class.default_token
16
24
  @opts = opts
17
25
  @code = code
18
26
 
19
27
  if @token.nil? && @code.nil?
20
- fail(
28
+ raise(
21
29
  Cronitor::Error,
22
30
  'Either a Cronitor API token or an existing monitor code must be ' \
23
31
  'provided'
@@ -25,60 +33,83 @@ class Cronitor
25
33
  end
26
34
 
27
35
  if @opts
28
- Hashie.symbolize_keys! @opts
36
+ @opts = symbolize_keys @opts
37
+
29
38
  exists? @opts[:name] if @opts.key? :name
30
- human_readable @opts[:rules] if @opts.key? :rules
39
+
40
+ # README: Per Cronitor API v2, we need to specify a type. The "heartbeat"
41
+ # type corresponds to what the v1 API offered by default
42
+ # We allow other values to be injected, and let the API handle
43
+ # any errors.
44
+ @opts[:type] = 'heartbeat' unless @opts[:type]
31
45
  end
32
46
 
33
47
  create if @code.nil?
34
48
  end
35
49
 
36
50
  def create
37
- response = Unirest.post(
38
- "#{API_URL}/monitors",
39
- auth: { user: token },
40
- parameters: opts.to_json
41
- )
51
+ uri = URI.parse "#{API_URL}/monitors"
52
+
53
+ http = Net::HTTP.new uri.host, uri.port
54
+ http.use_ssl = uri.scheme == 'https'
55
+
56
+ request = Net::HTTP::Post.new uri.path, default_headers
57
+ request.basic_auth token, nil
58
+ request.content_type = 'application/json'
59
+ request.body = JSON.generate opts
42
60
 
43
- @code = response.body['code'] if valid? response
61
+ response = http.request request
62
+
63
+ @code = JSON.parse(response.body).fetch 'code' if valid? response
44
64
  end
45
65
 
46
66
  def exists?(name)
47
- response = Unirest.get(
48
- "#{API_URL}/monitors/#{URI.escape(name).gsub('[', '%5B').gsub(']', '%5D')}",
49
- auth: { user: token }
50
- )
51
- return false unless response.code == 200
67
+ uri = URI.parse "#{API_URL}/monitors/#{URI.escape name}"
68
+
69
+ http = Net::HTTP.new uri.host, uri.port
70
+ http.use_ssl = uri.scheme == 'https'
71
+
72
+ request = Net::HTTP::Get.new uri.path, default_headers
73
+ request.basic_auth token, nil
52
74
 
53
- @code = response.body['code']
75
+ response = http.request request
76
+
77
+ return false unless response.is_a? Net::HTTPSuccess
78
+
79
+ @code = JSON.parse(response.body).fetch 'code'
80
+ @opts = JSON.parse(response.body)
54
81
 
55
82
  true
56
83
  end
57
84
 
58
85
  def ping(type, msg = nil)
59
- url = "#{PING_URL}/#{code}/#{type}"
60
- url += "?msg=#{URI.escape msg}" if type == 'fail' && !msg.nil?
86
+ uri = URI.parse "#{PING_URL}/#{URI.escape code}/#{URI.escape type}"
87
+ if %w[run complete fail].include?(type) && !msg.nil?
88
+ uri.query = URI.encode_www_form 'msg' => msg
89
+ end
61
90
 
62
- response = Unirest.get url
63
- valid? response
64
- end
91
+ http = Net::HTTP.new uri.host, uri.port
92
+ http.use_ssl = uri.scheme == 'https'
65
93
 
66
- def human_readable(rules)
67
- rules.each do |rule|
68
- unless rule[:human_readable]
69
- rule[:human_readable] = "#{rule[:rule_type]} #{rule[:duration]} " \
70
- "#{rule[:time_unit]}"
71
- end
72
- end
94
+ request = Net::HTTP::Get.new uri, default_headers
95
+
96
+ response = http.request request
97
+
98
+ valid? response
73
99
  end
74
100
 
75
101
  private
76
102
 
77
103
  def valid?(response)
78
- return true if [200, 201].include? response.code
79
- server_error? response
104
+ return true if response.is_a? Net::HTTPSuccess
80
105
 
81
- fail Cronitor::Error, error_msg(response.body)
106
+ msg = if response.content_type.match? 'json'
107
+ error_msg JSON.parse(response.body)
108
+ else
109
+ "Something else has gone awry. HTTP status: #{response.code}"
110
+ end
111
+
112
+ raise Cronitor::Error, msg
82
113
  end
83
114
 
84
115
  def error_msg(body, msg = [])
@@ -95,12 +126,13 @@ class Cronitor
95
126
  msg.join ' '
96
127
  end
97
128
 
98
- def server_error?(response)
99
- return unless [301, 302, 404, 500, 502, 503, 504].include? response.code
129
+ def default_headers
130
+ { 'Accept' => 'application/json' }
131
+ end
100
132
 
101
- fail(
102
- Cronitor::Error,
103
- "Something else has gone awry. HTTP status: #{response.code}"
104
- )
133
+ def symbolize_keys(hash)
134
+ hash.each_with_object({}) do |(k, v), h|
135
+ h[k.to_sym] = v.is_a?(Hash) ? symbolize_keys(v) : v
136
+ end
105
137
  end
106
138
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Cronitor
2
4
  class Error < StandardError
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Cronitor
2
- VERSION = '1.1.3'
4
+ VERSION = '3.1.0'
3
5
  end
metadata CHANGED
@@ -1,71 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cronitor
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Byrnes
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-10-26 00:00:00.000000000 Z
11
+ date: 2020-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: unirest
14
+ name: bump
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.1'
20
- type: :runtime
19
+ version: '0.1'
20
+ type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.1'
26
+ version: '0.1'
27
27
  - !ruby/object:Gem::Dependency
28
- name: hashie
28
+ name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '3.4'
34
- type: :runtime
33
+ version: '0'
34
+ type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '3.4'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: bundler
42
+ name: pry
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.10'
47
+ version: '0.10'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.10'
54
+ version: '0.10'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '10.0'
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '10.0'
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -80,63 +80,35 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '3.3'
83
- - !ruby/object:Gem::Dependency
84
- name: pry
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '0.10'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '0.10'
97
- - !ruby/object:Gem::Dependency
98
- name: webmock
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '1.21'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '1.21'
111
83
  - !ruby/object:Gem::Dependency
112
84
  name: sinatra
113
85
  requirement: !ruby/object:Gem::Requirement
114
86
  requirements:
115
87
  - - "~>"
116
88
  - !ruby/object:Gem::Version
117
- version: '1.4'
89
+ version: '2.0'
118
90
  type: :development
119
91
  prerelease: false
120
92
  version_requirements: !ruby/object:Gem::Requirement
121
93
  requirements:
122
94
  - - "~>"
123
95
  - !ruby/object:Gem::Version
124
- version: '1.4'
96
+ version: '2.0'
125
97
  - !ruby/object:Gem::Dependency
126
- name: bump
98
+ name: webmock
127
99
  requirement: !ruby/object:Gem::Requirement
128
100
  requirements:
129
101
  - - "~>"
130
102
  - !ruby/object:Gem::Version
131
- version: '0.1'
103
+ version: '3.1'
132
104
  type: :development
133
105
  prerelease: false
134
106
  version_requirements: !ruby/object:Gem::Requirement
135
107
  requirements:
136
108
  - - "~>"
137
109
  - !ruby/object:Gem::Version
138
- version: '0.1'
139
- description:
110
+ version: '3.1'
111
+ description:
140
112
  email:
141
113
  - thejeffbyrnes@gmail.com
142
114
  executables: []
@@ -146,6 +118,7 @@ files:
146
118
  - ".editorconfig"
147
119
  - ".gitignore"
148
120
  - ".rspec"
121
+ - ".rubocop.yml"
149
122
  - ".travis.yml"
150
123
  - Gemfile
151
124
  - LICENSE.txt
@@ -160,7 +133,7 @@ files:
160
133
  homepage: https://github.com/evertrue/cronitor
161
134
  licenses: []
162
135
  metadata: {}
163
- post_install_message:
136
+ post_install_message:
164
137
  rdoc_options: []
165
138
  require_paths:
166
139
  - lib
@@ -175,9 +148,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
175
148
  - !ruby/object:Gem::Version
176
149
  version: '0'
177
150
  requirements: []
178
- rubyforge_project:
179
- rubygems_version: 2.4.6
180
- signing_key:
151
+ rubygems_version: 3.1.4
152
+ signing_key:
181
153
  specification_version: 4
182
154
  summary: An interface for the Cronitor API
183
155
  test_files: []