hashie 3.5.1 → 3.5.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -1
- data/README.md +15 -1
- data/Rakefile +17 -1
- data/UPGRADING.md +14 -1
- data/lib/hashie.rb +1 -2
- data/lib/hashie/logger.rb +8 -1
- data/lib/hashie/mash.rb +28 -2
- data/lib/hashie/version.rb +1 -1
- data/spec/hashie/mash_spec.rb +31 -2
- data/spec/hashie_spec.rb +5 -5
- data/spec/integration/omniauth/integration_spec.rb +1 -1
- data/spec/integration/rails/integration_spec.rb +66 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/support/integration_specs.rb +36 -0
- data/spec/support/logger.rb +3 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee11cc424479d1ff5f737d9279f60e182adb0553
|
4
|
+
data.tar.gz: 7bae504b1c65b8cf79909c3180cf5084771efb5e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6af54aa6435ee5df457614baf9a60a0d3660e7066229e90a74109ff38999afda2444a02e965ec9f5422e4ddd85e6a493d3cb52ff735712d8dfd8d02c84f504f8
|
7
|
+
data.tar.gz: a2ed6b577219d2a7e6ebaca2ca5589b29af9b89a1201580707ab39d4895c0cbee63f4dd4e92a5c3ccda1409f226fc0ccbce41e0b7f8e6a694f6d85df7e598d60
|
data/CHANGELOG.md
CHANGED
@@ -6,13 +6,31 @@ scheme are considered to be bugs.
|
|
6
6
|
|
7
7
|
[semver]: http://semver.org/spec/v2.0.0.html
|
8
8
|
|
9
|
+
## [3.5.2] - 2017-02-10
|
10
|
+
|
11
|
+
[3.5.2]: https://github.com/intridea/hashie/compare/v3.5.1...v3.5.2
|
12
|
+
|
13
|
+
### Added
|
14
|
+
|
15
|
+
* [#395](https://github.com/intridea/hashie/pull/395): Add the ability to disable warnings in Mash subclasses - [@michaelherold](https://github.com/michaelherold).
|
16
|
+
* [#400](https://github.com/intridea/hashie/pull/400): Fix Hashie.logger load and set the Hashie logger to the Rails logger in a Rails environment - [@michaelherold](https://github.com/michaelherold).
|
17
|
+
|
18
|
+
### Fixed
|
19
|
+
|
20
|
+
* [#396](https://github.com/intridea/hashie/pull/396): Fix for specs in #381: Incorrect use of shared context meant example was not being run - [@biinari](https://github.com/biinari).
|
21
|
+
* [#399](https://github.com/intridea/hashie/pull/399): Fix passing Pathname object to Hashie::Mesh.load() - [@albb0920](https://github.com/albb0920).
|
22
|
+
|
23
|
+
### Miscellanous
|
24
|
+
|
25
|
+
* [#397](https://github.com/intridea/hashie/pull/397): Add the integration specs harness into the main test tasks - [@michaelherold](https://github.com/michaelherold).
|
26
|
+
|
9
27
|
## [3.5.1] - 2017-01-31
|
10
28
|
|
11
29
|
* [#392](https://github.com/intridea/hashie/pull/392): Fix for #391: Require all dependencies of Hashie::Mash - [@dblock](https://github.com/dblock).
|
12
30
|
|
13
31
|
[3.5.1]: https://github.com/intridea/hashie/compare/v3.5.0...v3.5.1
|
14
32
|
|
15
|
-
## [3.5.0] - 2017-01-31
|
33
|
+
## [3.5.0] - 2017-01-31
|
16
34
|
|
17
35
|
* [#386](https://github.com/intridea/hashie/pull/386): Fix for #385: Make `deep_merge` always `deep_dup` nested hashes before merging them in so that there are no shared references between the two hashes being merged. - [@mltsy](https://github.com/mltsy).
|
18
36
|
* [#389](https://github.com/intridea/hashie/pull/389): Support Ruby 2.4.0 - [@camelmasa](https://github.com/camelmasa).
|
data/README.md
CHANGED
@@ -20,7 +20,7 @@ $ gem install hashie
|
|
20
20
|
|
21
21
|
## Upgrading
|
22
22
|
|
23
|
-
You're reading the documentation for the stable release of Hashie, 3.5.
|
23
|
+
You're reading the documentation for the stable release of Hashie, 3.5.2. Please read [UPGRADING](UPGRADING.md) when upgrading from a previous version.
|
24
24
|
|
25
25
|
## Hash Extensions
|
26
26
|
|
@@ -531,6 +531,20 @@ mash = Mash.load('data/user.csv', parser: MyCustomCsvParser)
|
|
531
531
|
mash[1] #=> { name: 'John', lastname: 'Doe' }
|
532
532
|
```
|
533
533
|
|
534
|
+
Since Mash gives you the ability to set arbitrary keys that then act as methods, Hashie logs when there is a conflict between a key and a pre-existing method. You can set the logger that this logs message to via the global Hashie logger:
|
535
|
+
|
536
|
+
```ruby
|
537
|
+
Hashie.logger = Rails.logger
|
538
|
+
```
|
539
|
+
|
540
|
+
You can also disable the logging in subclasses of Mash:
|
541
|
+
|
542
|
+
```ruby
|
543
|
+
class Response < Hashie::Mash
|
544
|
+
disable_warnings
|
545
|
+
end
|
546
|
+
```
|
547
|
+
|
534
548
|
### Mash Extension: SafeAssignment
|
535
549
|
|
536
550
|
This extension can be mixed into a Mash to guard the attempted overwriting of methods by property setters. When mixed in, the Mash will raise an `ArgumentError` if you attempt to write a property with the same name as an existing method.
|
data/Rakefile
CHANGED
@@ -13,4 +13,20 @@ end
|
|
13
13
|
require 'rubocop/rake_task'
|
14
14
|
RuboCop::RakeTask.new(:rubocop)
|
15
15
|
|
16
|
-
|
16
|
+
require_relative 'spec/support/integration_specs'
|
17
|
+
task :integration_specs do
|
18
|
+
next if ENV['CI']
|
19
|
+
status_codes = []
|
20
|
+
handler = lambda do |status_code|
|
21
|
+
status_codes << status_code unless status_code.zero?
|
22
|
+
end
|
23
|
+
|
24
|
+
run_all_integration_specs(handler: handler, logger: ->(msg) { puts msg })
|
25
|
+
|
26
|
+
if status_codes.any?
|
27
|
+
$stderr.puts "#{status_codes.size} integration test(s) failed"
|
28
|
+
exit status_codes.last
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
task default: [:rubocop, :spec, :integration_specs]
|
data/UPGRADING.md
CHANGED
@@ -1,6 +1,19 @@
|
|
1
1
|
Upgrading Hashie
|
2
2
|
================
|
3
3
|
|
4
|
+
### Upgrading to 3.5.2
|
5
|
+
|
6
|
+
#### Disable logging in Mash subclasses
|
7
|
+
|
8
|
+
If you subclass `Hashie::Mash`, you can now disable the logging we do about
|
9
|
+
overriding existing methods with keys. This looks like:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
class MyMash < Hashie::Mash
|
13
|
+
disable_warnings
|
14
|
+
end
|
15
|
+
```
|
16
|
+
|
4
17
|
### Upgrading to 3.4.7
|
5
18
|
|
6
19
|
#### Procs as default values for Dash
|
@@ -11,7 +24,7 @@ class MyHash < Hashie::Dash
|
|
11
24
|
end
|
12
25
|
```
|
13
26
|
|
14
|
-
In versions < 3.4.7 `Time.now` will be evaluated when `time` property is accessed directly first time.
|
27
|
+
In versions < 3.4.7 `Time.now` will be evaluated when `time` property is accessed directly first time.
|
15
28
|
In version >= 3.4.7 `Time.now` is evaluated in time of object initialization.
|
16
29
|
### Upgrading to 3.4.4
|
17
30
|
|
data/lib/hashie.rb
CHANGED
data/lib/hashie/logger.rb
CHANGED
@@ -1,9 +1,16 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
1
3
|
module Hashie
|
2
4
|
# The logger that Hashie uses for reporting errors.
|
3
5
|
#
|
4
6
|
# @return [Logger]
|
5
7
|
def self.logger
|
6
|
-
@logger ||=
|
8
|
+
@logger ||=
|
9
|
+
if defined?(::Rails)
|
10
|
+
Rails.logger
|
11
|
+
else
|
12
|
+
Logger.new(STDOUT)
|
13
|
+
end
|
7
14
|
end
|
8
15
|
|
9
16
|
# Sets the logger that Hashie uses for reporting errors.
|
data/lib/hashie/mash.rb
CHANGED
@@ -63,6 +63,29 @@ module Hashie
|
|
63
63
|
|
64
64
|
ALLOWED_SUFFIXES = %w(? ! = _)
|
65
65
|
|
66
|
+
class CannotDisableMashWarnings < StandardError
|
67
|
+
def initialize(message = 'You cannot disable warnings on the base Mash class. Please subclass the Mash and disable it in the subclass.')
|
68
|
+
super(message)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# Disable the logging of warnings based on keys conflicting keys/methods
|
73
|
+
#
|
74
|
+
# @api semipublic
|
75
|
+
# @return [void]
|
76
|
+
def self.disable_warnings
|
77
|
+
fail CannotDisableMashWarnings if self == Hashie::Mash
|
78
|
+
@disable_warnings = true
|
79
|
+
end
|
80
|
+
|
81
|
+
# Checks whether this class disables warnings for conflicting keys/methods
|
82
|
+
#
|
83
|
+
# @api semipublic
|
84
|
+
# @return [Boolean]
|
85
|
+
def self.disable_warnings?
|
86
|
+
!!@disable_warnings
|
87
|
+
end
|
88
|
+
|
66
89
|
def self.load(path, options = {})
|
67
90
|
@_mashes ||= new
|
68
91
|
|
@@ -111,9 +134,10 @@ module Hashie
|
|
111
134
|
# a string before it is set, and Hashes will be converted
|
112
135
|
# into Mashes for nesting purposes.
|
113
136
|
def custom_writer(key, value, convert = true) #:nodoc:
|
114
|
-
key_as_symbol = key.to_sym
|
137
|
+
key_as_symbol = (key = convert_key(key)).to_sym
|
138
|
+
|
115
139
|
log_built_in_message(key_as_symbol) if methods.include?(key_as_symbol)
|
116
|
-
regular_writer(
|
140
|
+
regular_writer(key, convert ? convert_value(value) : value)
|
117
141
|
end
|
118
142
|
|
119
143
|
alias_method :[], :custom_reader
|
@@ -303,6 +327,8 @@ module Hashie
|
|
303
327
|
private
|
304
328
|
|
305
329
|
def log_built_in_message(method_key)
|
330
|
+
return if self.class.disable_warnings?
|
331
|
+
|
306
332
|
method_information = Hashie::Utils.method_information(method(method_key))
|
307
333
|
|
308
334
|
Hashie.logger.warn(
|
data/lib/hashie/version.rb
CHANGED
data/spec/hashie/mash_spec.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'delegate'
|
3
2
|
|
4
3
|
describe Hashie::Mash do
|
5
4
|
subject { Hashie::Mash.new }
|
6
5
|
|
6
|
+
include_context 'with a logger'
|
7
|
+
|
7
8
|
it 'inherits from Hash' do
|
8
9
|
expect(subject.is_a?(Hash)).to be_truthy
|
9
10
|
end
|
@@ -134,12 +135,26 @@ describe Hashie::Mash do
|
|
134
135
|
expect(subject.type).to eq 'Steve'
|
135
136
|
end
|
136
137
|
|
137
|
-
|
138
|
+
include_context 'with a logger' do
|
138
139
|
it 'logs a warning when overriding built-in methods' do
|
139
140
|
Hashie::Mash.new('trust' => { 'two' => 2 })
|
140
141
|
|
141
142
|
expect(logger_output).to match('Hashie::Mash#trust')
|
142
143
|
end
|
144
|
+
|
145
|
+
it 'does not write to the logger when warnings are disabled' do
|
146
|
+
mash_class = Class.new(Hashie::Mash) do
|
147
|
+
disable_warnings
|
148
|
+
end
|
149
|
+
|
150
|
+
mash_class.new('trust' => { 'two' => 2 })
|
151
|
+
|
152
|
+
expect(logger_output).to be_blank
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'cannot disable logging on the base Mash' do
|
156
|
+
expect { Hashie::Mash.disable_warnings }.to raise_error(Hashie::Mash::CannotDisableMashWarnings)
|
157
|
+
end
|
143
158
|
end
|
144
159
|
|
145
160
|
context 'updating' do
|
@@ -617,6 +632,20 @@ describe Hashie::Mash do
|
|
617
632
|
end
|
618
633
|
end
|
619
634
|
|
635
|
+
context 'if the file is passed as Pathname' do
|
636
|
+
require 'pathname'
|
637
|
+
let(:path) { Pathname.new('database.yml') }
|
638
|
+
|
639
|
+
before do
|
640
|
+
expect(File).to receive(:file?).with(path).and_return(true)
|
641
|
+
expect(parser).to receive(:perform).with(path).and_return(config)
|
642
|
+
end
|
643
|
+
|
644
|
+
it 'return a Mash from a file' do
|
645
|
+
expect(subject.production.foo).to eq config['production']['foo']
|
646
|
+
end
|
647
|
+
end
|
648
|
+
|
620
649
|
describe 'results are cached' do
|
621
650
|
let(:parser) { double(:parser) }
|
622
651
|
|
data/spec/hashie_spec.rb
CHANGED
@@ -2,12 +2,12 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
RSpec.describe Hashie do
|
4
4
|
describe '.logger' do
|
5
|
-
|
6
|
-
it 'is available via an accessor' do
|
7
|
-
Hashie.logger.info('Fee fi fo fum')
|
5
|
+
include_context 'with a logger'
|
8
6
|
|
9
|
-
|
10
|
-
|
7
|
+
it 'is available via an accessor' do
|
8
|
+
Hashie.logger.info('Fee fi fo fum')
|
9
|
+
|
10
|
+
expect(logger_output).to match('Fee fi fo fum')
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
ENV['RACK_ENV'] = 'test'
|
2
|
+
|
3
|
+
require 'rspec/core'
|
4
|
+
require 'rails'
|
5
|
+
require 'rails/all'
|
6
|
+
require 'action_view/testing/resolvers'
|
7
|
+
|
8
|
+
module RailsApp
|
9
|
+
class Application < ::Rails::Application
|
10
|
+
config.action_dispatch.show_exceptions = false
|
11
|
+
config.active_support.deprecation = :stderr
|
12
|
+
config.eager_load = false
|
13
|
+
config.root = __dir__
|
14
|
+
config.secret_key_base = 'hashieintegrationtest'
|
15
|
+
|
16
|
+
routes.append do
|
17
|
+
get '/' => 'application#index'
|
18
|
+
end
|
19
|
+
|
20
|
+
config.assets.paths << File.join(__dir__, 'assets/javascripts')
|
21
|
+
config.assets.debug = true
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
LAYOUT = <<-HTML
|
26
|
+
<!DOCTYPE html>
|
27
|
+
<html>
|
28
|
+
<head>
|
29
|
+
<title>TestApp</title>
|
30
|
+
<%= stylesheet_link_tag "application", :media => "all" %>
|
31
|
+
<%= javascript_include_tag "application" %>
|
32
|
+
<%= csrf_meta_tags %>
|
33
|
+
</head>
|
34
|
+
<body>
|
35
|
+
<%= yield %>
|
36
|
+
</body>
|
37
|
+
</html>
|
38
|
+
HTML
|
39
|
+
|
40
|
+
INDEX = <<-HTML
|
41
|
+
<h1>Hello, world!</h1>
|
42
|
+
HTML
|
43
|
+
|
44
|
+
class ApplicationController < ActionController::Base
|
45
|
+
include Rails.application.routes.url_helpers
|
46
|
+
|
47
|
+
layout 'application'
|
48
|
+
|
49
|
+
self.view_paths = [ActionView::FixtureResolver.new(
|
50
|
+
'layouts/application.html.erb' => LAYOUT,
|
51
|
+
'application/index.html.erb' => INDEX
|
52
|
+
)]
|
53
|
+
|
54
|
+
def index
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
RailsApp::Application.initialize!
|
59
|
+
|
60
|
+
require 'hashie'
|
61
|
+
|
62
|
+
RSpec.describe 'the Hashie logger' do
|
63
|
+
it 'is set to the Rails logger' do
|
64
|
+
expect(Hashie.logger).to eq(Rails.logger)
|
65
|
+
end
|
66
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,36 @@
|
|
1
|
+
# Generates the bundle command for running an integration test
|
2
|
+
#
|
3
|
+
# @param [String] integration the integration folder to run
|
4
|
+
# @param [String] command the command to run
|
5
|
+
# @return [String]
|
6
|
+
def integration_command(integration, command)
|
7
|
+
"#{integration_gemfile(integration)} #{command}"
|
8
|
+
end
|
9
|
+
|
10
|
+
# Generates the Gemfile for an integration
|
11
|
+
#
|
12
|
+
# @param [String] integration the integration test name
|
13
|
+
# @return [String]
|
14
|
+
def integration_gemfile(integration)
|
15
|
+
"BUNDLE_GEMFILE=#{integration_path(integration)}/Gemfile"
|
16
|
+
end
|
17
|
+
|
18
|
+
# Generates the path to the integration
|
19
|
+
#
|
20
|
+
# @param [String] integration the integration test name
|
21
|
+
# @return [String]
|
22
|
+
def integration_path(integration)
|
23
|
+
"spec/integration/#{integration}"
|
24
|
+
end
|
25
|
+
|
26
|
+
# Runs all integration specs in their own environment
|
27
|
+
def run_all_integration_specs(handler: ->(_code) {}, logger: ->(_msg) {})
|
28
|
+
Dir['spec/integration/*']
|
29
|
+
.map { |directory| directory.split('/').last }
|
30
|
+
.each do |integration|
|
31
|
+
logger.call(%(Running "#{integration}" integration spec))
|
32
|
+
system(integration_command(integration, 'bundle --quiet'))
|
33
|
+
system(integration_command(integration, "bundle exec rspec #{integration_path(integration)}"))
|
34
|
+
handler.call($CHILD_STATUS.exitstatus)
|
35
|
+
end
|
36
|
+
end
|
data/spec/support/logger.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
# A shared context that allows you to check the output of Hashie's logger.
|
2
2
|
#
|
3
3
|
# @example
|
4
|
-
#
|
4
|
+
# include_context 'with a logger'
|
5
|
+
#
|
6
|
+
# it 'logs info message' do
|
5
7
|
# Hashie.logger.info 'What is happening in here?!'
|
6
8
|
#
|
7
9
|
# expect(logger_output).to match('What is happening in here?!')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hashie
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.5.
|
4
|
+
version: 3.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Bleigh
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-02-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -132,7 +132,9 @@ files:
|
|
132
132
|
- spec/hashie/version_spec.rb
|
133
133
|
- spec/hashie_spec.rb
|
134
134
|
- spec/integration/omniauth/integration_spec.rb
|
135
|
+
- spec/integration/rails/integration_spec.rb
|
135
136
|
- spec/spec_helper.rb
|
137
|
+
- spec/support/integration_specs.rb
|
136
138
|
- spec/support/logger.rb
|
137
139
|
- spec/support/module_context.rb
|
138
140
|
- spec/support/ruby_version_check.rb
|
@@ -191,7 +193,9 @@ test_files:
|
|
191
193
|
- spec/hashie/version_spec.rb
|
192
194
|
- spec/hashie_spec.rb
|
193
195
|
- spec/integration/omniauth/integration_spec.rb
|
196
|
+
- spec/integration/rails/integration_spec.rb
|
194
197
|
- spec/spec_helper.rb
|
198
|
+
- spec/support/integration_specs.rb
|
195
199
|
- spec/support/logger.rb
|
196
200
|
- spec/support/module_context.rb
|
197
201
|
- spec/support/ruby_version_check.rb
|