scrawl 1.0.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/lib/scrawl.rb +49 -0
- data/lib/scrawl/version.rb +4 -0
- data/spec/lib/scraw_spec.rb +172 -0
- data/spec/lib/scrawl/version_spec.rb +7 -0
- data/spec/spec_helper.rb +6 -0
- metadata +193 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 44d6787a4204535288716bd360ce9a91f8ab9e8e
|
|
4
|
+
data.tar.gz: 4fe0bad5f4bd4222ee2f64b06cbaf18c088f6631
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 65eac765287fe7c6aae52ce9b8e87ccb06aefa10f4b058db046c5c435ba34521d47381d1e319da747c5c2310d98194d0abdcbcd4f984af1dc7936146d5381ff4
|
|
7
|
+
data.tar.gz: 18d2f0e9e36cc7a62064a5b489e4a18f85c4941f3a45e93442826ff82bd0c76d62f3e6e8eacbe8506e94154706f8d01b2db34f11318305434b70da912d18aa8c
|
data/lib/scrawl.rb
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
require "forwardable"
|
|
2
|
+
|
|
3
|
+
# This is the main namespace for scrawl
|
|
4
|
+
class Scrawl
|
|
5
|
+
extend Forwardable
|
|
6
|
+
|
|
7
|
+
KEY_VALUE_DELIMITER = "="
|
|
8
|
+
PAIR_DELIMITER = " "
|
|
9
|
+
NAMESPACE_DELIMITER = "."
|
|
10
|
+
|
|
11
|
+
attr_reader :tree
|
|
12
|
+
def_delegator :tree, :to_hash
|
|
13
|
+
def_delegator :tree, :to_h
|
|
14
|
+
|
|
15
|
+
def initialize(*trees)
|
|
16
|
+
@tree = trees.inject({}) { |global, tree| global.merge(tree) }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def merge(hash)
|
|
20
|
+
@tree.merge!(hash.to_hash)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def inspect(namespace = nil)
|
|
24
|
+
@tree.map do |key, value|
|
|
25
|
+
unless value.respond_to?(:to_hash)
|
|
26
|
+
"#{label(namespace, key)}#{KEY_VALUE_DELIMITER}#{element(value)}"
|
|
27
|
+
else
|
|
28
|
+
Scrawl.new(value).inspect(key)
|
|
29
|
+
end
|
|
30
|
+
end.join(PAIR_DELIMITER)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
def label(namespace, key)
|
|
36
|
+
[namespace, key].compact.join(NAMESPACE_DELIMITER)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def element(value)
|
|
40
|
+
case value
|
|
41
|
+
when Proc then value.call
|
|
42
|
+
when Numeric then value
|
|
43
|
+
when Symbol then value.to_s
|
|
44
|
+
else value
|
|
45
|
+
end.inspect
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
require_relative "scrawl/version"
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Scrawl do
|
|
4
|
+
let(:input) { { a: 1 } }
|
|
5
|
+
let(:trees) { [input] }
|
|
6
|
+
let(:scrawl) { described_class.new(*trees) }
|
|
7
|
+
let(:internal_tree) { scrawl.instance_variable_get(:@tree) }
|
|
8
|
+
|
|
9
|
+
describe ".new" do
|
|
10
|
+
context "with single" do
|
|
11
|
+
shared_examples "setup single" do
|
|
12
|
+
it "sets internal tree to that hash" do
|
|
13
|
+
expect(internal_tree).to eq(input)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context "hash object" do
|
|
18
|
+
include_examples "setup single"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context "scrawl object" do
|
|
22
|
+
let(:tree) { Scrawl.new(*trees) }
|
|
23
|
+
|
|
24
|
+
include_examples "setup single"
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
context "with multiple" do
|
|
29
|
+
let(:merged_input) { { a: 1, b: 2 } }
|
|
30
|
+
|
|
31
|
+
shared_examples "setup all" do
|
|
32
|
+
it "merges all arguments into a single tree" do
|
|
33
|
+
expect(internal_tree).to eq(merged_input)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context "hashes objects" do
|
|
38
|
+
let(:trees) { [{ a: 1 }, { b: 2 }] }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
context "scrawl objects" do
|
|
42
|
+
let(:trees) { [Scrawl.new(a: 1), Scrawl.new(b: 2)] }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
context "hash and scrawl objects" do
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
describe "#merge" do
|
|
52
|
+
let(:merge) { scrawl.merge(compared) }
|
|
53
|
+
|
|
54
|
+
shared_examples "merges" do
|
|
55
|
+
it "combines with the internal tree" do
|
|
56
|
+
expect(merge).to eq(a: 1, b: 2)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
context "with hash" do
|
|
61
|
+
let(:compared) { { b: 2 } }
|
|
62
|
+
|
|
63
|
+
include_examples "merges"
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
context "with scrawl object" do
|
|
67
|
+
let(:compared) { Scrawl.new(b: 2) }
|
|
68
|
+
|
|
69
|
+
include_examples "merges"
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
describe "#inspect" do
|
|
74
|
+
let(:stream) { "a=1" }
|
|
75
|
+
let(:namespace) { nil }
|
|
76
|
+
let(:inspect) { scrawl.inspect(namespace) }
|
|
77
|
+
|
|
78
|
+
context "with a single pair" do
|
|
79
|
+
it "joins the key value together with an =" do
|
|
80
|
+
expect(inspect).to eq(stream)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
context "and text value" do
|
|
84
|
+
let(:input) { { a: "example" } }
|
|
85
|
+
|
|
86
|
+
it "includes the escaped text" do
|
|
87
|
+
expect(inspect).to include("\"example\"")
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
context "and a proc value" do
|
|
92
|
+
let(:input) { { a: -> { "example#{rand(1..10_000)}" } } }
|
|
93
|
+
|
|
94
|
+
it "evaluate the proc" do
|
|
95
|
+
expect(inspect).to include("example")
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
it "never stores the value" do
|
|
99
|
+
first = scrawl.inspect
|
|
100
|
+
second = scrawl.inspect
|
|
101
|
+
expect(first).to_not eq(second)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
context "and a number value" do
|
|
106
|
+
it "returns just the number" do
|
|
107
|
+
expect(inspect).to include("=1")
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
context "and a symbol value" do
|
|
112
|
+
let(:input) { { a: :example } }
|
|
113
|
+
it "returns the escaped string equivelent" do
|
|
114
|
+
expect(inspect).to include("\"example\"")
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
context "with multiple pairs" do
|
|
120
|
+
let(:input) { { a: 1, b: 2 } }
|
|
121
|
+
let(:stream) { "a=1 b=2" }
|
|
122
|
+
|
|
123
|
+
it "delimits key value pairs with space" do
|
|
124
|
+
expect(inspect).to eq(stream)
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
context "with a given namespace" do
|
|
129
|
+
let(:namespace) { "b" }
|
|
130
|
+
let(:stream) { "b.a=1" }
|
|
131
|
+
|
|
132
|
+
it "prefixes the namespace to the key" do
|
|
133
|
+
expect(inspect).to eq(stream)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
context "with nested hash tree" do
|
|
138
|
+
let(:input) { { a: { b: 1, c: 2 } } }
|
|
139
|
+
let(:stream) { "a.b=1 a.c=2" }
|
|
140
|
+
|
|
141
|
+
it "namespaces the nested pairs" do
|
|
142
|
+
expect(inspect).to eq(stream)
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
describe "#tree"do
|
|
148
|
+
let(:tree) { scrawl.tree }
|
|
149
|
+
|
|
150
|
+
it "returns the internal tree" do
|
|
151
|
+
expect(tree).to eq(internal_tree)
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
describe "#to_h" do
|
|
156
|
+
let(:to_h) { scrawl.to_h }
|
|
157
|
+
|
|
158
|
+
it "returns the internal tree" do
|
|
159
|
+
expect(to_h).to eq(internal_tree)
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
describe "#to_hash"do
|
|
164
|
+
let(:to_hash) { scrawl.to_hash }
|
|
165
|
+
|
|
166
|
+
it "returns the internal tree" do
|
|
167
|
+
expect(to_hash).to eq(internal_tree)
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
describe "#=="
|
|
172
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: scrawl
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Kurtis Rainbolt-Greene
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2014-04-13 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: '1.3'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '1.3'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rspec
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '2.14'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '2.14'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: rake
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '10.1'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '10.1'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: yard
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0.8'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0.8'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: kramdown
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '1.2'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '1.2'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: pry
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - "~>"
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '0.9'
|
|
90
|
+
type: :development
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - "~>"
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '0.9'
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: codeclimate-test-reporter
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - "~>"
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '0.3'
|
|
104
|
+
type: :development
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - "~>"
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '0.3'
|
|
111
|
+
- !ruby/object:Gem::Dependency
|
|
112
|
+
name: rubocop
|
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
|
114
|
+
requirements:
|
|
115
|
+
- - "~>"
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: '0.15'
|
|
118
|
+
type: :development
|
|
119
|
+
prerelease: false
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
requirements:
|
|
122
|
+
- - "~>"
|
|
123
|
+
- !ruby/object:Gem::Version
|
|
124
|
+
version: '0.15'
|
|
125
|
+
- !ruby/object:Gem::Dependency
|
|
126
|
+
name: benchmark-ips
|
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
|
128
|
+
requirements:
|
|
129
|
+
- - "~>"
|
|
130
|
+
- !ruby/object:Gem::Version
|
|
131
|
+
version: '1.2'
|
|
132
|
+
type: :development
|
|
133
|
+
prerelease: false
|
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
135
|
+
requirements:
|
|
136
|
+
- - "~>"
|
|
137
|
+
- !ruby/object:Gem::Version
|
|
138
|
+
version: '1.2'
|
|
139
|
+
- !ruby/object:Gem::Dependency
|
|
140
|
+
name: ruby-prof
|
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
|
142
|
+
requirements:
|
|
143
|
+
- - "~>"
|
|
144
|
+
- !ruby/object:Gem::Version
|
|
145
|
+
version: '0.14'
|
|
146
|
+
type: :development
|
|
147
|
+
prerelease: false
|
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
149
|
+
requirements:
|
|
150
|
+
- - "~>"
|
|
151
|
+
- !ruby/object:Gem::Version
|
|
152
|
+
version: '0.14'
|
|
153
|
+
description: Turn hashes into simple log-ready output
|
|
154
|
+
email:
|
|
155
|
+
- me@kurtisrainboltgreene.name
|
|
156
|
+
executables: []
|
|
157
|
+
extensions: []
|
|
158
|
+
extra_rdoc_files: []
|
|
159
|
+
files:
|
|
160
|
+
- lib/scrawl.rb
|
|
161
|
+
- lib/scrawl/version.rb
|
|
162
|
+
- spec/lib/scraw_spec.rb
|
|
163
|
+
- spec/lib/scrawl/version_spec.rb
|
|
164
|
+
- spec/spec_helper.rb
|
|
165
|
+
homepage: http://krainboltgreene.github.io/scrawl
|
|
166
|
+
licenses:
|
|
167
|
+
- MIT
|
|
168
|
+
metadata: {}
|
|
169
|
+
post_install_message:
|
|
170
|
+
rdoc_options: []
|
|
171
|
+
require_paths:
|
|
172
|
+
- lib
|
|
173
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
174
|
+
requirements:
|
|
175
|
+
- - ">="
|
|
176
|
+
- !ruby/object:Gem::Version
|
|
177
|
+
version: '0'
|
|
178
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
179
|
+
requirements:
|
|
180
|
+
- - ">="
|
|
181
|
+
- !ruby/object:Gem::Version
|
|
182
|
+
version: '0'
|
|
183
|
+
requirements: []
|
|
184
|
+
rubyforge_project:
|
|
185
|
+
rubygems_version: 2.2.2
|
|
186
|
+
signing_key:
|
|
187
|
+
specification_version: 4
|
|
188
|
+
summary: Turn hashes into simple log-ready output
|
|
189
|
+
test_files:
|
|
190
|
+
- spec/lib/scraw_spec.rb
|
|
191
|
+
- spec/lib/scrawl/version_spec.rb
|
|
192
|
+
- spec/spec_helper.rb
|
|
193
|
+
has_rdoc:
|