coaster 0.0.1

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
+ SHA1:
3
+ metadata.gz: 3b7564158224d85038b1ebc6acfbfef82b415270
4
+ data.tar.gz: 026329dfb6c81c3fa2dafebdb5208fcf2d5f61bb
5
+ SHA512:
6
+ metadata.gz: 15ccc912c7abd7b19e5d8224ea9533a506b6e0806af6998b67ad44d3aa78beb522c563e19a9a48cdb90fcce306f05f83895166d8f9c738d9384ebba096c615ff
7
+ data.tar.gz: 9eb1719871e71656eae29381aa6fd6794800e07115578c89649b20c913fe6a2e113be718bc6df2b2f5a61c94c61b81598ad886142391d4c96c14c499b7879256
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
4
+
data/Gemfile.lock ADDED
@@ -0,0 +1,67 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ coaster (0.0.1)
5
+ activesupport
6
+ i18n
7
+ rake
8
+
9
+ GEM
10
+ remote: http://rubygems.org/
11
+ specs:
12
+ activesupport (4.2.5)
13
+ i18n (~> 0.7)
14
+ json (~> 1.7, >= 1.7.7)
15
+ minitest (~> 5.1)
16
+ thread_safe (~> 0.3, >= 0.3.4)
17
+ tzinfo (~> 1.1)
18
+ binding_of_caller (0.7.2)
19
+ debug_inspector (>= 0.0.1)
20
+ byebug (8.2.1)
21
+ coderay (1.1.0)
22
+ debug_inspector (0.0.2)
23
+ i18n (0.7.0)
24
+ json (1.8.3)
25
+ metaclass (0.0.4)
26
+ method_source (0.8.2)
27
+ minitest (5.8.3)
28
+ mocha (1.1.0)
29
+ metaclass (~> 0.0.1)
30
+ pry (0.10.3)
31
+ coderay (~> 1.1.0)
32
+ method_source (~> 0.8.1)
33
+ slop (~> 3.4)
34
+ pry-byebug (3.3.0)
35
+ byebug (~> 8.0)
36
+ pry (~> 0.10)
37
+ pry-stack_explorer (0.4.9.2)
38
+ binding_of_caller (>= 0.7)
39
+ pry (>= 0.9.11)
40
+ rake (10.4.2)
41
+ shoulda (3.5.0)
42
+ shoulda-context (~> 1.0, >= 1.0.1)
43
+ shoulda-matchers (>= 1.4.1, < 3.0)
44
+ shoulda-context (1.2.1)
45
+ shoulda-matchers (2.8.0)
46
+ activesupport (>= 3.0.0)
47
+ slop (3.6.0)
48
+ thread_safe (0.3.5)
49
+ tzinfo (1.2.2)
50
+ thread_safe (~> 0.1)
51
+
52
+ PLATFORMS
53
+ ruby
54
+
55
+ DEPENDENCIES
56
+ bundler
57
+ coaster!
58
+ minitest
59
+ mocha
60
+ pry
61
+ pry-byebug
62
+ pry-stack_explorer
63
+ shoulda
64
+ shoulda-context
65
+
66
+ BUNDLED WITH
67
+ 1.10.6
data/MIT-LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Frograms, Inc.
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 all
13
+ 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 THE
21
+ SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ task :default => :test
5
+
6
+ require 'rake/testtask'
7
+
8
+ Rake::TestTask.new(:test) do |test|
9
+ test.libs << 'test'
10
+ test.verbose = true
11
+ end
data/coaster.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+ require 'coaster/version'
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = 'coaster'
6
+ s.description = 'Ruby Core Extensions'
7
+ s.version = Coaster::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.date = '2016-01-09'
10
+ s.summary = 'A little convenient feature for standard library'
11
+ s.homepage = 'http://github.com/frograms/coaster'
12
+ s.authors = ['buzz jung']
13
+ s.email = 'buzz@frograms.com'
14
+
15
+ s.files = Dir['**/*'].select{|f| File.file?(f)}
16
+ s.require_path = %w{lib}
17
+
18
+ s.add_dependency 'i18n'
19
+ s.add_dependency 'rake'
20
+ s.add_dependency 'activesupport'
21
+
22
+ s.add_development_dependency 'bundler'
23
+ s.add_development_dependency 'pry'
24
+ s.add_development_dependency 'pry-stack_explorer'
25
+ s.add_development_dependency 'pry-byebug'
26
+ s.add_development_dependency 'minitest'
27
+ s.add_development_dependency 'mocha'
28
+ s.add_development_dependency 'shoulda'
29
+ s.add_development_dependency 'shoulda-context'
30
+ end
data/lib/coaster.rb ADDED
@@ -0,0 +1,13 @@
1
+ require 'active_support/core_ext/module/attribute_accessors'
2
+
3
+ module Coaster
4
+ mattr_accessor :logger
5
+
6
+ class << self
7
+ def configure
8
+ yield self
9
+ end
10
+ end
11
+ end
12
+
13
+ require 'coaster/core_ext'
@@ -0,0 +1,2 @@
1
+ require_relative 'core_ext/object_translation'
2
+ require_relative 'core_ext/standard_error'
@@ -0,0 +1,82 @@
1
+ require 'i18n'
2
+
3
+ class Object
4
+ class << self
5
+ def _translate(*args)
6
+ options = args.last.is_a?(Hash) ? args.pop.dup : {}
7
+ options.merge!(_translate_params)
8
+
9
+ key = args.shift
10
+ subkey = nil
11
+
12
+ if key.is_a?(String)
13
+ if key.start_with?('.')
14
+ subkey = key
15
+ else
16
+ return I18n.t(key, *args, options)
17
+ end
18
+ elsif key.is_a?(Symbol)
19
+ subkey = ".#{key.to_s}"
20
+ elsif key.nil?
21
+ # do nothing
22
+ else
23
+ return I18n.t(key, *args, options)
24
+ end
25
+
26
+ key_class = options.delete(:class) || self
27
+ subkey = '.self' unless subkey
28
+ key = key_class.name.gsub(/::/, '.')
29
+ key = 'class.' + key + subkey
30
+
31
+ options.merge!(throw: true)
32
+ result = catch(:exception) do
33
+ I18n.t(key, *args, options)
34
+ end
35
+
36
+ if result.is_a?(I18n::MissingTranslation)
37
+ Coaster.logger && Coaster.logger.warn(result)
38
+ unless options.key?(:original_missing)
39
+ options.merge!(original_missing: result)
40
+ end
41
+
42
+ if key_class.superclass == Object || key_class == Object
43
+ options[:message] || options['message'] ||
44
+ (options[:original_missing] && options[:original_missing].message) ||
45
+ result.message
46
+ else
47
+ options[:class] = key_class.superclass
48
+ _translate(subkey, *args, options)
49
+ end
50
+ else
51
+ result
52
+ end
53
+ end
54
+
55
+ def _translate_params
56
+ {}
57
+ end
58
+ end
59
+
60
+ # Foo::Bar.new._translate #=> return translation 'class.Foo.Bar.self'
61
+ # Foo::Bar.new._translate('.title') #=> return translation 'class.Foo.Bar.title'
62
+ # Foo::Bar.new._translate('title') #=> return translation 'title'
63
+ # Foo::Bar.new._translate(:force) #=> ignore 'message' even if message exists
64
+ #
65
+ def _translate(*args)
66
+ options = args.last.is_a?(Hash) ? args.pop.dup : {}
67
+ key = args.shift || (respond_to?(:tkey) ? tkey : nil)
68
+
69
+ if !key.is_a?(String) && key != :force
70
+ if respond_to?(:message) && message.present? && message != 'false' && message != self.class.name
71
+ return message
72
+ end
73
+ end
74
+
75
+ options.merge!(_translate_params)
76
+ self.class._translate(key, *args, options)
77
+ end
78
+
79
+ def _translate_params
80
+ {}
81
+ end
82
+ end
@@ -0,0 +1,154 @@
1
+ require 'active_support/core_ext/hash/indifferent_access'
2
+ require 'active_support/core_ext/string'
3
+ require 'coaster/core_ext/object_translation'
4
+
5
+ class StandardError
6
+ cattr_accessor :cleaner
7
+
8
+ class << self
9
+ def status
10
+ 999999 # Unknown
11
+ end
12
+
13
+ def http_status
14
+ 500
15
+ end
16
+ end
17
+
18
+ attr_accessor :tags, :level, :tkey
19
+
20
+ def initialize(message = nil, cause = $!)
21
+ @tags = []
22
+ @level = 'error'
23
+ @attributes = HashWithIndifferentAccess.new
24
+ @tkey = nil
25
+
26
+ case message
27
+ when Exception
28
+ msg = message
29
+ set_backtrace(message.backtrace)
30
+ when StandardError
31
+ @tags = message.tags
32
+ @level = message.level
33
+ @tkey = message.tkey
34
+ @attributes = message.attributes
35
+ msg = message
36
+ set_backtrace(message.backtrace)
37
+ when Hash then
38
+ hash = message.with_indifferent_access rescue message
39
+ msg = hash[:message]
40
+ msg = hash[:msg] if msg.nil?
41
+ msg = hash[:m] if msg.nil?
42
+ @tags = Array(hash.delete(:tags) || hash.delete(:tag))
43
+ @level = hash.delete(:level) || hash.delete(:severity) || @level
44
+ @tkey = hash.delete(:tkey)
45
+ msg = cause.message if msg.nil? && cause
46
+ @attributes.merge!(hash)
47
+ when String, NilClass then
48
+ msg = message
49
+ when FalseClass then
50
+ msg = false
51
+ else
52
+ msg = message
53
+ @attributes[:object] = message
54
+ end
55
+
56
+ msg = nil if msg == false
57
+ super(msg)
58
+ set_backtrace(cause.backtrace) if cause
59
+ end
60
+
61
+ def status
62
+ self.class.status
63
+ end
64
+
65
+ def attributes
66
+ if cause && cause.respond_to?(:attributes)
67
+ cause.attributes.merge(@attributes)
68
+ else
69
+ @attributes
70
+ end
71
+ end
72
+ alias_method :attr, :attributes
73
+
74
+ def http_status
75
+ attributes[:http_status] || self.class.http_status
76
+ end
77
+
78
+ def description
79
+ attributes[:description] || attributes[:desc] || message
80
+ end
81
+ alias_method :desc, :description
82
+
83
+ def object
84
+ attributes[:object] || attributes[:obj]
85
+ end
86
+ alias_method :obj, :object
87
+
88
+ def to_hash
89
+ hash = @attributes.merge(
90
+ type: self.class.name, status: status,
91
+ http_status: http_status, message: message
92
+ )
93
+ if cause
94
+ if cause.respond_to?(:to_hash)
95
+ hash[:cause] = cause.to_hash
96
+ else
97
+ hash[:cause] = cause
98
+ end
99
+ end
100
+ hash
101
+ end
102
+
103
+ def translate_params
104
+ attributes.merge(
105
+ type: self.class.name, status: status,
106
+ http_status: http_status, message: message
107
+ )
108
+ end
109
+
110
+ def to_json
111
+ Oj.dump(to_hash.with_indifferent_access, mode: :compat)
112
+ end
113
+
114
+ def to_detail
115
+ lg = "[#{self.class.name}] status:#{status}"
116
+ lg += "\n\tMESSAGE: #{message.gsub(/\n/, "\n\t\t")}"
117
+ instance_variables.each do |var|
118
+ unless var.to_s.start_with?('@_')
119
+ lg += "\n\t#{var}: #{instance_variable_get(var).inspect}"
120
+ end
121
+ end
122
+ if cause
123
+ if cause.respond_to?(:to_detail)
124
+ lg += "\n\tCAUSE: "
125
+ lg += cause.to_detail.strip.gsub(/\n/, "\n\t")
126
+ else
127
+ lg += "\n\tCAUSE: #{cause.class.name}: #{cause.message.gsub(/\n/, "\n\t\t")}"
128
+ end
129
+ end
130
+ lg << "\n"
131
+ end
132
+
133
+ def logging(options = {})
134
+ logger = options[:logger]
135
+ logger = Rails.logger if logger.nil? && defined?(Rails)
136
+ return nil unless logger
137
+
138
+ cl = options[:cleaner] || cleaner
139
+ msg = to_detail
140
+
141
+ if cl && backtrace
142
+ msg += "\t\t"
143
+ msg += cleaner.clean(backtrace).join("\n\t\t")
144
+ end
145
+
146
+ logger.tagged(*tags) do
147
+ if logger.respond_to?(level)
148
+ logger.send(level, msg)
149
+ else
150
+ logger.error(msg)
151
+ end
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,31 @@
1
+ class StandardError
2
+ attr_accessor :raven
3
+
4
+ alias_method :initialize_original, :initialize
5
+ def initialize(message = nil, cause = $!)
6
+ initialize_original(message, cause)
7
+ @raven = attributes.delete(:raven) || {}
8
+ end
9
+
10
+ def capture(options = {})
11
+ notes = raven.merge(options || {})
12
+
13
+ self.tags += Array(notes[:fingerprint])
14
+ notes[:fingerprint] = self.tags
15
+ notes[:level] ||= self.level
16
+ notes[:extra] = (notes[:extra] || {}).merge(attributes)
17
+
18
+ Raven.annotate_exception(self, notes)
19
+ Raven.capture_exception(self)
20
+ rescue => e
21
+ msg = "#{e.class.name}: #{e.message}"
22
+ msg += "\n\t" + e.backtrace.join("\n\t")
23
+ Raven.logger.error(msg)
24
+ end
25
+
26
+ alias_method :just_logging, :logging
27
+ def logging(options = {})
28
+ capture(options[:raven])
29
+ just_logging(options)
30
+ end
31
+ end
@@ -0,0 +1,3 @@
1
+ module Coaster
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,12 @@
1
+ en:
2
+ class:
3
+ Coaster:
4
+ self: 'Coaster Translated'
5
+ SampleObject:
6
+ self: 'Coaster SampleObject Translated'
7
+ title: 'Coaster SampleObject Title'
8
+ TestStandardError:
9
+ SampleError:
10
+ test: 'Test this translation'
11
+ sample:
12
+ title: 'Sample Title'
@@ -0,0 +1,8 @@
1
+ ENV['DEBUG'] = 'true'
2
+
3
+ require 'minitest'
4
+ require 'pry'
5
+
6
+ require 'rubygems'
7
+ require 'bundler/setup'
8
+ require 'coaster'
@@ -0,0 +1,56 @@
1
+ require 'test_helper'
2
+ require 'minitest/autorun'
3
+ require 'active_support/core_ext/hash/indifferent_access'
4
+
5
+ module Coaster
6
+
7
+ class SampleObject < String
8
+ end
9
+
10
+ class NotTranslated
11
+ end
12
+
13
+ class Inherited < SampleObject
14
+ end
15
+
16
+ class TestObjectTranslation < Minitest::Test
17
+ def setup
18
+ I18n.backend = I18n::Backend::Simple.new
19
+ I18n.load_path += [File.expand_path('../locales/en.yml', __FILE__)]
20
+ I18n.enforce_available_locales = false
21
+ end
22
+
23
+ def test_translation
24
+ assert_equal 'Coaster SampleObject Translated', SampleObject._translate
25
+ end
26
+
27
+ def test_translation_missing
28
+ assert_equal 'translation missing: en.class.Coaster.NotTranslated.self', NotTranslated._translate
29
+ end
30
+
31
+ def test_translation_sub
32
+ assert_equal 'Coaster SampleObject Title', SampleObject._translate('.title')
33
+ assert_equal 'Coaster SampleObject Title', SampleObject._translate(:title)
34
+ end
35
+
36
+ def test_translation_with_key
37
+ assert_equal 'Sample Title', SampleObject._translate('sample.title')
38
+ end
39
+
40
+ def test_translation_inheritance
41
+ assert_equal 'Coaster SampleObject Translated', Inherited._translate
42
+ assert_equal 'Coaster SampleObject Title', Inherited._translate(:title)
43
+ end
44
+
45
+ def teardown
46
+ I18n.locale = nil
47
+ I18n.default_locale = nil
48
+ I18n.load_path = nil
49
+ I18n.available_locales = nil
50
+ I18n.backend = nil
51
+ I18n.default_separator = nil
52
+ I18n.enforce_available_locales = true
53
+ super
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,96 @@
1
+ require 'test_helper'
2
+ require 'minitest/autorun'
3
+ require 'active_support/core_ext/hash/indifferent_access'
4
+
5
+ module Coaster
6
+ class TestStandardError < Minitest::Test
7
+ class SampleError < StandardError
8
+ def self.status; 10 end
9
+ end
10
+
11
+ class ExampleError < StandardError
12
+ def self.status; 20 end
13
+ end
14
+
15
+ def setup
16
+ I18n.backend = I18n::Backend::Simple.new
17
+ I18n.load_path += [File.expand_path('../locales/en.yml', __FILE__)]
18
+ I18n.enforce_available_locales = false
19
+ end
20
+
21
+ def test_message
22
+ raise SampleError, {m: 'beer is proof'}
23
+ rescue => e
24
+ assert_equal 'beer is proof', e.message
25
+ end
26
+
27
+ def test_attributes
28
+ raise SampleError, {blah: 'foo'}
29
+ rescue => e
30
+ assert_equal 'foo', e.attr[:blah]
31
+ end
32
+
33
+ def test_hash
34
+ begin
35
+ raise SampleError, {frog: 'rams'}
36
+ rescue => e
37
+ raise ExampleError, {wat: 'cha'}
38
+ end
39
+ rescue => e
40
+ assert_equal({
41
+ "wat"=>"cha",
42
+ "type"=>"Coaster::TestStandardError::ExampleError",
43
+ "status"=>20,
44
+ "http_status"=>500,
45
+ "message"=>"Coaster::TestStandardError::SampleError",
46
+ "cause"=>{
47
+ "frog"=>"rams",
48
+ "type"=>"Coaster::TestStandardError::SampleError",
49
+ "status"=>10,
50
+ "http_status"=>500,
51
+ "message"=>"Coaster::TestStandardError::SampleError"
52
+ }
53
+ }, e.to_hash)
54
+ end
55
+
56
+ def test_cause_attributes
57
+ begin
58
+ raise SampleError, {frog: 'rams'}
59
+ rescue => e
60
+ raise ExampleError, {wat: 'cha'}
61
+ end
62
+ rescue => e
63
+ assert_equal({frog: 'rams', wat: 'cha'}.with_indifferent_access, e.attr)
64
+ end
65
+
66
+ def test_to_detail
67
+ begin
68
+ raise SampleError, {frog: 'rams'}
69
+ rescue => e
70
+ raise ExampleError, {wat: 'cha'}
71
+ end
72
+ rescue => e
73
+ detail = <<-LOG
74
+ [Coaster::TestStandardError::ExampleError] status:20
75
+ MESSAGE: Coaster::TestStandardError::SampleError
76
+ @tags: []
77
+ @level: \"error\"
78
+ @attributes: {\"wat\"=>\"cha\"}
79
+ @tkey: nil
80
+ CAUSE: [Coaster::TestStandardError::SampleError] status:10
81
+ MESSAGE: Coaster::TestStandardError::SampleError
82
+ @tags: []
83
+ @level: \"error\"
84
+ @attributes: {\"frog\"=>\"rams\"}
85
+ @tkey: nil
86
+ LOG
87
+ assert_equal(detail, e.to_detail)
88
+ end
89
+
90
+ def test_translation
91
+ raise SampleError, {tkey: '.test'}
92
+ rescue => e
93
+ assert_equal e._translate, 'Test this translation'
94
+ end
95
+ end
96
+ end
metadata ADDED
@@ -0,0 +1,212 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: coaster
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - buzz jung
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-01-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: i18n
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activesupport
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry-stack_explorer
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry-byebug
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: minitest
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: mocha
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: shoulda
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: shoulda-context
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ description: Ruby Core Extensions
168
+ email: buzz@frograms.com
169
+ executables: []
170
+ extensions: []
171
+ extra_rdoc_files: []
172
+ files:
173
+ - Gemfile
174
+ - Gemfile.lock
175
+ - MIT-LICENSE
176
+ - Rakefile
177
+ - coaster.gemspec
178
+ - lib/coaster.rb
179
+ - lib/coaster/core_ext.rb
180
+ - lib/coaster/core_ext/object_translation.rb
181
+ - lib/coaster/core_ext/standard_error.rb
182
+ - lib/coaster/core_ext/standard_error/raven.rb
183
+ - lib/coaster/version.rb
184
+ - test/locales/en.yml
185
+ - test/test_helper.rb
186
+ - test/test_object_translation.rb
187
+ - test/test_standard_error.rb
188
+ homepage: http://github.com/frograms/coaster
189
+ licenses: []
190
+ metadata: {}
191
+ post_install_message:
192
+ rdoc_options: []
193
+ require_paths:
194
+ - lib
195
+ required_ruby_version: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ required_rubygems_version: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: '0'
205
+ requirements: []
206
+ rubyforge_project:
207
+ rubygems_version: 2.4.5.1
208
+ signing_key:
209
+ specification_version: 4
210
+ summary: A little convenient feature for standard library
211
+ test_files: []
212
+ has_rdoc: