styled_yaml 0.0.1.rc1
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/styled_yaml.rb +168 -0
- metadata +43 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ffece4508e8d9f5ef5926fda64adc0be3d7d5ffa5e08d06f953b43eb47c45844
|
4
|
+
data.tar.gz: da3e23d55e606572bf34a815e9bb0fef94f449e8e018b03dc0882f53318d403d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9bf2ce810a50156020d640eaf215801afbcda609d5153f298dac951867f4f5c443060db95102546bfeb4eb85e4229e859c97d6291801cb55489d867332f9b382
|
7
|
+
data.tar.gz: d3167d78d38dba974480e60fd5de26bf028d304c84863246698e88151d000ce999342c6ea1d10ce3ac4610f4d0bdc0e06110c8314d2eaacece116e1bc6090379
|
data/lib/styled_yaml.rb
ADDED
@@ -0,0 +1,168 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'psych'
|
4
|
+
require 'stringio'
|
5
|
+
|
6
|
+
# A Psych extension to enable choosing output styles for specific objects.
|
7
|
+
#
|
8
|
+
# Thanks to Tenderlove for help in <http://stackoverflow.com/q/9640277/11687>.
|
9
|
+
#
|
10
|
+
# Example:
|
11
|
+
#
|
12
|
+
# data = {
|
13
|
+
# response: { body: StyledYAML.literal(json_string), status: 200 },
|
14
|
+
# person: StyledYAML.inline({ 'name' => 'Stevie', 'age' => 12 }),
|
15
|
+
# array: StyledYAML.inline(%w[ apples bananas oranges ])
|
16
|
+
# }
|
17
|
+
#
|
18
|
+
# StyledYAML.dump(data, $stdout)
|
19
|
+
#
|
20
|
+
|
21
|
+
module StyledYAML
|
22
|
+
# http://www.yaml.org/spec/1.2/spec.html#id2795688
|
23
|
+
module LiteralScalar
|
24
|
+
def yaml_style
|
25
|
+
Psych::Nodes::Scalar::LITERAL
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# https://yaml.org/spec/1.2/spec.html#id2788097
|
30
|
+
module SingleQuotedScalar
|
31
|
+
def yaml_style
|
32
|
+
Psych::Nodes::Scalar::SINGLE_QUOTED
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# https://yaml.org/spec/1.2/spec.html#id2787109
|
37
|
+
module DoubleQuotedScalar
|
38
|
+
def yaml_style
|
39
|
+
Psych::Nodes::Scalar::DOUBLE_QUOTED
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# http://www.yaml.org/spec/1.2/spec.html#id2796251
|
44
|
+
module FoldedScalar
|
45
|
+
def yaml_style
|
46
|
+
Psych::Nodes::Scalar::FOLDED
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# http://www.yaml.org/spec/1.2/spec.html#id2790832
|
51
|
+
module FlowMapping
|
52
|
+
def yaml_style
|
53
|
+
Psych::Nodes::Mapping::FLOW
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# http://www.yaml.org/spec/1.2/spec.html#id2790320
|
58
|
+
module FlowSequence
|
59
|
+
def yaml_style
|
60
|
+
Psych::Nodes::Sequence::FLOW
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Custom tree builder class to recognize scalars tagged with `yaml_style`
|
65
|
+
class TreeBuilder < Psych::TreeBuilder
|
66
|
+
attr_writer :next_seq_or_map_style
|
67
|
+
|
68
|
+
def next_seq_or_map_style(default_style)
|
69
|
+
style = @next_seq_or_map_style || default_style
|
70
|
+
@next_seq_or_map_style = nil
|
71
|
+
style
|
72
|
+
end
|
73
|
+
|
74
|
+
def scalar(value, anchor, tag, plain, quoted, style)
|
75
|
+
if value.respond_to?(:yaml_style)
|
76
|
+
if style_literal_or_folded? value.yaml_style
|
77
|
+
plain = false
|
78
|
+
quoted = true
|
79
|
+
end
|
80
|
+
style = value.yaml_style
|
81
|
+
end
|
82
|
+
super
|
83
|
+
end
|
84
|
+
|
85
|
+
def style_literal_or_folded?(style)
|
86
|
+
[Psych::Nodes::Scalar::LITERAL, Psych::Nodes::Scalar::FOLDED].include?(style)
|
87
|
+
end
|
88
|
+
|
89
|
+
%I[sequence mapping].each do |type|
|
90
|
+
class_eval <<-RUBY
|
91
|
+
def start_#{type}(anchor, tag, implicit, style)
|
92
|
+
style = next_seq_or_map_style(style)
|
93
|
+
super
|
94
|
+
end
|
95
|
+
RUBY
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# Custom tree class to handle Hashes and Arrays tagged with `yaml_style`.
|
100
|
+
class YAMLTree < Psych::Visitors::YAMLTree
|
101
|
+
%I[Hash Array Psych_Set Psych_Omap].each do |klass|
|
102
|
+
class_eval <<-RUBY
|
103
|
+
def visit_#{klass}(o)
|
104
|
+
if o.respond_to? :yaml_style
|
105
|
+
@emitter.next_seq_or_map_style = o.yaml_style
|
106
|
+
end
|
107
|
+
super
|
108
|
+
end
|
109
|
+
RUBY
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# Tag string to be output using literal style.
|
114
|
+
def self.literal(str)
|
115
|
+
str.extend(LiteralScalar)
|
116
|
+
str
|
117
|
+
end
|
118
|
+
|
119
|
+
# Tag string to be output using folded style.
|
120
|
+
def self.folded(str)
|
121
|
+
str.extend(FoldedScalar)
|
122
|
+
str
|
123
|
+
end
|
124
|
+
|
125
|
+
# Tag string to be output using single quoted style.
|
126
|
+
def self.single_quoted(str)
|
127
|
+
str.extend(SingleQuotedScalar)
|
128
|
+
str
|
129
|
+
end
|
130
|
+
|
131
|
+
# Tag string to be output using double quoted style.
|
132
|
+
def self.double_quoted(str)
|
133
|
+
str.extend(DoubleQuotedScalar)
|
134
|
+
str
|
135
|
+
end
|
136
|
+
|
137
|
+
# Tag Hash or Array to be output all on one line.
|
138
|
+
def self.inline(obj)
|
139
|
+
case obj
|
140
|
+
when Hash
|
141
|
+
obj.extend(FlowMapping)
|
142
|
+
when Array
|
143
|
+
obj.extend(FlowSequence)
|
144
|
+
else
|
145
|
+
warn "#{self}: unrecognized type to inline (#{obj.class.name})"
|
146
|
+
end
|
147
|
+
obj
|
148
|
+
end
|
149
|
+
|
150
|
+
# A Psych.dump alternative that uses the custom TreeBuilder
|
151
|
+
def self.dump(obj, io = nil, options = {})
|
152
|
+
real_io = io || StringIO.new(''.encode('utf-8'))
|
153
|
+
visitor = YAMLTree.create(options, TreeBuilder.new)
|
154
|
+
|
155
|
+
visitor << obj
|
156
|
+
ast = visitor.tree
|
157
|
+
|
158
|
+
begin
|
159
|
+
ast.yaml(real_io)
|
160
|
+
rescue
|
161
|
+
# The `yaml` method was introduced in later versions, so fall back to
|
162
|
+
# constructing a visitor
|
163
|
+
Psych::Visitors::Emitter.new(real_io).accept(ast)
|
164
|
+
end
|
165
|
+
|
166
|
+
io || real_io.string
|
167
|
+
end
|
168
|
+
end
|
metadata
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: styled_yaml
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1.rc1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- James Ramsay
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-01-11 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email: james@jramsay.com.au
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/styled_yaml.rb
|
20
|
+
homepage: http://github.com/jamesramsay/styled-yaml
|
21
|
+
licenses:
|
22
|
+
- MIT
|
23
|
+
metadata: {}
|
24
|
+
post_install_message:
|
25
|
+
rdoc_options: []
|
26
|
+
require_paths:
|
27
|
+
- lib
|
28
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">"
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.3.1
|
38
|
+
requirements: []
|
39
|
+
rubygems_version: 3.2.4
|
40
|
+
signing_key:
|
41
|
+
specification_version: 4
|
42
|
+
summary: A Psych extension to enable choosing output styles for specific objects.
|
43
|
+
test_files: []
|