scoped_hash 0.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 +7 -0
- data/.gitignore +3 -0
- data/Gemfile +4 -0
- data/README.md +20 -0
- data/Rakefile +18 -0
- data/lib/scoped_hash.rb +52 -0
- data/scoped_hash.gemspec +28 -0
- metadata +106 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c43a499077616adecf23fe37d74b02cad241cc61
|
4
|
+
data.tar.gz: 2e62d794d7ba6f0049d1653b17b0340e6d5b7127
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3686545f7078d4b3aa633dd20d67a4ea1407a78006cec7905fc2f28a99dc65b1a518ee4ff1e194fc172b8e548660c008586aaf56100e1f2a85b52791b5b9aaba
|
7
|
+
data.tar.gz: 9bd398d8331b750c130e9586edd097d9d86d34d3eac189847fe73bc9f4b081480eb7a75a989a8dafae0a293de11e32ffee74300792fbc39b4efa28b968d89260
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# Scoped hash library
|
2
|
+
|
3
|
+
It provides scoped view to a hash (mash) data structure.
|
4
|
+
When the requested scope does not exist, it would fall back to the non-scope key.
|
5
|
+
|
6
|
+
require 'scoped_hash'
|
7
|
+
smash = ScopedHash.new( 'tax': { min: 20, max: 40},
|
8
|
+
'tax(democratic)': { min: 30, max: 50},
|
9
|
+
'tax(republican)': { min: 10, max: 30})
|
10
|
+
|
11
|
+
smash.scope('democratic')[:tax][:min] == 30
|
12
|
+
smash.scope('republican')[:tax][:min] == 10
|
13
|
+
smash.scope('green')[:tax][:min] == 20
|
14
|
+
|
15
|
+
## Installation
|
16
|
+
|
17
|
+
Simply use gem to install this library:
|
18
|
+
|
19
|
+
gem install scoped_hash
|
20
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require "rake/testtask"
|
2
|
+
|
3
|
+
Rake::TestTask.new do |t|
|
4
|
+
t.libs << "test:."
|
5
|
+
t.test_files = FileList['test/**/*_test.rb']
|
6
|
+
end
|
7
|
+
|
8
|
+
task :default => :test
|
9
|
+
|
10
|
+
task :coverage do
|
11
|
+
ENV['COVERAGE'] = 'true'
|
12
|
+
Rake::Task['test'].execute
|
13
|
+
end
|
14
|
+
|
15
|
+
task :build do
|
16
|
+
cmd="gem build smash.gemspec"
|
17
|
+
exec cmd
|
18
|
+
end
|
data/lib/scoped_hash.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'mash'
|
2
|
+
|
3
|
+
class ScopedHash < Mash
|
4
|
+
DEFAULT_LEFT_BRACKET = '('
|
5
|
+
DEFAULT_RIGHT_BRACKET = ')'
|
6
|
+
|
7
|
+
def initialize(args = {})
|
8
|
+
super args
|
9
|
+
|
10
|
+
@lbracket = DEFAULT_LEFT_BRACKET
|
11
|
+
@rbracket = DEFAULT_RIGHT_BRACKET
|
12
|
+
end
|
13
|
+
|
14
|
+
def scope(scope)
|
15
|
+
mash = self.clone()
|
16
|
+
visit_scope(mash, scope)
|
17
|
+
return mash
|
18
|
+
end
|
19
|
+
|
20
|
+
def set_bracket(bracket)
|
21
|
+
if bracket.length != 2
|
22
|
+
raise "Bracket length should be 2"
|
23
|
+
end
|
24
|
+
@lbracket = bracket[0]
|
25
|
+
@rbracket = bracket[1]
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def visit_scope(mash, scope)
|
31
|
+
scope_length = scope.length + 2
|
32
|
+
scope_keys = []
|
33
|
+
|
34
|
+
mash.each_key do |k|
|
35
|
+
if k.end_with? "#{@lbracket}#{scope}#{@rbracket}"
|
36
|
+
scope_keys << k
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
scope_keys.each do |k|
|
41
|
+
last_index = k.length - 1 - scope_length
|
42
|
+
key = k[0..last_index]
|
43
|
+
mash[key] = mash[k]
|
44
|
+
end
|
45
|
+
|
46
|
+
mash.each_pair do |k,v|
|
47
|
+
if v.is_a?(Mash)
|
48
|
+
visit_scope(v, scope)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/scoped_hash.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "scoped_hash"
|
7
|
+
spec.version = "0.1.0"
|
8
|
+
spec.authors = ["Houcheng Lin"]
|
9
|
+
spec.email = ["houcheng@gmail.com"]
|
10
|
+
|
11
|
+
spec.summary = %q{Scoped Hash provides scoped access to hash structure}
|
12
|
+
spec.homepage = %q{https://github.com/houcheng/scoped_hash}
|
13
|
+
spec.license = ""
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
16
|
+
f.match(%r{^(test|spec|features)/})
|
17
|
+
end
|
18
|
+
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# develop dependency
|
22
|
+
spec.add_development_dependency "bundler"
|
23
|
+
spec.add_development_dependency "rake"
|
24
|
+
spec.add_development_dependency "minitest"
|
25
|
+
|
26
|
+
# runtime dependency
|
27
|
+
spec.add_runtime_dependency "mash"
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: scoped_hash
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Houcheng Lin
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-12-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
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: :development
|
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: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
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: mash
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description:
|
70
|
+
email:
|
71
|
+
- houcheng@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- ".gitignore"
|
77
|
+
- Gemfile
|
78
|
+
- README.md
|
79
|
+
- Rakefile
|
80
|
+
- lib/scoped_hash.rb
|
81
|
+
- scoped_hash.gemspec
|
82
|
+
homepage: https://github.com/houcheng/scoped_hash
|
83
|
+
licenses:
|
84
|
+
- ''
|
85
|
+
metadata: {}
|
86
|
+
post_install_message:
|
87
|
+
rdoc_options: []
|
88
|
+
require_paths:
|
89
|
+
- lib
|
90
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
requirements: []
|
101
|
+
rubyforge_project:
|
102
|
+
rubygems_version: 2.5.1
|
103
|
+
signing_key:
|
104
|
+
specification_version: 4
|
105
|
+
summary: Scoped Hash provides scoped access to hash structure
|
106
|
+
test_files: []
|