crep 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6ec9983a55f99437b47855a38a35de0748a1fb8023dca8ef5f3f973b9be87919
4
+ data.tar.gz: e3830e5d8609c2aa9d1808d4d82218d7a44172b207f3fde619462c1cd38adddd
5
+ SHA512:
6
+ metadata.gz: b3b1687053ac8aae4f85872331f9e16e632769765d6ca598556dd2adc76d048e68cafbe4fa0c2c0a205f0307d702c9196e73221ce9b5e3e214df24af39f3e7b0
7
+ data.tar.gz: 1d0ea2b9eee605d398f8e600a2bbd31698f8e44ade452862cdccfb856f96013ef8dde8454de33ee23d8d330fdb710ca0ecd79945bec282bcbdbb9fa7b7a1995c
data/.gitignore ADDED
@@ -0,0 +1,60 @@
1
+ *.gem
2
+ *.rbc
3
+ /.bundle/
4
+ /.yardoc
5
+ /Gemfile.lock
6
+ /.config
7
+ /_yardoc/
8
+ /coverage/
9
+ /InstalledFiles
10
+ /doc/
11
+ /pkg/
12
+ /spec/reports/
13
+ /spec/examples.txt
14
+ /test/tmp/
15
+ /test/version_tmp/
16
+ /tmp/
17
+
18
+ # Used by dotenv library to load environment variables.
19
+ # .env
20
+
21
+ ## Specific to RubyMotion:
22
+ .dat*
23
+ .repl_history
24
+ build/
25
+ *.bridgesupport
26
+ build-iPhoneOS/
27
+ build-iPhoneSimulator/
28
+
29
+ # rspec failure tracking
30
+ .rspec_status
31
+
32
+ ## Specific to RubyMotion (use of CocoaPods):
33
+ #
34
+ # We recommend against adding the Pods directory to your .gitignore. However
35
+ # you should judge for yourself, the pros and cons are mentioned at:
36
+ # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
37
+ #
38
+ # vendor/Pods/
39
+
40
+ ## Documentation cache and generated files:
41
+ /.yardoc/
42
+ /_yardoc/
43
+ /doc/
44
+ /rdoc/
45
+
46
+ ## Environment normalization:
47
+ /.bundle/
48
+ /vendor/bundle
49
+ /lib/bundler/man/
50
+
51
+ # for a library or gem, you might want to ignore these files since the code is
52
+ # intended to run in multiple environments; otherwise, check them in:
53
+ # Gemfile.lock
54
+ # .ruby-version
55
+ # .ruby-gemset
56
+
57
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
58
+ .rvmrc
59
+
60
+ .DS_Store
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.rubocop.yml ADDED
@@ -0,0 +1,17 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2017-12-09 23:28:51 +0100 using RuboCop version 0.51.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ Metrics/LineLength:
10
+ Enabled: false
11
+
12
+ Metrics/ParameterLists:
13
+ Enabled: false
14
+
15
+ Style/Documentation:
16
+ Enabled: false
17
+
data/Changelog.md ADDED
@@ -0,0 +1,21 @@
1
+ # Next up
2
+
3
+ ## Added
4
+
5
+ -
6
+
7
+ ## Removed
8
+
9
+ -
10
+
11
+ ## Fixed
12
+
13
+ -
14
+
15
+ ## Miscellaneous
16
+
17
+ -
18
+
19
+ # 0.1.0
20
+
21
+ - Initial release.
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Crep's dependencies in crep.gemspec
4
+ gemspec
5
+
6
+ # contains Support for Statistics
7
+ gem 'hockeyapp', git: 'https://github.com/q231950/hockeyapp.git'
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2017 XING SE
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # Crep
2
+
3
+ *Crep - a Crash Reporter for creating appealing Crash Newsletters*
4
+
5
+ We use Crep at [XING](https://www.xing.com) to create our Crash Newsletters for [iOS](https://www.xing.com/ios) and [Android](https://www.xing.com/android) within the _Mobile Releases Team_. It currently uses [HockeyApp](https://rink.hockeyapp.net) as a crash source, so if you are using Hockey, you should definitely give Crep a try.
6
+
7
+ In case you are creating Crash Newsletters and have a different crash source in mind - check out the contributing section!
8
+
9
+ ## Install
10
+
11
+ Please follow our guide in the [Installation Instructions](https://github.com/xing/crep/wiki/Install).
12
+
13
+ ## Usage
14
+
15
+ Provide a `CREP_HOCKEY_API_TOKEN`:
16
+
17
+ `export CREP_HOCKEY_API_TOKEN='abcde'`
18
+
19
+ Run Crep:
20
+
21
+ `bundle exec crep crashes --identifier='com.example.company' --version='1.23.0' --build='42' --only-unresolved`
22
+
23
+ The `--only-unresolved` flag filters out any crashes marked as resolved.
24
+
25
+ ## Test
26
+
27
+ Run `bundle exec rspec` in order to run the tests.
28
+
29
+ ## Contributing
30
+
31
+ 🎁 Bug reports and pull requests for new features are most welcome!
32
+
33
+ 👷🏼 In case you want to use a different crash source - feel free to add on, we are looking forward to your pull request, we'd love to help!
34
+
35
+ ## License
36
+
37
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler/gem_tasks'
2
+ task default: :spec
data/Vision.md ADDED
@@ -0,0 +1,15 @@
1
+ # Goals
2
+
3
+ - Add newsletter templating to easily create a readable and actionable format for sharing crashes.
4
+ - Add multiple crash sources, making it easier for anyone to plug and play.
5
+ - Enable newsletters or results to be easily published on sites like GitHub.
6
+ - Cultivate an inclusive open source community through respectful discussion.
7
+
8
+ # Scope
9
+
10
+ - We are focusing on crashes for a specific app version.
11
+ - Having a crash newsletter in mind, we do not expect adding crash visualisations.
12
+
13
+ ## Inspiration
14
+
15
+ This project is inspired by our effort to share crash insights and cultivate teams to feel repsonsibility to fix them at [XING](https://www.xing.com) and aims to raise awareness and fix crashes across all teams.
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'crep'
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require 'irb'
14
+ IRB.start(__FILE__)
data/bin/crep ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.push File.expand_path('../lib', File.dirname(__FILE__))
4
+
5
+ require 'crep'
6
+
7
+ Crep.run
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/crep.gemspec ADDED
@@ -0,0 +1,36 @@
1
+
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'crep/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'crep'
8
+ spec.version = Crep::VERSION
9
+ spec.authors = ['Kim Dung-Pham', 'Bas Broek', 'Serghei Moret']
10
+ spec.email = ['kim.dung-pham@xing.com', 'bas.broek@xing.com', 'serghei.moret@xing.com']
11
+
12
+ spec.summary = 'Create Crash Newsletter with ease.'
13
+ spec.description = 'Create Crash Newsletter with ease. Really.'
14
+ spec.homepage = 'https://github.com/xing/crep'
15
+ spec.license = 'MIT'
16
+
17
+
18
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
19
+ f.match(%r{^(test|spec|features)/})
20
+ end
21
+ spec.bindir = 'bin'
22
+ # spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.executables << 'crep'
24
+ spec.require_paths = ['lib']
25
+
26
+ spec.add_dependency 'hockeyapp'
27
+ spec.add_dependency 'colorize'
28
+
29
+ spec.add_runtime_dependency 'claide', '~> 1.0.0'
30
+
31
+ spec.add_development_dependency 'bundler', '~> 1.15'
32
+ spec.add_development_dependency 'pry'
33
+ spec.add_development_dependency 'rake', '~> 10.0'
34
+ spec.add_development_dependency 'rspec'
35
+ spec.add_development_dependency 'rubocop', '0.51.0'
36
+ end
data/lib/crep.rb ADDED
@@ -0,0 +1,13 @@
1
+ require 'crep/version'
2
+ require 'crep/command'
3
+ require 'claide'
4
+ require 'logger'
5
+
6
+ module Crep
7
+ XINGLogger = Logger.new(STDOUT)
8
+ XINGLogger.level = Logger::DEBUG
9
+
10
+ def self.run
11
+ Command.run(ARGV)
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ require 'claide'
2
+ require 'crep/version'
3
+
4
+ module Crep
5
+ class Command < CLAide::Command
6
+ require 'crep/command/crashes'
7
+
8
+ self.abstract_command = true
9
+ self.command = 'crep'
10
+ self.version = Crep::VERSION
11
+ self.description = <<-DESC
12
+ Crep is a crash reporter
13
+ DESC
14
+ end
15
+ end
@@ -0,0 +1,43 @@
1
+ require 'crep/command'
2
+ require 'crep/crash_controller'
3
+ require 'crep/model/crash_sources/hockeyapp_crash_source'
4
+ require 'hockeyapp'
5
+
6
+ module Crep
7
+ class Crashes < Command
8
+ DEFAULT_TOP_COUNT = 5
9
+
10
+ def self.options
11
+ [
12
+ ['--top=5', "If set, Crep will show the top x crashes. #{DEFAULT_TOP_COUNT} by default."],
13
+ ['--identifier=<com.company.app>', 'Crep will show crashes for the app with this bundle identifier'],
14
+ ['--version=<7.10.0>', 'The version of the App.'],
15
+ ['--build=<24>', 'The Build number of the App.'],
16
+ ['--only-unresolved', 'If set, resolved crashes will be filtered out.']
17
+ ].concat(super)
18
+ end
19
+
20
+ self.summary = <<-DESC
21
+ Shows a list of crashes
22
+ DESC
23
+
24
+ self.description = <<-DESC
25
+ Besides the optional `top` parameter, Crep requires all other parameters.
26
+ DESC
27
+
28
+ def initialize(argv)
29
+ @show_only_unresolved = argv.flag?('only-unresolved', false)
30
+ @top = argv.option('top') || DEFAULT_TOP_COUNT
31
+ @bundle_identifier = argv.option('identifier') || raise('Missing `identifier` parameter')
32
+ @version = argv.option('version') || raise('Missing `version` parameter')
33
+ @build = argv.option('build') || raise('Missing `build` parameter')
34
+ super
35
+ end
36
+
37
+ def run
38
+ crash_datasource = HockeyAppCrashSource.new
39
+ crash_controller = CrashController.new(@bundle_identifier, @top, crash_datasource, @show_only_unresolved)
40
+ crash_controller.top_crashes(@version, @build)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,64 @@
1
+ require 'colorize'
2
+
3
+ module Crep
4
+ class CrashController
5
+ def initialize(bundle_identifier, top, crash_source, show_only_unresolved)
6
+ @bundle_identifier = bundle_identifier
7
+ @top = top
8
+ @crash_source = crash_source
9
+ @show_only_unresolved = show_only_unresolved
10
+ @crash_source.configure(bundle_identifier)
11
+ end
12
+
13
+ # returns list of top crashes for the given build
14
+ def top_crashes(version, build)
15
+ crashes = @crash_source.crashes(@top, version, build, @show_only_unresolved)
16
+ total_crashes = @crash_source.crash_count(version: version,
17
+ build: build)
18
+ report(crashes: crashes,
19
+ total_crashes: total_crashes,
20
+ app_name: @crash_source.app.name,
21
+ identifier: @crash_source.app.bundle_identifier,
22
+ version: version,
23
+ build: build)
24
+ end
25
+
26
+ def report(crashes:, total_crashes:, app_name:, identifier:, version:, build:)
27
+ puts("Reporting for #{app_name} (#{version}/#{build}) #{identifier}")
28
+
29
+ crash_reports = crashes_report(crashes: crashes, total_crashes: total_crashes, version: version)
30
+ empty_message = total_crashes == 0 ? "Look mom, no crashes... yet!" : "Look mom, no unresolved crashes... yet!"
31
+ puts(empty_message.green) if crash_reports.empty?
32
+
33
+ crash_reports.each_with_index do |crash_report, i|
34
+ puts("\n------------- ##{(i + 1)} --------------")
35
+ crash_report.each do |line|
36
+ puts(line)
37
+ end
38
+ end
39
+ end
40
+
41
+ def crashes_report(crashes:, total_crashes:, version:)
42
+ crashes.map do |crash|
43
+ percentage = crash_percentage(crash: crash, total_crashes: total_crashes)
44
+ crash_report(crash: crash, percentage: percentage, version: version)
45
+ end
46
+ end
47
+
48
+ def crash_percentage(crash:, total_crashes:)
49
+ crash.occurrences.to_f / total_crashes.to_f * 100.0
50
+ end
51
+
52
+ def crash_report(crash:, percentage:, version:)
53
+ raise 'Crash info does not fulfill the requirements' unless crash.is_a? Crep::Crash
54
+ report = []
55
+ report.push "Class: #{crash.crash_class}"
56
+ report.push "First appeared on #{crash.registered_at} and occurred #{crash.occurrences} times in #{version}"
57
+ report.push "Percentage: #{percentage.round(2)}% of all #{version} crashes"
58
+ report.push "File/Line: #{crash.file_line}"
59
+ report.push "Reason: #{crash.reason}" # crash.reason[0..80]
60
+ report.push "Link: #{crash.url}"
61
+ report
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,11 @@
1
+ module Crep
2
+ # App represents an App
3
+ class App
4
+ attr_reader :name, :bundle_identifier
5
+
6
+ def initialize(name, bundle_identifier)
7
+ @name = name
8
+ @bundle_identifier = bundle_identifier
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ module Crep
2
+ class Crash
3
+ attr_reader :file_line, :occurrences, :reason, :crash_class, :registered_at, :url
4
+
5
+ def initialize(file_line:, occurrences:, reason:, crash_class:, registered_at:, url:)
6
+ @file_line = file_line
7
+ @occurrences = occurrences
8
+ @reason = reason
9
+ @crash_class = crash_class
10
+ @registered_at = registered_at
11
+ @url = url
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ module Crep
2
+ # This is an abstract class that defines the methods which subclasses must implement.
3
+ class CrashSource
4
+ attr_reader :app
5
+
6
+ # Necessary configuration of the subclass can happen here
7
+ def configure(_bundle_identifier)
8
+ raise 'CrashSource subclass has to implement the `configure` method.'
9
+ end
10
+
11
+ def crash_count(_version, _build)
12
+ raise 'CrashSource subclass has to implement the `crash_count` method.'
13
+ end
14
+
15
+ def crashes(_top, _version, _build, _show_only_unresolved)
16
+ raise 'CrashSource subclass has to implement the `crashes` method.'
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,77 @@
1
+ require 'crep/model/crash_sources/crash_source'
2
+ require 'crep/model/crash_model/app'
3
+ require 'crep/model/crash_model/crash'
4
+ require 'hockeyapp'
5
+
6
+ module Crep
7
+ # The HockeyApp Crash Source
8
+ class HockeyAppCrashSource < CrashSource
9
+ def configure(bundle_identifier)
10
+ HockeyApp::Config.configure do |config|
11
+ raise 'Missing API token (CREP_HOCKEY_API_TOKEN)' unless ENV['CREP_HOCKEY_API_TOKEN']
12
+ config.token = ENV['CREP_HOCKEY_API_TOKEN']
13
+ end
14
+
15
+ @client = HockeyApp.build_client
16
+ @hockeyapp_app = hockeyapp(bundle_identifier, @client)
17
+ @app = App.new(@hockeyapp_app.title, bundle_identifier)
18
+ end
19
+
20
+ def crashes(top, version, build, show_only_unresolved)
21
+ version = version(version: version, build: build)
22
+ crash_groups(version, show_only_unresolved).take(top.to_i)
23
+ end
24
+
25
+ def crash_count(version:, build:)
26
+ statistics = @client.get_statistics @hockeyapp_app
27
+ statistics_filtered_by_version = statistics.select do |statistic|
28
+ statistic.shortversion == version && statistic.version == build
29
+ end
30
+ statistics_filtered_by_version.first.crashes
31
+ end
32
+
33
+ def crash_groups(version, show_only_unresolved)
34
+ reasons = version.crash_reasons('sort' => 'number_of_crashes', 'order' => 'desc')
35
+ unresolved_reasons = show_only_unresolved ? unresolved_reasons(reasons) : reasons
36
+ unresolved_reasons.map do |reason|
37
+ url = url(app_id: reason.app.public_identifier, version_id: version.id, reason_id: reason.id)
38
+ Crash.new(file_line: "#{reason.file}:#{reason.line}",
39
+ occurrences: reason.number_of_crashes,
40
+ reason: reason.reason,
41
+ crash_class: reason.crash_class,
42
+ registered_at: Date.parse(reason.created_at),
43
+ url: url)
44
+ end
45
+ end
46
+
47
+ def url(app_id:, version_id:, reason_id:)
48
+ "https://rink.hockeyapp.net/manage/apps/#{app_id}/app_versions/#{version_id}/crash_reasons/#{reason_id}"
49
+ end
50
+
51
+ def version(version:, build:)
52
+ filtered_versions = filtered_versions_by_version_and_build(@hockeyapp_app.versions, version, build)
53
+
54
+ raise "No version was found for #{version})#{build})" unless filtered_versions.count > 0
55
+
56
+ filtered_versions.first
57
+ end
58
+
59
+ def unresolved_reasons(reasons)
60
+ reasons.reject(&:fixed)
61
+ end
62
+
63
+ def hockeyapp(bundle_identifier, client)
64
+ all_apps = client.get_apps
65
+ apps = all_apps.select do |app|
66
+ app.bundle_identifier == bundle_identifier
67
+ end
68
+ apps.first
69
+ end
70
+
71
+ def filtered_versions_by_version_and_build(versions, version_filter, build_filter)
72
+ versions.select do |version|
73
+ (version.shortversion == version_filter) && (version.version == build_filter)
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,3 @@
1
+ module Crep
2
+ VERSION = '0.1.0'.freeze
3
+ end
metadata ADDED
@@ -0,0 +1,183 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: crep
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Kim Dung-Pham
8
+ - Bas Broek
9
+ - Serghei Moret
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2018-01-13 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hockeyapp
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: colorize
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: claide
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: 1.0.0
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: 1.0.0
57
+ - !ruby/object:Gem::Dependency
58
+ name: bundler
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '1.15'
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '1.15'
71
+ - !ruby/object:Gem::Dependency
72
+ name: pry
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ - !ruby/object:Gem::Dependency
86
+ name: rake
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '10.0'
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - "~>"
97
+ - !ruby/object:Gem::Version
98
+ version: '10.0'
99
+ - !ruby/object:Gem::Dependency
100
+ name: rspec
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ type: :development
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ - !ruby/object:Gem::Dependency
114
+ name: rubocop
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - '='
118
+ - !ruby/object:Gem::Version
119
+ version: 0.51.0
120
+ type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - '='
125
+ - !ruby/object:Gem::Version
126
+ version: 0.51.0
127
+ description: Create Crash Newsletter with ease. Really.
128
+ email:
129
+ - kim.dung-pham@xing.com
130
+ - bas.broek@xing.com
131
+ - serghei.moret@xing.com
132
+ executables:
133
+ - crep
134
+ extensions: []
135
+ extra_rdoc_files: []
136
+ files:
137
+ - ".gitignore"
138
+ - ".rspec"
139
+ - ".rubocop.yml"
140
+ - Changelog.md
141
+ - Gemfile
142
+ - LICENSE
143
+ - README.md
144
+ - Rakefile
145
+ - Vision.md
146
+ - bin/console
147
+ - bin/crep
148
+ - bin/setup
149
+ - crep.gemspec
150
+ - lib/crep.rb
151
+ - lib/crep/command.rb
152
+ - lib/crep/command/crashes.rb
153
+ - lib/crep/crash_controller.rb
154
+ - lib/crep/model/crash_model/app.rb
155
+ - lib/crep/model/crash_model/crash.rb
156
+ - lib/crep/model/crash_sources/crash_source.rb
157
+ - lib/crep/model/crash_sources/hockeyapp_crash_source.rb
158
+ - lib/crep/version.rb
159
+ homepage: https://github.com/xing/crep
160
+ licenses:
161
+ - MIT
162
+ metadata: {}
163
+ post_install_message:
164
+ rdoc_options: []
165
+ require_paths:
166
+ - lib
167
+ required_ruby_version: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ required_rubygems_version: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
177
+ requirements: []
178
+ rubyforge_project:
179
+ rubygems_version: 2.7.4
180
+ signing_key:
181
+ specification_version: 4
182
+ summary: Create Crash Newsletter with ease.
183
+ test_files: []