yml2h 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +40 -0
- data/examples/compile_erb/meta.yml.erb +5 -0
- data/examples/compile_erb/users.yml.erb +17 -0
- data/examples/compile_yml/meta.yml +5 -0
- data/examples/compile_yml/users.yml +15 -0
- data/examples/fixture_team_hash.yml.erb +30 -0
- data/examples/fixture_team_ostruct.yml.erb +31 -0
- data/examples/team_hash.yml +28 -0
- data/examples/team_ostruct.yml +29 -0
- data/lib/yml2h.rb +89 -0
- data/lib/yml2h/version.rb +3 -0
- metadata +124 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 6be9f9bcb989cdbf7bb2ba92cb7179ea3df2af3e5b54af2d2c6de92479088ecc
|
4
|
+
data.tar.gz: 8c4ee2028d7f1dc16dc7f06ec51a132fd4fec45ba4c8b44e0cbd44ede7498d0b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b9958cceef3e79bac85cb1efc6694721f1f72f5fc6a258babeb5ecaef0787a7fa34fb61b3bef5fee49b03744e1e67cf9f4fe998e37c5fbbfa81cacd9b98e007c
|
7
|
+
data.tar.gz: 4ed77e767fa0007a620f1a01a314ebcad47a0669910d54eb8a71d76342afc41dbf2655476f84bdafddefdf603270b72ec6cbd4b3b8b56d9f51a668abc2cea9ed
|
data/README.md
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# Yml2h
|
2
|
+
|
3
|
+
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/yml2h`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
|
+
|
5
|
+
TODO: Delete this and the text above, and describe your gem
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'yml2h'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle install
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install yml2h
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
TODO: Write usage instructions here
|
26
|
+
|
27
|
+
## Development
|
28
|
+
|
29
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
30
|
+
|
31
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
|
+
|
33
|
+
## Contributing
|
34
|
+
|
35
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/yml2h.
|
36
|
+
|
37
|
+
|
38
|
+
## License
|
39
|
+
|
40
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
@@ -0,0 +1,17 @@
|
|
1
|
+
---
|
2
|
+
:users: <% @users.each do |user| %>
|
3
|
+
- :name: <%= user[:name] %>
|
4
|
+
:email: <%= user[:email] %>
|
5
|
+
:tos_acceptance: <%= user[:tos_acceptance] %>
|
6
|
+
:address:
|
7
|
+
:street: <%= user[:address][:street] %>
|
8
|
+
:profile:
|
9
|
+
:introduction: <%= user[:profile][:introduction] %>
|
10
|
+
:hobbies: <% user[:profile][:hobbies].each do |hobby| %>
|
11
|
+
- <%= hobby %>
|
12
|
+
<% end %>
|
13
|
+
:meta:
|
14
|
+
:created_at: !ruby/object:DateTime <%= user[:meta][:created_at] %>
|
15
|
+
:updated_at: !ruby/object:DateTime <%= user[:meta][:updated_at] %>
|
16
|
+
:uuid: <%= user[:meta][:uuid] %>
|
17
|
+
<% end %>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
:users:
|
3
|
+
- :name: "Mario Lopez"
|
4
|
+
:email: "lil@mr.e"
|
5
|
+
:tos_acceptance: true
|
6
|
+
:address:
|
7
|
+
:street: "foosgonewild"
|
8
|
+
:profile:
|
9
|
+
:introduction: "foosgonewild.com/shop"
|
10
|
+
:hobbies:
|
11
|
+
- stuntin'
|
12
|
+
:meta:
|
13
|
+
:created_at: 2019-09-01 00:00:00.000000000 +00:00
|
14
|
+
:updated_at: 2019-09-01 00:00:00.000000000 +00:00
|
15
|
+
:uuid: "f0000000-f000-f000-f000-f00000000000"
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# A team "fixture", using ERB+ivars to get dynamically-generated values
|
2
|
+
---
|
3
|
+
:name: <%= @name %>
|
4
|
+
:rank: <%= @rank %>
|
5
|
+
:users: <% @users.each do |user| %>
|
6
|
+
- :name: <%= user[:name] %>
|
7
|
+
:email: <%= user[:email] %>
|
8
|
+
:tos_acceptance: <%= user[:tos_acceptance] %>
|
9
|
+
:address:
|
10
|
+
:street: <%= user[:address][:street] %>
|
11
|
+
:profile:
|
12
|
+
:introduction: <%= user[:profile][:introduction] %>
|
13
|
+
:hobbies: <% user[:profile][:hobbies].each do |hobby| %>
|
14
|
+
- <%= hobby %>
|
15
|
+
<% end %>
|
16
|
+
:meta:
|
17
|
+
:created_at: !ruby/object:DateTime <%= user[:meta][:created_at] %>
|
18
|
+
:updated_at: !ruby/object:DateTime <%= user[:meta][:updated_at] %>
|
19
|
+
:uuid: <%= user[:meta][:uuid] %>
|
20
|
+
<% end %>
|
21
|
+
:budget:
|
22
|
+
:amount: <%= @budget[:amount] %>
|
23
|
+
:meta:
|
24
|
+
:created_at: !ruby/object:DateTime <%= @budget[:meta][:created_at] %>
|
25
|
+
:updated_at: !ruby/object:DateTime <%= @budget[:meta][:updated_at] %>
|
26
|
+
:uuid: <%= @budget[:meta][:uuid] %>
|
27
|
+
:meta:
|
28
|
+
:created_at: !ruby/object:DateTime <%= @meta[:created_at] %>
|
29
|
+
:updated_at: !ruby/object:DateTime <%= @meta[:updated_at] %>
|
30
|
+
:uuid: <%= @meta[:uuid] %>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# A team "fixture", using ERB+ivars to get dynamically-generated values to ouput a ruby OpenStruct
|
2
|
+
--- !ruby/object:OpenStruct
|
3
|
+
table:
|
4
|
+
:name: <%= @name %>
|
5
|
+
:rank: <%= @rank %>
|
6
|
+
:users: <% @users.each do |user| %>
|
7
|
+
- :name: <%= user[:name] %>
|
8
|
+
:email: <%= user[:email] %>
|
9
|
+
:tos_acceptance: <%= user[:tos_acceptance] %>
|
10
|
+
:address:
|
11
|
+
:street: <%= user[:address][:street] %>
|
12
|
+
:profile:
|
13
|
+
:introduction: <%= user[:profile][:introduction] %>
|
14
|
+
:hobbies: <% user[:profile][:hobbies].each do |hobby| %>
|
15
|
+
- <%= hobby %>
|
16
|
+
<% end %>
|
17
|
+
:meta:
|
18
|
+
:created_at: !ruby/object:DateTime <%= user[:meta][:created_at] %>
|
19
|
+
:updated_at: !ruby/object:DateTime <%= user[:meta][:updated_at] %>
|
20
|
+
:uuid: <%= user[:meta][:uuid] %>
|
21
|
+
<% end %>
|
22
|
+
:budget:
|
23
|
+
:amount: <%= @budget[:amount] %>
|
24
|
+
:meta:
|
25
|
+
:created_at: !ruby/object:DateTime <%= @budget[:meta][:created_at] %>
|
26
|
+
:updated_at: !ruby/object:DateTime <%= @budget[:meta][:updated_at] %>
|
27
|
+
:uuid: <%= @budget[:meta][:uuid] %>
|
28
|
+
:meta:
|
29
|
+
:created_at: !ruby/object:DateTime <%= @meta[:created_at] %>
|
30
|
+
:updated_at: !ruby/object:DateTime <%= @meta[:updated_at] %>
|
31
|
+
:uuid: <%= @meta[:uuid] %>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# An example "Team", as a plain ruby hash
|
2
|
+
---
|
3
|
+
:name: "Foos"
|
4
|
+
:rank: 1
|
5
|
+
:users:
|
6
|
+
- :name: "Mario Lopez"
|
7
|
+
:email: "lil@mr.e"
|
8
|
+
:tos_acceptance: true
|
9
|
+
:address:
|
10
|
+
:street: "foosgonewild"
|
11
|
+
:profile:
|
12
|
+
:introduction: "foosgonewild.com/shop"
|
13
|
+
:hobbies:
|
14
|
+
- stuntin'
|
15
|
+
:meta:
|
16
|
+
:created_at: 2019-09-01 00:00:00.000000000 +00:00
|
17
|
+
:updated_at: 2019-09-01 00:00:00.000000000 +00:00
|
18
|
+
:uuid: "f0000000-f000-f000-f000-f00000000000"
|
19
|
+
:budget:
|
20
|
+
:amount: 1000000
|
21
|
+
:meta:
|
22
|
+
:created_at: 2019-09-01 00:00:00.000000000 +00:00
|
23
|
+
:updated_at: 2019-09-01 00:00:00.000000000 +00:00
|
24
|
+
:uuid: "f0000000-f000-f000-f000-f00000000000"
|
25
|
+
:meta:
|
26
|
+
:created_at: 2019-09-01 00:00:00.000000000 +00:00
|
27
|
+
:updated_at: 2019-09-01 00:00:00.000000000 +00:00
|
28
|
+
:uuid: "f0000000-f000-f000-f000-f00000000000"
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# An example Team as an OpenStruct, with ERB tags (no variables)
|
2
|
+
--- !ruby/object:OpenStruct
|
3
|
+
table:
|
4
|
+
:name: "Foos"
|
5
|
+
:rank: 1
|
6
|
+
:users:
|
7
|
+
- :name: "Mario Lopez"
|
8
|
+
:email: "lil@mr.e"
|
9
|
+
:tos_acceptance: true
|
10
|
+
:address:
|
11
|
+
:street: "foosgonewild"
|
12
|
+
:profile:
|
13
|
+
:introduction: "foosgonewild.com/shop"
|
14
|
+
:hobbies:
|
15
|
+
- stuntin'
|
16
|
+
:meta:
|
17
|
+
:created_at: <%= DateTime.parse("2019-09-01") %>
|
18
|
+
:updated_at: <%= DateTime.parse("2019-09-01") %>
|
19
|
+
:uuid: "f0000000-f000-f000-f000-f00000000000"
|
20
|
+
:budget:
|
21
|
+
:amount: 1000000
|
22
|
+
:meta:
|
23
|
+
:created_at: <%= DateTime.parse("2019-09-01") %>
|
24
|
+
:updated_at: <%= DateTime.parse("2019-09-01") %>
|
25
|
+
:uuid: "f0000000-f000-f000-f000-f00000000000"
|
26
|
+
:meta:
|
27
|
+
:created_at: <%= DateTime.parse("2019-09-01") %>
|
28
|
+
:updated_at: <%= DateTime.parse("2019-09-01") %>
|
29
|
+
:uuid: "f0000000-f000-f000-f000-f00000000000"
|
data/lib/yml2h.rb
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
require_relative "yml2h/version"
|
2
|
+
require "erb"
|
3
|
+
require "fileutils"
|
4
|
+
require "ostruct"
|
5
|
+
require "yaml"
|
6
|
+
|
7
|
+
module Yml2h
|
8
|
+
module Write
|
9
|
+
attr_writer :output_file
|
10
|
+
def write_to_yaml!(path = nil)
|
11
|
+
destination = path || @output_file || "anonymous.yml"
|
12
|
+
write_to_yaml(self, Pathname.new(destination))
|
13
|
+
end
|
14
|
+
|
15
|
+
# NOTE: When a hash is extended with Write, #write_to_yaml becomes available as a private method.
|
16
|
+
module_function
|
17
|
+
|
18
|
+
# @param object [Object] A ruby object which can be written to YAML
|
19
|
+
# @param path [String] An absolute path which the YAML will be written to
|
20
|
+
def write_to_yaml(hash, path)
|
21
|
+
File.open(path, "w") { |f| f.write(hash.to_yaml) }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
module Read
|
26
|
+
attr_writer :input_file
|
27
|
+
def read_from_yaml!(path = nil, permitted_classes: nil)
|
28
|
+
input = path || @input_file || "anonymous.yml"
|
29
|
+
read_from_yaml(input, permitted_classes: permitted_classes)
|
30
|
+
end
|
31
|
+
|
32
|
+
module_function
|
33
|
+
|
34
|
+
# @param path [String, Pathname] An absolute path to parseable YAML contents
|
35
|
+
# @param permitted_classes [Array<Object>] Keyword arg; Additive list of classes to permit when loading a file
|
36
|
+
def read_from_yaml(path, permitted_classes: nil)
|
37
|
+
raw = ERB.new(Pathname.new(path).read).result(binding)
|
38
|
+
permitted_classes ||= [Symbol, Struct, OpenStruct, Time, Date, DateTime]
|
39
|
+
YAML.safe_load(raw, permitted_classes: permitted_classes)
|
40
|
+
rescue ArgumentError => e
|
41
|
+
# TODO: Remove after ruby 2.5 support dropped (currently only here for AWS compat)
|
42
|
+
fail e unless e.message.match?(/unknown keyword: permitted_classes/)
|
43
|
+
YAML.safe_load(raw, permitted_classes)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
module Compile
|
48
|
+
attr_writer :input_dir
|
49
|
+
def compile_from_dir!(dir = nil, extension: false, **options)
|
50
|
+
source = dir || @input_dir || `pwd`.chomp
|
51
|
+
compile_from_dir(Pathname.new(source), extension: extension, **options).to_h
|
52
|
+
end
|
53
|
+
|
54
|
+
module_function
|
55
|
+
|
56
|
+
# @param dir [String, Pathname] An absolute path to a directory which will have YAML files
|
57
|
+
# @param extension [Boolean] Whether or not to keep the file extension in the compiled result
|
58
|
+
# @param options @see Read#read_from_yaml
|
59
|
+
# @return [Array<Array<String, Object>>] Set of arrays where idx0 is the file name (extension optionally truncated), idx1 the attributes
|
60
|
+
def compile_from_dir(dir, extension: false, **options)
|
61
|
+
include_fixtures = singleton_class.included_modules.include?(Read)
|
62
|
+
file_extensions = %w[yml yaml]
|
63
|
+
file_extensions += %w[yml.erb yaml.erb] if include_fixtures
|
64
|
+
|
65
|
+
Dir.glob("#{dir}/*.{#{file_extensions.join(",")}}").map do |filename|
|
66
|
+
definition = filename
|
67
|
+
|
68
|
+
# Drop final "/" and extension unless specified
|
69
|
+
unless extension
|
70
|
+
# Drop extension
|
71
|
+
definition = definition.gsub(/\.(yml|yaml)(\.erb)?\z/i, "")
|
72
|
+
# Capture final "/" onwards
|
73
|
+
definition = definition.match(/\/\w+\z/i).to_s
|
74
|
+
# Drop "/"
|
75
|
+
definition = definition.sub("/", "")
|
76
|
+
end
|
77
|
+
|
78
|
+
# If we have access to Read#read_from_yaml!, use it here for injecting our current binding
|
79
|
+
as_object = if include_fixtures
|
80
|
+
read_from_yaml!(filename, **options)
|
81
|
+
else
|
82
|
+
Read.read_from_yaml(filename, **options)
|
83
|
+
end
|
84
|
+
|
85
|
+
[definition, as_object]
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
metadata
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: yml2h
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Trevor James
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-09-21 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: amazing_print
|
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: pry-byebug
|
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: rake
|
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: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.4'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.4'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: standard
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description:
|
84
|
+
email: trevor@osrs-stat.com
|
85
|
+
executables: []
|
86
|
+
extensions: []
|
87
|
+
extra_rdoc_files: []
|
88
|
+
files:
|
89
|
+
- README.md
|
90
|
+
- examples/compile_erb/meta.yml.erb
|
91
|
+
- examples/compile_erb/users.yml.erb
|
92
|
+
- examples/compile_yml/meta.yml
|
93
|
+
- examples/compile_yml/users.yml
|
94
|
+
- examples/fixture_team_hash.yml.erb
|
95
|
+
- examples/fixture_team_ostruct.yml.erb
|
96
|
+
- examples/team_hash.yml
|
97
|
+
- examples/team_ostruct.yml
|
98
|
+
- lib/yml2h.rb
|
99
|
+
- lib/yml2h/version.rb
|
100
|
+
homepage: https://github.com/fire-pls/yml2h
|
101
|
+
licenses:
|
102
|
+
- MIT
|
103
|
+
metadata: {}
|
104
|
+
post_install_message:
|
105
|
+
rdoc_options: []
|
106
|
+
require_paths:
|
107
|
+
- lib
|
108
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: 2.5.8
|
113
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 2.7.4
|
118
|
+
requirements: []
|
119
|
+
rubyforge_project:
|
120
|
+
rubygems_version: 2.7.6.2
|
121
|
+
signing_key:
|
122
|
+
specification_version: 4
|
123
|
+
summary: Convert Ruby hashes to YAML & vice-versa
|
124
|
+
test_files: []
|