airbrake_tools 1.1.3 → 1.1.4

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
  SHA1:
3
- metadata.gz: bdd1c1131520b79c11f048ba998705943ab95bc2
4
- data.tar.gz: 29a5a90cc97973dbb2bed66ac01d66cd9a7a56f6
3
+ metadata.gz: fc3d7af0e6a7b6fc87ca968b446c774e970acd57
4
+ data.tar.gz: 69733ce8c83cc4a147ec7c3c9655e4a9cb00a737
5
5
  SHA512:
6
- metadata.gz: 15526a3a2541bbee47b30bb81235bc585eb80ccba968226c3c0d40cf44bf39e9cf51e6f023a81a0866490dc51a38b67f61431778e65d70b4a7bb634589d94973
7
- data.tar.gz: 2f0a069e6fcf7e78a934d2d630c13af0b53530bbfd78a36b95cb6aaa76f93189776a3f33b0005aa0badf1cbe995a4271f1f78263a869403027ced6a7cb960906
6
+ metadata.gz: c2988f6f938cee2117380a1f52c8307440899e8e4f389aefd3227719b9a85b0f2c00af4408ab86041bdfe8763b85e47d59bf358904b62291ff11d7003b30eca4
7
+ data.tar.gz: 9e899108980cdbff2044dd0d30d686f38ed8a5583a03ee85b7d131b4f7da4ffd5f89920dbfafb66bae036bde61ea04999b16ab04dc3985ba36eb38cbee1b9c24
data/Gemfile CHANGED
@@ -5,3 +5,4 @@ gem "bump", "0.3.8"
5
5
  gem "rake"
6
6
  gem "rspec", "~>2"
7
7
  gem "launchy"
8
+ gem "byebug"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- airbrake_tools (1.1.3)
4
+ airbrake_tools (1.1.4)
5
5
  airbrake-api (>= 4.5.1)
6
6
 
7
7
  GEM
@@ -14,12 +14,18 @@ GEM
14
14
  multi_xml
15
15
  parallel
16
16
  bump (0.3.8)
17
+ byebug (3.5.1)
18
+ columnize (~> 0.8)
19
+ debugger-linecache (~> 1.2)
20
+ slop (~> 3.6)
21
+ columnize (0.8.9)
22
+ debugger-linecache (1.2.0)
17
23
  diff-lcs (1.1.3)
18
24
  faraday (0.9.0)
19
25
  multipart-post (>= 1.2, < 3)
20
26
  faraday_middleware (0.9.1)
21
27
  faraday (>= 0.7.4, < 0.10)
22
- hashie (2.1.1)
28
+ hashie (3.3.1)
23
29
  launchy (2.4.2)
24
30
  addressable (~> 2.3)
25
31
  multi_xml (0.5.5)
@@ -34,6 +40,7 @@ GEM
34
40
  rspec-expectations (2.11.3)
35
41
  diff-lcs (~> 1.1.3)
36
42
  rspec-mocks (2.11.3)
43
+ slop (3.6.0)
37
44
 
38
45
  PLATFORMS
39
46
  ruby
@@ -41,6 +48,7 @@ PLATFORMS
41
48
  DEPENDENCIES
42
49
  airbrake_tools!
43
50
  bump (= 0.3.8)
51
+ byebug
44
52
  launchy
45
53
  rake
46
54
  rspec (~> 2)
data/Readme.md CHANGED
@@ -39,7 +39,7 @@ Shows all errors divided by pages
39
39
  - "fix all errors on page x"
40
40
 
41
41
  ```
42
- airbrake-tools your-account your-auth-token list | grep 'is suspended'
42
+ airbrake-tools your-account your-auth-token list --project 12345 | grep 'is suspended'
43
43
  Page 1 ----------
44
44
  54054554 -- ActiveRecord::RecordInvalid -- ActiveRecord::RecordInvalid: Validation failed: Requester is suspended.
45
45
  Page 2 ----------
@@ -1,7 +1,5 @@
1
- # encoding: UTF-8
2
1
  require "airbrake_tools/version"
3
2
  require "airbrake-api"
4
- require "launchy"
5
3
 
6
4
  module AirbrakeTools
7
5
  DEFAULT_HOT_PAGES = 1
@@ -51,13 +49,16 @@ module AirbrakeTools
51
49
  end
52
50
 
53
51
  def hot(options = {})
54
- errors = errors_with_notices({:pages => DEFAULT_HOT_PAGES}.merge(options))
55
- errors.sort_by{|e,n,f| f }.reverse
52
+ errors = Array(options[:project_id] || projects.map(&:id)).flat_map do |project_id|
53
+ errors_with_notices({pages: DEFAULT_HOT_PAGES, project_id: project_id}.merge(options))
54
+ end
55
+ errors.sort_by{|_,_,f| f }.reverse[0...AirbrakeAPI::Client::PER_PAGE]
56
56
  end
57
57
 
58
58
  def new(options = {})
59
+ need_project_id!(options)
59
60
  errors = errors_with_notices({:pages => DEFAULT_NEW_PAGES}.merge(options))
60
- errors.sort_by{|e,n,f| e.created_at }.reverse
61
+ errors.sort_by{|e,_,_| e.created_at }.reverse
61
62
  end
62
63
 
63
64
  def errors_with_notices(options)
@@ -65,9 +66,10 @@ module AirbrakeTools
65
66
  end
66
67
 
67
68
  def list(options)
68
- list_pages = options[:pages] ? options[:pages] : DEFAULT_LIST_PAGES
69
+ need_project_id!(options)
70
+ list_pages = (options[:pages] ? options[:pages] : DEFAULT_LIST_PAGES)
69
71
  page = 1
70
- while errors = AirbrakeAPI.errors(page: page) and page <= list_pages
72
+ while page <= list_pages && errors = AirbrakeAPI.errors(page: page, project_id: options.fetch(:project_id))
71
73
  select_env(errors, options).each do |error|
72
74
  puts "#{error.id} -- #{error.error_class} -- #{error.error_message} -- #{error.created_at}"
73
75
  end
@@ -92,20 +94,23 @@ module AirbrakeTools
92
94
  end
93
95
 
94
96
  def open(error_id, notice_id=nil)
97
+ require "launchy"
95
98
  error = AirbrakeAPI.error(error_id)
96
99
  raise URI::InvalidURIError if error.nil?
97
100
 
98
- if notice_id.nil?
99
- Launchy.open "https://#{AirbrakeAPI.account}.airbrake.io/projects/#{error.project_id}/groups/#{error_id}"
100
- else
101
- Launchy.open "https://#{AirbrakeAPI.account}.airbrake.io/projects/#{error.project_id}/groups/#{error_id}/notices/#{notice_id}"
102
- end
101
+ url = "https://#{AirbrakeAPI.account}.airbrake.io/projects/#{error.project_id}/groups/#{error_id}"
102
+ url += "/notices/#{notice_id}" if notice_id
103
+ Launchy.open url
103
104
  rescue URI::InvalidURIError
104
105
  puts "Error id does not map to any error on Airbrake"
105
106
  end
106
107
 
107
108
  private
108
109
 
110
+ def need_project_id!(options)
111
+ raise "Need a project_id" unless options[:project_id]
112
+ end
113
+
109
114
  def present_line(line)
110
115
  color = :gray if $stdout.tty? && !custom_file?(line)
111
116
  line = line.sub("[PROJECT_ROOT]/", "")
@@ -187,7 +192,7 @@ module AirbrakeTools
187
192
  end
188
193
 
189
194
  def print_errors(hot)
190
- hot.each_with_index do |(error, notices, rate, deviance), index|
195
+ hot.each_with_index do |(error, notices, rate), index|
191
196
  spark = sparkline(notices, :slots => 60, :interval => 60)
192
197
  puts "\n##{(index+1).to_s.ljust(2)} #{rate.round(2).to_s.rjust(6)}/hour total:#{error.notices_count.to_s.ljust(8)} #{color_text(spark.ljust(61), :green)}"
193
198
  puts hot_summary(error)
@@ -234,7 +239,7 @@ module AirbrakeTools
234
239
  opts.on("-c NUM", "--compare-depth NUM", Integer, "How deep to compare backtraces in summary (default: first line in project + #{DEFAULT_COMPARE_DEPTH_ADDITION})") {|s| options[:compare_depth] = s }
235
240
  opts.on("-p NUM", "--pages NUM", Integer, "How maybe pages to iterate over (default: hot:#{DEFAULT_HOT_PAGES} new:#{DEFAULT_NEW_PAGES} summary:#{DEFAULT_SUMMARY_PAGES})") {|s| options[:pages] = s }
236
241
  opts.on("-e ENV", "--environment ENV", String, "Only show errors from this environment (default: #{DEFAULT_ENVIRONMENT})") {|s| options[:env] = s }
237
- opts.on("--project NAME", String, "Name of project to fetch errors for") {|p| options[:project_name] = p }
242
+ opts.on("--project NAME_OR_ID", String, "Name of project to fetch errors for") {|p| options[:project_name] = p }
238
243
  opts.on("-h", "--help", "Show this.") { puts opts; exit }
239
244
  opts.on("-v", "--version", "Show Version"){ puts "airbrake-tools #{VERSION}"; exit }
240
245
  end.parse!(argv)
@@ -257,10 +262,14 @@ module AirbrakeTools
257
262
  `#{File.expand_path('../../spark.sh',__FILE__)} #{sparkline_data(notices, options).join(" ")}`.strip
258
263
  end
259
264
 
260
- def project_id(project_name)
265
+ def projects
261
266
  @projects ||= AirbrakeAPI.projects
262
- project = @projects.detect { |p| p.name == project_name }
263
- raise "project with name #{name} not found try #{@projects.map(&:name).join(", ")}" unless project
267
+ end
268
+
269
+ def project_id(project_name)
270
+ return project_name.to_i if project_name =~ /^\d+$/
271
+ project = projects.detect { |p| p.name == project_name }
272
+ raise "project with name #{project_name} not found try #{projects.map(&:name).join(", ")}" unless project
264
273
  project.id
265
274
  end
266
275
  end
@@ -1,3 +1,3 @@
1
1
  module AirbrakeTools
2
- VERSION = "1.1.3"
2
+ VERSION = "1.1.4"
3
3
  end
@@ -45,14 +45,14 @@ describe "airbrake-tools" do
45
45
 
46
46
  describe "hot" do
47
47
  it "kinda works" do
48
- output = airbrake_tools("#{config["subdomain"]} #{config["auth_token"]} hot")
48
+ output = airbrake_tools("#{config["subdomain"]} #{config["auth_token"]} hot --project #{config["project_id"]}")
49
49
  output.should =~ /#\d+\s+\d+\.\d+\/hour\s+total:\d+/
50
50
  end
51
51
  end
52
52
 
53
53
  describe "list" do
54
54
  it "kinda works" do
55
- output = airbrake_tools("#{config["subdomain"]} #{config["auth_token"]} list")
55
+ output = airbrake_tools("#{config["subdomain"]} #{config["auth_token"]} list --project #{config["project_id"]}")
56
56
  output.should include("Page 1 ")
57
57
  output.should =~ /^\d+/
58
58
  end
@@ -68,7 +68,7 @@ describe "airbrake-tools" do
68
68
 
69
69
  describe "new" do
70
70
  it "kinda works" do
71
- output = airbrake_tools("#{config["subdomain"]} #{config["auth_token"]} new")
71
+ output = airbrake_tools("#{config["subdomain"]} #{config["auth_token"]} new --project #{config["project_id"]}")
72
72
  output.should =~ /#\d+\s+\d+\.\d+\/hour\s+total:\d+/
73
73
  end
74
74
  end
@@ -1,3 +1,4 @@
1
1
  subdomain: xxx
2
2
  auth_token: yyy # NOT THE API KEY <-> got to airbrake, click on settings, copy auth_token
3
3
  summary_error_id: zzz # some valid error ID from airbrake to test summary functionality
4
+ project_id: aaa # some valid project ID from airbrake to test new/list functionality
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: airbrake_tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Cheatham
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-24 00:00:00.000000000 Z
11
+ date: 2014-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: airbrake-api