walky 0.0.1
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.
- data/.gitignore +6 -0
- data/.travis.yml +6 -0
- data/Gemfile +3 -0
- data/README.md +44 -0
- data/kronix.yml +2 -0
- data/lib/walky.rb +44 -0
- data/lib/walky/instance_methods.rb +15 -0
- data/lib/walky/parser.rb +36 -0
- data/lib/walky/version.rb +3 -0
- data/lib/walky/walk_methods.rb +9 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/walky_spec.rb +138 -0
- data/walky.gemspec +17 -0
- metadata +70 -0
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
## Walky - Simple lib to walky through easily hashes
|
2
|
+
|
3
|
+
[](http://travis-ci.org/jhonnyquest/walky)
|
5
|
+
|
6
|
+
|
7
|
+
Walky try create a simple way to access hashes with many keys easily.
|
8
|
+
You can move through hashes and also access others hashes with the _same path_
|
9
|
+
|
10
|
+
Example:
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
@hash = { "menu" => {
|
14
|
+
"header" => {
|
15
|
+
"screen" => "LCD",
|
16
|
+
"meme" => "Like a boss"
|
17
|
+
}
|
18
|
+
}
|
19
|
+
```
|
20
|
+
|
21
|
+
If we have an hash like above, you can use Walky like this:
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
@walky = Walky::Walker.new(@hash)
|
25
|
+
|
26
|
+
@walky["menu header screen"] # => "LCD"
|
27
|
+
# Or:
|
28
|
+
@walky.walk("menu header screen") # => "LCD"
|
29
|
+
```
|
30
|
+
|
31
|
+
If you want to access multiple hashes that have the same keys that the first, you can use
|
32
|
+
<tt>Walky#same_path</tt>. Example using with the code above:
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
@other = { "menu" => { "header" => { "screen" => "LED" , "meme" => "Poker face" } } }
|
36
|
+
@more_one = { "menu" => { "header" => { "screen" => "PLASM", "meme" => "LOL" } } }
|
37
|
+
|
38
|
+
# Acessing multiple hashes with one hash key
|
39
|
+
@walky["menu header"].same_path(@other, @more_one).all do |a, b, c|
|
40
|
+
a["screen"] # => "LCD"
|
41
|
+
b["screen"] # => "LED"
|
42
|
+
c["screen"] # => "PLASM"
|
43
|
+
end
|
44
|
+
```
|
data/kronix.yml
ADDED
data/lib/walky.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'walky/version'
|
2
|
+
require 'walky/parser'
|
3
|
+
require 'walky/walk_methods'
|
4
|
+
require 'walky/instance_methods'
|
5
|
+
|
6
|
+
module Walky
|
7
|
+
def self.move(hash, path)
|
8
|
+
Walky::Parser.parse(hash, path)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.extract(hash, path)
|
12
|
+
Walky::Parser.extract(hash, path)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.extract_with_sym(hash, path)
|
16
|
+
Walky::Parser.extract_with_sym(hash, path)
|
17
|
+
end
|
18
|
+
|
19
|
+
class Walker
|
20
|
+
def initialize(hash)
|
21
|
+
@hash = hash
|
22
|
+
end
|
23
|
+
|
24
|
+
def [](path)
|
25
|
+
parse(path)
|
26
|
+
end
|
27
|
+
|
28
|
+
def walk(path)
|
29
|
+
parse(path)
|
30
|
+
end
|
31
|
+
|
32
|
+
def parse(path)
|
33
|
+
Walker.parse(@hash, path)
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.parse(hash, path)
|
37
|
+
Walky::Parser.parse(hash, path)
|
38
|
+
end
|
39
|
+
|
40
|
+
def extract(path)
|
41
|
+
Walky::Parser.extract(@hash, path)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/walky/parser.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
module Walky
|
2
|
+
module Parser
|
3
|
+
def self.parse(hash, path)
|
4
|
+
paths = path.split(" ")
|
5
|
+
return_hash = hash
|
6
|
+
paths.each do |pathy|
|
7
|
+
if pathy =~ /^:/
|
8
|
+
return_hash = return_hash[pathy.gsub(":", "").to_sym]
|
9
|
+
else
|
10
|
+
return_hash = return_hash[pathy]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
return_hash.extend InstanceMethods
|
15
|
+
return_hash.walky_path = path
|
16
|
+
|
17
|
+
return_hash
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.extract(hash, path)
|
21
|
+
Walky.move(hash, path)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.extract_with_sym(hash, path)
|
25
|
+
symbolize_keys(extract(hash, path))
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.symbolize_keys(hash)
|
29
|
+
{}.tap do |h|
|
30
|
+
hash.each do |key, value|
|
31
|
+
h[key.to_sym] = value
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'test_notifier/runner/rspec'
|
data/spec/walky_spec.rb
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
require 'walky'
|
2
|
+
|
3
|
+
describe Walky do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@hash = {"menu"=>{"header"=> {"screen"=>"LCD", "meme" => "Like a boss"}}}
|
7
|
+
@other = {"menu"=>{"header"=> {"screen"=>"LED", "meme" => "Poker face"}}}
|
8
|
+
@more_one = {"menu"=>{"header"=> {"screen"=>"PLASM", "meme" => "LOL"}}}
|
9
|
+
@menu_items = {
|
10
|
+
"menu" => {
|
11
|
+
"items" => [
|
12
|
+
{"item" => "Movie", "cat" => { "keywords" => ["movie", "stories"]}},
|
13
|
+
{"item" => "Shop", "cat" => {"keywords" => ["buy", "bussiness"]}},
|
14
|
+
{"item" => "Stadium", "cat" => {"keywords" => ["joy", "watch", "fun"]}},
|
15
|
+
]
|
16
|
+
}
|
17
|
+
}
|
18
|
+
|
19
|
+
@collection = Walky::Walker.new(@menu_items)
|
20
|
+
@walky = Walky::Walker.new(@hash)
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "Parse to walk" do
|
24
|
+
it "shoul have Walky#[] method" do
|
25
|
+
@walky.should respond_to(:[])
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should parse a simple path" do
|
29
|
+
@walky["menu"].should be_kind_of(Hash)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should parse a two level path" do
|
33
|
+
@walky["menu header"].should be_kind_of(Hash)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should parse a last level path" do
|
37
|
+
@walky["menu header screen"].should == "LCD"
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should parse by :[] or :walk" do
|
41
|
+
@walky["menu header screen"].should == "LCD"
|
42
|
+
@walky.walk("menu header screen").should == "LCD"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "Walk through hash" do
|
47
|
+
it "should access other with same path" do
|
48
|
+
@walky["menu header"].same_path(@other).should be_kind_of(Array)
|
49
|
+
@walky["menu header"].same_path(@other)[0].should == @walky["menu header"]
|
50
|
+
@walky["menu header"].same_path(@other)[1].should == @other["menu"]["header"]
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should access multiple other hashes with same path" do
|
54
|
+
walked = @walky["menu header"].same_path(@other, @more_one)
|
55
|
+
walked.size.should == 3
|
56
|
+
walked[0].should == @walky["menu header"]
|
57
|
+
walked[1].should == @other["menu"]["header"]
|
58
|
+
walked[2].should == @more_one["menu"]["header"]
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should take all sub hashes with same path" do
|
62
|
+
walked = @walky["menu header"].same_path(@other, @more_one).all do |a, b, c|
|
63
|
+
a["screen"].should == "LCD"
|
64
|
+
b["screen"].should == "LED"
|
65
|
+
c["screen"].should == "PLASM"
|
66
|
+
|
67
|
+
"#{a["screen"]}#{b["screen"]}#{c["screen"]}"
|
68
|
+
end
|
69
|
+
walked.should == "LCDLEDPLASM"
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should iterate between hashes collection" do
|
73
|
+
@collection["menu items"].each do |item|
|
74
|
+
item["item"].should_not be_nil
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should be able to navigate trough an hash" do
|
79
|
+
@collection["menu items"].each do |item|
|
80
|
+
Walky.move(item, "cat keywords").should be_kind_of(Array)
|
81
|
+
end
|
82
|
+
|
83
|
+
Walky.move(@collection["menu items"].first, "cat keywords").size.should == 2
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'should walky with symbol keys' do
|
87
|
+
command = {
|
88
|
+
:type => "ls",
|
89
|
+
:params => ["l", "a"]
|
90
|
+
}
|
91
|
+
Walky.move(command, ":type").should == "ls"
|
92
|
+
Walky.move(command, ":params").should == ["l", "a"]
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'should walky with symbols and string keys' do
|
96
|
+
print = {
|
97
|
+
"file" => {
|
98
|
+
:type => "A4",
|
99
|
+
:pages => [1, 2, 3],
|
100
|
+
"password" => "secret"
|
101
|
+
}
|
102
|
+
}
|
103
|
+
Walky.move(print, "file :type").should == "A4"
|
104
|
+
Walky.move(print, "file password").should == "secret"
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should access keys from a sub key" do
|
108
|
+
print = {
|
109
|
+
"file" => {
|
110
|
+
:type => "A4",
|
111
|
+
:pages => [1, 2, 3],
|
112
|
+
"password" => "secret"
|
113
|
+
}
|
114
|
+
}
|
115
|
+
keys = Walky.extract(print, "file")
|
116
|
+
keys[:type].should == "A4"
|
117
|
+
keys[:pages].should == [1, 2, 3]
|
118
|
+
keys["password"].should == "secret"
|
119
|
+
|
120
|
+
extracted = @walky.extract("menu header")
|
121
|
+
extracted["screen"] = "LCD"
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should access keys from a sub key and symbolize" do
|
125
|
+
print = {
|
126
|
+
"file" => {
|
127
|
+
:type => "A4",
|
128
|
+
:pages => [1, 2, 3],
|
129
|
+
"password" => "secret"
|
130
|
+
}
|
131
|
+
}
|
132
|
+
|
133
|
+
keys = Walky.extract_with_sym(print, "file")
|
134
|
+
keys[:type].should == "A4"
|
135
|
+
keys[:password].should == "secret"
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
data/walky.gemspec
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "walky/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "walky"
|
7
|
+
s.version = Walky::VERSION
|
8
|
+
s.authors = ["Jonathan Duarte"]
|
9
|
+
s.email = ["jonathan.duarte@rocketmail.com"]
|
10
|
+
s.homepage = "http://www.jonathanduarte.com.br"
|
11
|
+
s.summary = "Walky through hashes"
|
12
|
+
s.description = "Simple way to access hashes with nested keys"
|
13
|
+
s.files = `git ls-files`.split("\n")
|
14
|
+
s.test_files = `git ls-files -- {test,spec}/*`.split("\n")
|
15
|
+
|
16
|
+
s.add_development_dependency "rspec"
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: walky
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jonathan Duarte
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-07-06 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: &74795770 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *74795770
|
25
|
+
description: Simple way to access hashes with nested keys
|
26
|
+
email:
|
27
|
+
- jonathan.duarte@rocketmail.com
|
28
|
+
executables: []
|
29
|
+
extensions: []
|
30
|
+
extra_rdoc_files: []
|
31
|
+
files:
|
32
|
+
- .gitignore
|
33
|
+
- .travis.yml
|
34
|
+
- Gemfile
|
35
|
+
- Gemfile.lock
|
36
|
+
- README.md
|
37
|
+
- kronix.yml
|
38
|
+
- lib/walky.rb
|
39
|
+
- lib/walky/instance_methods.rb
|
40
|
+
- lib/walky/parser.rb
|
41
|
+
- lib/walky/version.rb
|
42
|
+
- lib/walky/walk_methods.rb
|
43
|
+
- spec/spec_helper.rb
|
44
|
+
- spec/walky_spec.rb
|
45
|
+
- walky.gemspec
|
46
|
+
homepage: http://www.jonathanduarte.com.br
|
47
|
+
licenses: []
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options: []
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ! '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ! '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
requirements: []
|
65
|
+
rubyforge_project:
|
66
|
+
rubygems_version: 1.8.10
|
67
|
+
signing_key:
|
68
|
+
specification_version: 3
|
69
|
+
summary: Walky through hashes
|
70
|
+
test_files: []
|