jones-gem 2.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +1 -0
  3. data/.rubocop.yml +74 -0
  4. data/.travis.yml +47 -0
  5. data/Gemfile +38 -0
  6. data/LICENSE +201 -0
  7. data/README.md +132 -0
  8. data/Rakefile +29 -0
  9. data/changelog.md +442 -0
  10. data/docs/Makefile +130 -0
  11. data/docs/breadcrumbs.rst +51 -0
  12. data/docs/conf.py +228 -0
  13. data/docs/config.rst +260 -0
  14. data/docs/context.rst +141 -0
  15. data/docs/index.rst +113 -0
  16. data/docs/install.rst +40 -0
  17. data/docs/integrations/heroku.rst +11 -0
  18. data/docs/integrations/index.rst +59 -0
  19. data/docs/integrations/puma.rst +30 -0
  20. data/docs/integrations/rack.rst +27 -0
  21. data/docs/integrations/rails.rst +84 -0
  22. data/docs/make.bat +155 -0
  23. data/docs/processors.rst +124 -0
  24. data/docs/sentry-doc-config.json +31 -0
  25. data/docs/usage.rst +176 -0
  26. data/exe/raven +32 -0
  27. data/jones-gem.gemspec +22 -0
  28. data/lib/raven.rb +3 -0
  29. data/lib/raven/backtrace.rb +137 -0
  30. data/lib/raven/base.rb +106 -0
  31. data/lib/raven/breadcrumbs.rb +76 -0
  32. data/lib/raven/breadcrumbs/activesupport.rb +19 -0
  33. data/lib/raven/breadcrumbs/logger.rb +93 -0
  34. data/lib/raven/cli.rb +59 -0
  35. data/lib/raven/client.rb +142 -0
  36. data/lib/raven/configuration.rb +434 -0
  37. data/lib/raven/context.rb +43 -0
  38. data/lib/raven/event.rb +259 -0
  39. data/lib/raven/instance.rb +221 -0
  40. data/lib/raven/integrations/delayed_job.rb +58 -0
  41. data/lib/raven/integrations/rack-timeout.rb +19 -0
  42. data/lib/raven/integrations/rack.rb +139 -0
  43. data/lib/raven/integrations/rails.rb +79 -0
  44. data/lib/raven/integrations/rails/active_job.rb +55 -0
  45. data/lib/raven/integrations/rails/controller_methods.rb +13 -0
  46. data/lib/raven/integrations/rails/controller_transaction.rb +13 -0
  47. data/lib/raven/integrations/rails/overrides/debug_exceptions_catcher.rb +31 -0
  48. data/lib/raven/integrations/rails/overrides/streaming_reporter.rb +23 -0
  49. data/lib/raven/integrations/railties.rb +1 -0
  50. data/lib/raven/integrations/rake.rb +18 -0
  51. data/lib/raven/integrations/sidekiq.rb +87 -0
  52. data/lib/raven/integrations/tasks.rb +11 -0
  53. data/lib/raven/interface.rb +25 -0
  54. data/lib/raven/interfaces/exception.rb +15 -0
  55. data/lib/raven/interfaces/http.rb +16 -0
  56. data/lib/raven/interfaces/message.rb +20 -0
  57. data/lib/raven/interfaces/single_exception.rb +14 -0
  58. data/lib/raven/interfaces/stack_trace.rb +69 -0
  59. data/lib/raven/linecache.rb +41 -0
  60. data/lib/raven/logger.rb +19 -0
  61. data/lib/raven/processor.rb +15 -0
  62. data/lib/raven/processor/cookies.rb +26 -0
  63. data/lib/raven/processor/http_headers.rb +55 -0
  64. data/lib/raven/processor/post_data.rb +22 -0
  65. data/lib/raven/processor/removecircularreferences.rb +17 -0
  66. data/lib/raven/processor/removestacktrace.rb +24 -0
  67. data/lib/raven/processor/sanitizedata.rb +88 -0
  68. data/lib/raven/processor/utf8conversion.rb +52 -0
  69. data/lib/raven/transports.rb +15 -0
  70. data/lib/raven/transports/dummy.rb +16 -0
  71. data/lib/raven/transports/http.rb +66 -0
  72. data/lib/raven/utils/deep_merge.rb +22 -0
  73. data/lib/raven/utils/real_ip.rb +62 -0
  74. data/lib/raven/version.rb +5 -0
  75. data/lib/sentry-raven-without-integrations.rb +1 -0
  76. data/lib/sentry-raven.rb +1 -0
  77. metadata +141 -0
@@ -0,0 +1,22 @@
1
+ module Raven
2
+ class Processor::PostData < Processor
3
+ def process(data)
4
+ process_if_symbol_keys(data) if data[:request]
5
+ process_if_string_keys(data) if data["request"]
6
+
7
+ data
8
+ end
9
+
10
+ private
11
+
12
+ def process_if_symbol_keys(data)
13
+ return unless data[:request][:method] == "POST"
14
+ data[:request][:data] = STRING_MASK
15
+ end
16
+
17
+ def process_if_string_keys(data)
18
+ return unless data["request"]["method"] == "POST"
19
+ data["request"]["data"] = STRING_MASK
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,17 @@
1
+ module Raven
2
+ class Processor::RemoveCircularReferences < Processor
3
+ def process(value, visited = [])
4
+ return "(...)" if visited.include?(value.__id__)
5
+ visited << value.__id__ if value.is_a?(Array) || value.is_a?(Hash)
6
+
7
+ case value
8
+ when Hash
9
+ !value.frozen? ? value.merge!(value) { |_, v| process v, visited } : value.merge(value) { |_, v| process v, visited }
10
+ when Array
11
+ !value.frozen? ? value.map! { |v| process v, visited } : value.map { |v| process v, visited }
12
+ else
13
+ value
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,24 @@
1
+ module Raven
2
+ class Processor::RemoveStacktrace < Processor
3
+ def process(data)
4
+ process_if_symbol_keys(data) if data[:exception]
5
+ process_if_string_keys(data) if data["exception"]
6
+
7
+ data
8
+ end
9
+
10
+ private
11
+
12
+ def process_if_symbol_keys(data)
13
+ data[:exception][:values].map do |single_exception|
14
+ single_exception.delete(:stacktrace) if single_exception[:stacktrace]
15
+ end
16
+ end
17
+
18
+ def process_if_string_keys(data)
19
+ data["exception"]["values"].map do |single_exception|
20
+ single_exception.delete("stacktrace") if single_exception["stacktrace"]
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+ require 'json'
3
+
4
+ module Raven
5
+ class Processor::SanitizeData < Processor
6
+ DEFAULT_FIELDS = %w(authorization password passwd secret ssn social(.*)?sec).freeze
7
+ CREDIT_CARD_RE = /\b(?:3[47]\d|(?:4\d|5[1-5]|65)\d{2}|6011)\d{12}\b/
8
+ QUERY_STRING = ['query_string', :query_string].freeze
9
+ JSON_STARTS_WITH = ["[", "{"].freeze
10
+
11
+ attr_accessor :sanitize_fields, :sanitize_credit_cards, :sanitize_fields_excluded
12
+
13
+ def initialize(client)
14
+ super
15
+ self.sanitize_fields = client.configuration.sanitize_fields
16
+ self.sanitize_credit_cards = client.configuration.sanitize_credit_cards
17
+ self.sanitize_fields_excluded = client.configuration.sanitize_fields_excluded
18
+ end
19
+
20
+ def process(value, key = nil)
21
+ case value
22
+ when Hash
23
+ !value.frozen? ? value.merge!(value) { |k, v| process v, k } : value.merge(value) { |k, v| process v, k }
24
+ when Array
25
+ !value.frozen? ? value.map! { |v| process v, key } : value.map { |v| process v, key }
26
+ when Integer
27
+ matches_regexes?(key, value.to_s) ? INT_MASK : value
28
+ when String
29
+ if value =~ fields_re && (json = parse_json_or_nil(value))
30
+ # if this string is actually a json obj, convert and sanitize
31
+ process(json).to_json
32
+ elsif matches_regexes?(key, value)
33
+ STRING_MASK
34
+ elsif QUERY_STRING.include?(key)
35
+ sanitize_query_string(value)
36
+ else
37
+ value
38
+ end
39
+ else
40
+ value
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ # CGI.parse takes our nice UTF-8 strings and converts them back to ASCII,
47
+ # so we have to convert them back, again.
48
+ def utf8_processor
49
+ @utf8_processor ||= Processor::UTF8Conversion.new
50
+ end
51
+
52
+ def sanitize_query_string(query_string)
53
+ query_hash = CGI.parse(query_string)
54
+ sanitized = utf8_processor.process(query_hash)
55
+ processed_query_hash = process(sanitized)
56
+ URI.encode_www_form(processed_query_hash)
57
+ end
58
+
59
+ def matches_regexes?(k, v)
60
+ (sanitize_credit_cards && v =~ CREDIT_CARD_RE) ||
61
+ k =~ fields_re
62
+ end
63
+
64
+ def fields_re
65
+ return @fields_re if instance_variable_defined?(:@fields_re)
66
+ fields = DEFAULT_FIELDS | sanitize_fields
67
+ fields -= sanitize_fields_excluded
68
+ @fields_re = /#{fields.map do |f|
69
+ use_boundary?(f) ? "\\b#{f}\\b" : f
70
+ end.join("|")}/i
71
+ end
72
+
73
+ def use_boundary?(string)
74
+ !DEFAULT_FIELDS.include?(string) && !special_characters?(string)
75
+ end
76
+
77
+ def special_characters?(string)
78
+ REGEX_SPECIAL_CHARACTERS.select { |r| string.include?(r) }.any?
79
+ end
80
+
81
+ def parse_json_or_nil(string)
82
+ return unless string.start_with?(*JSON_STARTS_WITH)
83
+ JSON.parse(string)
84
+ rescue JSON::ParserError, NoMethodError
85
+ nil
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,52 @@
1
+ module Raven
2
+ class Processor::UTF8Conversion < Processor
3
+ # Slightly misnamed - actually just removes any bytes with invalid encoding
4
+ # Previously, our JSON backend required UTF-8. Since we now use the built-in
5
+ # JSON, we can use any encoding, but it must be valid anyway so we can do
6
+ # things like call #match and #slice on strings
7
+ REPLACE = "".freeze
8
+
9
+ def process(value)
10
+ case value
11
+ when Hash
12
+ !value.frozen? ? value.merge!(value) { |_, v| process v } : value.merge(value) { |_, v| process v }
13
+ when Array
14
+ !value.frozen? ? value.map! { |v| process v } : value.map { |v| process v }
15
+ when Exception
16
+ return value if value.message.valid_encoding?
17
+ clean_exc = value.class.new(remove_invalid_bytes(value.message))
18
+ clean_exc.set_backtrace(value.backtrace)
19
+ clean_exc
20
+ when String
21
+ # Encoding::BINARY / Encoding::ASCII_8BIT is a special binary encoding.
22
+ # valid_encoding? will always return true because it contains all codepoints,
23
+ # so instead we check if it only contains actual ASCII codepoints, and if
24
+ # not we assume it's actually just UTF8 and scrub accordingly.
25
+ if value.encoding == Encoding::BINARY && !value.ascii_only?
26
+ value = value.dup
27
+ value.force_encoding(Encoding::UTF_8)
28
+ end
29
+ return value if value.valid_encoding?
30
+ remove_invalid_bytes(value)
31
+ else
32
+ value
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ # Stolen from RSpec
39
+ # https://github.com/rspec/rspec-support/blob/f0af3fd74a94ff7bb700f6ba06dbdc67bba17fbf/lib/rspec/support/encoded_string.rb#L120-L139
40
+ if String.method_defined?(:scrub) # 2.1+
41
+ def remove_invalid_bytes(string)
42
+ string.scrub!(REPLACE)
43
+ end
44
+ else
45
+ def remove_invalid_bytes(string)
46
+ string.chars.map do |char|
47
+ char.valid_encoding? ? char : REPLACE
48
+ end.join
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,15 @@
1
+ module Raven
2
+ module Transports
3
+ class Transport
4
+ attr_accessor :configuration
5
+
6
+ def initialize(configuration)
7
+ @configuration = configuration
8
+ end
9
+
10
+ def send_event # (auth_header, data, options = {})
11
+ raise NotImplementedError, 'Abstract method not implemented'
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ module Raven
2
+ module Transports
3
+ class Dummy < Transport
4
+ attr_accessor :events
5
+
6
+ def initialize(*)
7
+ super
8
+ @events = []
9
+ end
10
+
11
+ def send_event(auth_header, data, options = {})
12
+ @events << [auth_header, data, options]
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,66 @@
1
+ require 'faraday'
2
+
3
+ require 'raven/transports'
4
+
5
+ module Raven
6
+ module Transports
7
+ class HTTP < Transport
8
+ attr_accessor :conn, :adapter
9
+
10
+ def initialize(*args)
11
+ super
12
+ self.adapter = configuration.http_adapter || Faraday.default_adapter
13
+ self.conn = set_conn
14
+ end
15
+
16
+ def send_event(auth_header, data, options = {})
17
+ unless configuration.sending_allowed?
18
+ logger.debug("Event not sent: #{configuration.error_messages}")
19
+ end
20
+
21
+ project_id = configuration[:project_id]
22
+ path = configuration[:path] + "/"
23
+
24
+ conn.post "#{path}api/#{project_id}/store/" do |req|
25
+ req.headers['Content-Type'] = options[:content_type]
26
+ req.headers['X-Sentry-Auth'] = auth_header
27
+ req.body = data
28
+ end
29
+ rescue Faraday::Error => ex
30
+ error_info = ex.message
31
+ if ex.response && ex.response[:headers]['x-sentry-error']
32
+ error_info += " Error in headers is: #{ex.response[:headers]['x-sentry-error']}"
33
+ end
34
+ raise Raven::Error, error_info
35
+ end
36
+
37
+ private
38
+
39
+ def set_conn
40
+ configuration.logger.debug "Raven HTTP Transport connecting to #{configuration.server}"
41
+
42
+ Faraday.new(configuration.server, :ssl => ssl_configuration) do |builder|
43
+ configuration.faraday_builder.call(builder) if configuration.faraday_builder
44
+ builder.response :raise_error
45
+ builder.options.merge! faraday_opts
46
+ builder.headers[:user_agent] = "sentry-ruby/#{Raven::VERSION}"
47
+ builder.adapter(*adapter)
48
+ end
49
+ end
50
+
51
+ # TODO: deprecate and replace where possible w/Faraday Builder
52
+ def faraday_opts
53
+ [:proxy, :timeout, :open_timeout].each_with_object({}) do |opt, memo|
54
+ memo[opt] = configuration.public_send(opt) if configuration.public_send(opt)
55
+ end
56
+ end
57
+
58
+ def ssl_configuration
59
+ (configuration.ssl || {}).merge(
60
+ :verify => configuration.ssl_verification,
61
+ :ca_file => configuration.ssl_ca_file
62
+ )
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,22 @@
1
+ module Raven
2
+ module Utils
3
+ # ported from ActiveSupport
4
+ module DeepMergeHash
5
+ def self.deep_merge(hash, other_hash, &block)
6
+ deep_merge!(hash, other_hash, &block)
7
+ end
8
+
9
+ def self.deep_merge!(hash, other_hash, &block)
10
+ hash.merge!(other_hash) do |key, this_val, other_val|
11
+ if this_val.is_a?(Hash) && other_val.is_a?(Hash)
12
+ deep_merge(this_val, other_val, &block)
13
+ elsif block_given?
14
+ block.call(key, this_val, other_val)
15
+ else
16
+ other_val
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,62 @@
1
+ require 'ipaddr'
2
+
3
+ # Based on ActionDispatch::RemoteIp. All security-related precautions from that
4
+ # middleware have been removed, because the Event IP just needs to be accurate,
5
+ # and spoofing an IP here only makes data inaccurate, not insecure. Don't re-use
6
+ # this module if you have to *trust* the IP address.
7
+ module Raven
8
+ module Utils
9
+ class RealIp
10
+ LOCAL_ADDRESSES = [
11
+ "127.0.0.1", # localhost IPv4
12
+ "::1", # localhost IPv6
13
+ "fc00::/7", # private IPv6 range fc00::/7
14
+ "10.0.0.0/8", # private IPv4 range 10.x.x.x
15
+ "172.16.0.0/12", # private IPv4 range 172.16.0.0 .. 172.31.255.255
16
+ "192.168.0.0/16", # private IPv4 range 192.168.x.x
17
+ ].map { |proxy| IPAddr.new(proxy) }
18
+
19
+ attr_accessor :ip, :ip_addresses
20
+
21
+ def initialize(ip_addresses)
22
+ self.ip_addresses = ip_addresses
23
+ end
24
+
25
+ def calculate_ip
26
+ # CGI environment variable set by Rack
27
+ remote_addr = ips_from(ip_addresses[:remote_addr]).last
28
+
29
+ # Could be a CSV list and/or repeated headers that were concatenated.
30
+ client_ips = ips_from(ip_addresses[:client_ip])
31
+ real_ips = ips_from(ip_addresses[:real_ip])
32
+ forwarded_ips = ips_from(ip_addresses[:forwarded_for])
33
+
34
+ ips = [client_ips, real_ips, forwarded_ips, remote_addr].flatten.compact
35
+
36
+ # If every single IP option is in the trusted list, just return REMOTE_ADDR
37
+ self.ip = filter_local_addresses(ips).first || remote_addr
38
+ end
39
+
40
+ protected
41
+
42
+ def ips_from(header)
43
+ # Split the comma-separated list into an array of strings
44
+ ips = header ? header.strip.split(/[,\s]+/) : []
45
+ ips.select do |ip|
46
+ begin
47
+ # Only return IPs that are valid according to the IPAddr#new method
48
+ range = IPAddr.new(ip).to_range
49
+ # we want to make sure nobody is sneaking a netmask in
50
+ range.begin == range.end
51
+ rescue ArgumentError
52
+ nil
53
+ end
54
+ end
55
+ end
56
+
57
+ def filter_local_addresses(ips)
58
+ ips.reject { |ip| LOCAL_ADDRESSES.any? { |proxy| proxy === ip } }
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ module Raven
3
+ # Freezing this constant breaks in 1.9.x
4
+ VERSION = "2.7.2" # rubocop:disable Style/MutableConstant
5
+ end
@@ -0,0 +1 @@
1
+ require 'raven/base'
@@ -0,0 +1 @@
1
+ require "raven"
metadata ADDED
@@ -0,0 +1,141 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jones-gem
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.7.2
5
+ platform: ruby
6
+ authors:
7
+ - Alec Jones
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-03-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.7.6
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '1.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 0.7.6
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '1.0'
33
+ description: A gem that provides a client interface for the Jones error logger
34
+ email: alecaej2002@gmail.com
35
+ executables:
36
+ - raven
37
+ extensions: []
38
+ extra_rdoc_files:
39
+ - README.md
40
+ - LICENSE
41
+ files:
42
+ - ".rspec"
43
+ - ".rubocop.yml"
44
+ - ".travis.yml"
45
+ - Gemfile
46
+ - LICENSE
47
+ - README.md
48
+ - Rakefile
49
+ - changelog.md
50
+ - docs/Makefile
51
+ - docs/breadcrumbs.rst
52
+ - docs/conf.py
53
+ - docs/config.rst
54
+ - docs/context.rst
55
+ - docs/index.rst
56
+ - docs/install.rst
57
+ - docs/integrations/heroku.rst
58
+ - docs/integrations/index.rst
59
+ - docs/integrations/puma.rst
60
+ - docs/integrations/rack.rst
61
+ - docs/integrations/rails.rst
62
+ - docs/make.bat
63
+ - docs/processors.rst
64
+ - docs/sentry-doc-config.json
65
+ - docs/usage.rst
66
+ - exe/raven
67
+ - jones-gem.gemspec
68
+ - lib/raven.rb
69
+ - lib/raven/backtrace.rb
70
+ - lib/raven/base.rb
71
+ - lib/raven/breadcrumbs.rb
72
+ - lib/raven/breadcrumbs/activesupport.rb
73
+ - lib/raven/breadcrumbs/logger.rb
74
+ - lib/raven/cli.rb
75
+ - lib/raven/client.rb
76
+ - lib/raven/configuration.rb
77
+ - lib/raven/context.rb
78
+ - lib/raven/event.rb
79
+ - lib/raven/instance.rb
80
+ - lib/raven/integrations/delayed_job.rb
81
+ - lib/raven/integrations/rack-timeout.rb
82
+ - lib/raven/integrations/rack.rb
83
+ - lib/raven/integrations/rails.rb
84
+ - lib/raven/integrations/rails/active_job.rb
85
+ - lib/raven/integrations/rails/controller_methods.rb
86
+ - lib/raven/integrations/rails/controller_transaction.rb
87
+ - lib/raven/integrations/rails/overrides/debug_exceptions_catcher.rb
88
+ - lib/raven/integrations/rails/overrides/streaming_reporter.rb
89
+ - lib/raven/integrations/railties.rb
90
+ - lib/raven/integrations/rake.rb
91
+ - lib/raven/integrations/sidekiq.rb
92
+ - lib/raven/integrations/tasks.rb
93
+ - lib/raven/interface.rb
94
+ - lib/raven/interfaces/exception.rb
95
+ - lib/raven/interfaces/http.rb
96
+ - lib/raven/interfaces/message.rb
97
+ - lib/raven/interfaces/single_exception.rb
98
+ - lib/raven/interfaces/stack_trace.rb
99
+ - lib/raven/linecache.rb
100
+ - lib/raven/logger.rb
101
+ - lib/raven/processor.rb
102
+ - lib/raven/processor/cookies.rb
103
+ - lib/raven/processor/http_headers.rb
104
+ - lib/raven/processor/post_data.rb
105
+ - lib/raven/processor/removecircularreferences.rb
106
+ - lib/raven/processor/removestacktrace.rb
107
+ - lib/raven/processor/sanitizedata.rb
108
+ - lib/raven/processor/utf8conversion.rb
109
+ - lib/raven/transports.rb
110
+ - lib/raven/transports/dummy.rb
111
+ - lib/raven/transports/http.rb
112
+ - lib/raven/utils/deep_merge.rb
113
+ - lib/raven/utils/real_ip.rb
114
+ - lib/raven/version.rb
115
+ - lib/sentry-raven-without-integrations.rb
116
+ - lib/sentry-raven.rb
117
+ homepage: https://github.com/alecj1240/jones-gem
118
+ licenses:
119
+ - Apache-2.0
120
+ metadata: {}
121
+ post_install_message:
122
+ rdoc_options: []
123
+ require_paths:
124
+ - lib
125
+ required_ruby_version: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: 1.9.0
130
+ required_rubygems_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ requirements: []
136
+ rubyforge_project:
137
+ rubygems_version: 2.6.12
138
+ signing_key:
139
+ specification_version: 4
140
+ summary: A gem that provides a client interface for the Jones error logger
141
+ test_files: []