scoped_hash 0.1.0

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: 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: []