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 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
@@ -0,0 +1,3 @@
1
+ coverage/
2
+ *.gem
3
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in KindleJournal.gemspec
4
+ gemspec
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
@@ -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
@@ -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: []