hashie 4.0.0 → 4.1.0
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 +213 -187
- data/CONTRIBUTING.md +13 -6
- data/README.md +33 -9
- data/UPGRADING.md +5 -5
- data/hashie.gemspec +11 -6
- data/lib/hashie.rb +1 -0
- data/lib/hashie/extensions/dash/property_translation.rb +1 -1
- data/lib/hashie/extensions/deep_merge.rb +18 -1
- data/lib/hashie/extensions/mash/permissive_respond_to.rb +61 -0
- data/lib/hashie/extensions/parsers/yaml_erb_parser.rb +19 -2
- data/lib/hashie/extensions/ruby_version_check.rb +5 -1
- data/lib/hashie/mash.rb +31 -26
- data/lib/hashie/utils.rb +28 -0
- data/lib/hashie/version.rb +1 -1
- metadata +16 -131
- data/spec/hashie/array_spec.rb +0 -29
- data/spec/hashie/clash_spec.rb +0 -70
- data/spec/hashie/dash_spec.rb +0 -608
- data/spec/hashie/extensions/autoload_spec.rb +0 -24
- data/spec/hashie/extensions/coercion_spec.rb +0 -648
- data/spec/hashie/extensions/dash/coercion_spec.rb +0 -13
- data/spec/hashie/extensions/dash/indifferent_access_spec.rb +0 -84
- data/spec/hashie/extensions/deep_fetch_spec.rb +0 -97
- data/spec/hashie/extensions/deep_find_spec.rb +0 -144
- data/spec/hashie/extensions/deep_locate_spec.rb +0 -138
- data/spec/hashie/extensions/deep_merge_spec.rb +0 -74
- data/spec/hashie/extensions/ignore_undeclared_spec.rb +0 -48
- data/spec/hashie/extensions/indifferent_access_spec.rb +0 -295
- data/spec/hashie/extensions/indifferent_access_with_rails_hwia_spec.rb +0 -208
- data/spec/hashie/extensions/key_conversion_spec.rb +0 -12
- data/spec/hashie/extensions/mash/define_accessors_spec.rb +0 -90
- data/spec/hashie/extensions/mash/keep_original_keys_spec.rb +0 -46
- data/spec/hashie/extensions/mash/safe_assignment_spec.rb +0 -50
- data/spec/hashie/extensions/mash/symbolize_keys_spec.rb +0 -39
- data/spec/hashie/extensions/merge_initializer_spec.rb +0 -23
- data/spec/hashie/extensions/method_access_spec.rb +0 -233
- data/spec/hashie/extensions/strict_key_access_spec.rb +0 -109
- data/spec/hashie/extensions/stringify_keys_spec.rb +0 -124
- data/spec/hashie/extensions/symbolize_keys_spec.rb +0 -131
- data/spec/hashie/hash_spec.rb +0 -123
- data/spec/hashie/mash_spec.rb +0 -1077
- data/spec/hashie/parsers/yaml_erb_parser_spec.rb +0 -46
- data/spec/hashie/rash_spec.rb +0 -83
- data/spec/hashie/trash_spec.rb +0 -334
- data/spec/hashie/utils_spec.rb +0 -25
- data/spec/hashie/version_spec.rb +0 -7
- data/spec/hashie_spec.rb +0 -13
- data/spec/integration/elasticsearch/integration_spec.rb +0 -41
- data/spec/integration/omniauth-oauth2/app.rb +0 -52
- data/spec/integration/omniauth-oauth2/integration_spec.rb +0 -26
- data/spec/integration/omniauth-oauth2/some_site.rb +0 -38
- data/spec/integration/omniauth/app.rb +0 -11
- data/spec/integration/omniauth/integration_spec.rb +0 -38
- data/spec/integration/rails-without-dependency/integration_spec.rb +0 -15
- data/spec/integration/rails/app.rb +0 -40
- data/spec/integration/rails/integration_spec.rb +0 -47
- data/spec/spec_helper.rb +0 -23
- data/spec/support/integration_specs.rb +0 -36
- data/spec/support/logger.rb +0 -24
- data/spec/support/module_context.rb +0 -11
- data/spec/support/ruby_version_check.rb +0 -6
data/spec/hashie/utils_spec.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
def a_method_to_match_against
|
4
|
-
'Hello world!'
|
5
|
-
end
|
6
|
-
|
7
|
-
RSpec.describe Hashie::Utils do
|
8
|
-
describe '.method_information' do
|
9
|
-
it 'states the module or class that a native method was defined in' do
|
10
|
-
bound_method = method(:trust)
|
11
|
-
|
12
|
-
message = Hashie::Utils.method_information(bound_method)
|
13
|
-
|
14
|
-
expect(message).to match('Kernel')
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'states the line a Ruby method was defined at' do
|
18
|
-
bound_method = method(:a_method_to_match_against)
|
19
|
-
|
20
|
-
message = Hashie::Utils.method_information(bound_method)
|
21
|
-
|
22
|
-
expect(message).to match('spec/hashie/utils_spec.rb')
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/spec/hashie/version_spec.rb
DELETED
data/spec/hashie_spec.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe Hashie do
|
4
|
-
describe '.logger' do
|
5
|
-
include_context 'with a logger'
|
6
|
-
|
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
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
require 'elasticsearch/model'
|
2
|
-
require 'hashie'
|
3
|
-
|
4
|
-
RSpec.configure do |config|
|
5
|
-
config.expect_with :rspec do |expect|
|
6
|
-
expect.syntax = :expect
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
class MyModel < Hashie::Mash
|
11
|
-
include Elasticsearch::Model
|
12
|
-
|
13
|
-
disable_warnings
|
14
|
-
|
15
|
-
index_name 'model'
|
16
|
-
document_type 'model'
|
17
|
-
end
|
18
|
-
|
19
|
-
RSpec.describe 'elaasticsearch-model' do
|
20
|
-
# See https://github.com/intridea/hashie/issues/354#issuecomment-363306114
|
21
|
-
# for the reason why this doesn't work as you would expect
|
22
|
-
it 'raises an error when the model does has an id' do
|
23
|
-
object = MyModel.new
|
24
|
-
stub_elasticsearch_client
|
25
|
-
|
26
|
-
expect { object.__elasticsearch__.index_document }.to raise_error(NameError)
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'does not raise an error when the model has an id' do
|
30
|
-
object = MyModel.new(id: 123)
|
31
|
-
stub_elasticsearch_client
|
32
|
-
|
33
|
-
expect { object.__elasticsearch__.index_document }.not_to raise_error
|
34
|
-
end
|
35
|
-
|
36
|
-
def stub_elasticsearch_client
|
37
|
-
response = double('Response', body: '{}')
|
38
|
-
allow_any_instance_of(Elasticsearch::Transport::Client).to\
|
39
|
-
receive(:perform_request) { response }
|
40
|
-
end
|
41
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
require 'action_controller/railtie'
|
2
|
-
require 'action_view/railtie'
|
3
|
-
require 'action_view/testing/resolvers'
|
4
|
-
require 'rails/test_unit/railtie'
|
5
|
-
require_relative 'some_site'
|
6
|
-
|
7
|
-
module RailsApp
|
8
|
-
class Application < ::Rails::Application
|
9
|
-
config.eager_load = false
|
10
|
-
config.secret_key_base = 'hashieintegrationtest'
|
11
|
-
|
12
|
-
config.middleware.use OmniAuth::Builder do
|
13
|
-
provider :some_site
|
14
|
-
end
|
15
|
-
|
16
|
-
routes.append do
|
17
|
-
get '/' => 'application#index'
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
LAYOUT = <<-HTML.freeze
|
23
|
-
<!DOCTYPE html>
|
24
|
-
<html>
|
25
|
-
<head>
|
26
|
-
<title>TestApp</title>
|
27
|
-
<%= csrf_meta_tags %>
|
28
|
-
</head>
|
29
|
-
<body>
|
30
|
-
<%= yield %>
|
31
|
-
</body>
|
32
|
-
</html>
|
33
|
-
HTML
|
34
|
-
|
35
|
-
INDEX = '<h1>Hello, world!</h1>'.freeze
|
36
|
-
|
37
|
-
class ApplicationController < ActionController::Base
|
38
|
-
include Rails.application.routes.url_helpers
|
39
|
-
|
40
|
-
layout 'application'
|
41
|
-
|
42
|
-
self.view_paths = [ActionView::FixtureResolver.new(
|
43
|
-
'layouts/application.html.erb' => LAYOUT,
|
44
|
-
'application/index.html.erb' => INDEX
|
45
|
-
)]
|
46
|
-
|
47
|
-
def index; end
|
48
|
-
end
|
49
|
-
|
50
|
-
Bundler.require(:default, Rails.env)
|
51
|
-
|
52
|
-
RailsApp::Application.initialize!
|
@@ -1,26 +0,0 @@
|
|
1
|
-
ENV['RAILS_ENV'] = 'test'
|
2
|
-
|
3
|
-
require 'rspec/core'
|
4
|
-
|
5
|
-
RSpec.describe 'omniauth-oauth2 inside of rails', type: :request do
|
6
|
-
let(:stdout) { StringIO.new }
|
7
|
-
|
8
|
-
around(:each) do |example|
|
9
|
-
original_stdout = $stdout
|
10
|
-
$stdout = stdout
|
11
|
-
require_relative 'app'
|
12
|
-
require 'rspec/rails'
|
13
|
-
example.run
|
14
|
-
$stdout = original_stdout
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'does not log anything to STDOUT when initializing a Rails app and is set to Rails logger' do
|
18
|
-
expect(stdout.string).to eq('')
|
19
|
-
expect(Hashie.logger).to eq(Rails.logger)
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'works' do
|
23
|
-
get '/'
|
24
|
-
assert_select 'h1', 'Hello, world!'
|
25
|
-
end
|
26
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
require 'omniauth-oauth2'
|
2
|
-
|
3
|
-
module OmniAuth
|
4
|
-
module Strategies
|
5
|
-
class SomeSite < OmniAuth::Strategies::OAuth2
|
6
|
-
# Give your strategy a name.
|
7
|
-
option :name, 'some_site'
|
8
|
-
|
9
|
-
# This is where you pass the options you would pass when
|
10
|
-
# initializing your consumer from the OAuth gem.
|
11
|
-
option :client_options, site: 'https://api.somesite.com'
|
12
|
-
|
13
|
-
# These are called after authentication has succeeded. If
|
14
|
-
# possible, you should try to set the UID without making
|
15
|
-
# additional calls (if the user id is returned with the token
|
16
|
-
# or as a URI parameter). This may not be possible with all
|
17
|
-
# providers.
|
18
|
-
uid { raw_info['id'] }
|
19
|
-
|
20
|
-
info do
|
21
|
-
{
|
22
|
-
name: raw_info['name'],
|
23
|
-
email: raw_info['email']
|
24
|
-
}
|
25
|
-
end
|
26
|
-
|
27
|
-
extra do
|
28
|
-
{
|
29
|
-
'raw_info' => raw_info
|
30
|
-
}
|
31
|
-
end
|
32
|
-
|
33
|
-
def raw_info
|
34
|
-
@raw_info ||= access_token.get('/me').parsed
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
ENV['RACK_ENV'] = 'test'
|
2
|
-
|
3
|
-
require 'rspec/core'
|
4
|
-
require 'rack/test'
|
5
|
-
|
6
|
-
RSpec.configure do |config|
|
7
|
-
config.expect_with :rspec do |expect|
|
8
|
-
expect.syntax = :expect
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
RSpec.describe 'omniauth' do
|
13
|
-
include Rack::Test::Methods
|
14
|
-
|
15
|
-
def app
|
16
|
-
MyApplication
|
17
|
-
end
|
18
|
-
|
19
|
-
let(:stdout) { StringIO.new }
|
20
|
-
|
21
|
-
around(:each) do |example|
|
22
|
-
original_stdout = $stdout
|
23
|
-
$stdout = stdout
|
24
|
-
require_relative 'app'
|
25
|
-
example.run
|
26
|
-
$stdout = original_stdout
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'does not log anything to STDOUT when initializing' do
|
30
|
-
expect(stdout.string).to eq('')
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'works' do
|
34
|
-
get '/'
|
35
|
-
expect(last_response).to be_ok
|
36
|
-
expect(last_response.body).to eq 'Hello World'
|
37
|
-
end
|
38
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'rspec/core'
|
2
|
-
|
3
|
-
RSpec.describe 'partial-rails' do
|
4
|
-
context 'when Rails constant is present but the railties are not' do
|
5
|
-
before(:all) do
|
6
|
-
class Rails
|
7
|
-
# A class about railways
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'does not raise an exception when we require hashie' do
|
12
|
-
expect { require 'hashie' }.not_to raise_error
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'action_controller/railtie'
|
2
|
-
require 'action_view/railtie'
|
3
|
-
require 'action_view/testing/resolvers'
|
4
|
-
require 'rails/test_unit/railtie'
|
5
|
-
|
6
|
-
module RailsApp
|
7
|
-
class Application < ::Rails::Application
|
8
|
-
config.eager_load = false
|
9
|
-
config.secret_key_base = 'hashieintegrationtest'
|
10
|
-
|
11
|
-
routes.append do
|
12
|
-
get '/' => 'application#index'
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
PAGE = <<-HTML.freeze
|
18
|
-
<!DOCTYPE html>
|
19
|
-
<html>
|
20
|
-
<head>
|
21
|
-
<title>TestApp</title>
|
22
|
-
<%= csrf_meta_tags %>
|
23
|
-
</head>
|
24
|
-
<body>
|
25
|
-
<h1>Hello, world!</h1>
|
26
|
-
</body>
|
27
|
-
</html>
|
28
|
-
HTML
|
29
|
-
|
30
|
-
class ApplicationController < ActionController::Base
|
31
|
-
include Rails.application.routes.url_helpers
|
32
|
-
|
33
|
-
def index
|
34
|
-
render inline: PAGE
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
Bundler.require(:default, Rails.env)
|
39
|
-
|
40
|
-
RailsApp::Application.initialize!
|
@@ -1,47 +0,0 @@
|
|
1
|
-
ENV['RAILS_ENV'] = 'test'
|
2
|
-
|
3
|
-
require 'rspec/core'
|
4
|
-
|
5
|
-
RSpec.describe 'rails', type: :request do
|
6
|
-
let(:stdout) { StringIO.new }
|
7
|
-
|
8
|
-
around(:each) do |example|
|
9
|
-
original_stdout = $stdout
|
10
|
-
$stdout = stdout
|
11
|
-
require_relative 'app'
|
12
|
-
require 'rspec/rails'
|
13
|
-
example.run
|
14
|
-
$stdout = original_stdout
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'does not log anything to STDOUT when initializing' do
|
18
|
-
expect(stdout.string).to eq('')
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'sets the Hashie logger to the Rails logger' do
|
22
|
-
expect(Hashie.logger).to eq(Rails.logger)
|
23
|
-
end
|
24
|
-
|
25
|
-
context '#except' do
|
26
|
-
subject { Hashie::Mash.new(x: 1, y: 2) }
|
27
|
-
|
28
|
-
it 'returns an instance of the class it was called on' do
|
29
|
-
class HashieKlass < Hashie::Mash; end
|
30
|
-
hashie_klass = HashieKlass.new(subject)
|
31
|
-
expect(hashie_klass.except('x')).to be_a HashieKlass
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'works with string keys' do
|
35
|
-
expect(subject.except('x')).to eq Hashie::Mash.new(y: 2)
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'works with symbol keys' do
|
39
|
-
expect(subject.except(:x)).to eq Hashie::Mash.new(y: 2)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'works' do
|
44
|
-
get '/'
|
45
|
-
assert_select 'h1', 'Hello, world!'
|
46
|
-
end
|
47
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
if ENV['CI']
|
2
|
-
require 'simplecov'
|
3
|
-
SimpleCov.start
|
4
|
-
end
|
5
|
-
|
6
|
-
require 'pry'
|
7
|
-
|
8
|
-
require 'rspec'
|
9
|
-
require 'hashie'
|
10
|
-
require 'rspec/pending_for'
|
11
|
-
require './spec/support/ruby_version_check'
|
12
|
-
require './spec/support/logger'
|
13
|
-
|
14
|
-
require 'active_support'
|
15
|
-
require 'active_support/core_ext'
|
16
|
-
|
17
|
-
RSpec.configure do |config|
|
18
|
-
config.extend RubyVersionCheck
|
19
|
-
config.expect_with :rspec do |expect|
|
20
|
-
expect.syntax = :expect
|
21
|
-
end
|
22
|
-
config.warnings = true
|
23
|
-
end
|
@@ -1,36 +0,0 @@
|
|
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
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
# A shared context that allows you to check the output of Hashie's logger.
|
2
|
-
#
|
3
|
-
# @example
|
4
|
-
# include_context 'with a logger'
|
5
|
-
#
|
6
|
-
# it 'logs info message' do
|
7
|
-
# Hashie.logger.info 'What is happening in here?!'
|
8
|
-
#
|
9
|
-
# expect(logger_output).to match('What is happening in here?!')
|
10
|
-
# end
|
11
|
-
RSpec.shared_context 'with a logger' do
|
12
|
-
# @private
|
13
|
-
let(:log) { StringIO.new }
|
14
|
-
|
15
|
-
# The output string from the logger
|
16
|
-
let(:logger_output) { log.rewind && log.string }
|
17
|
-
|
18
|
-
around(:each) do |example|
|
19
|
-
original_logger = Hashie.logger
|
20
|
-
Hashie.logger = Logger.new(log)
|
21
|
-
example.run
|
22
|
-
Hashie.logger = original_logger
|
23
|
-
end
|
24
|
-
end
|