frebby 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/bin/frebby +82 -0
- data/lib/frebby/hooks.rb +42 -0
- data/lib/frebby/presets/ansible.rb +14 -0
- data/lib/frebby/presets/packer.rb +8 -0
- data/lib/frebby/presets/terraform.rb +5 -0
- data/lib/frebby/recursion.rb +35 -0
- data/lib/frebby/transform.rb +30 -0
- metadata +97 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 9887b888bece3f3120b9640d910f4baae8ed2de3
|
|
4
|
+
data.tar.gz: e244028a95008565e9a5b02fb8309f2825cb1561
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 9647df78942991006f7d8763b9a18c1d1acd4320d5aada28c5e51fe7b778a35ddf5d7ae825614cdac0dbea55b6602ee19fe9ae1f072578f5a212bd68eac48985
|
|
7
|
+
data.tar.gz: d11c7a9b550d31769392409c88846f3cfd25f4dc2e6b313c50367ffc6e9972b6a4f065d2547a8eafc5cbb63f881548cca3513d8012a200334c2cb0f2ae74bef8
|
data/bin/frebby
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
#
|
|
5
|
+
# Copyright 2018, Ole Claussen <claussen.ole@gmail.com>
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
#
|
|
19
|
+
require 'forwardable'
|
|
20
|
+
require 'json'
|
|
21
|
+
|
|
22
|
+
class Frebby
|
|
23
|
+
extend Forwardable
|
|
24
|
+
def_delegators :@hash, :[], :[]=, :to_json
|
|
25
|
+
|
|
26
|
+
def initialize(initial = {}, &blk)
|
|
27
|
+
@hash = initial.clone
|
|
28
|
+
instance_eval(&blk) if block_given?
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def respond_to_missing?(_symbol, _respond_to = false) true end
|
|
32
|
+
|
|
33
|
+
def method_missing(name, *args, &blk)
|
|
34
|
+
if args.empty? && !block_given?
|
|
35
|
+
return @hash[Frebby._transform_key_hook name.to_s]
|
|
36
|
+
end
|
|
37
|
+
args.unshift name
|
|
38
|
+
value = args.last.is_a?(Hash) || !block_given? ? args.pop : {}
|
|
39
|
+
value = Frebby.new value, &blk if block_given?
|
|
40
|
+
Frebby._set_value @hash, value, args
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
class << self
|
|
44
|
+
def _transform_key_hook(key, **_data) key end
|
|
45
|
+
|
|
46
|
+
def _transform_value_hook(value, **_data) value end
|
|
47
|
+
|
|
48
|
+
def _transform_result_hook(result, **_data) result end
|
|
49
|
+
|
|
50
|
+
def _set_value(hash, value, keys)
|
|
51
|
+
raise "Error: #{hash} is not a Hash" unless hash.respond_to? :[]
|
|
52
|
+
|
|
53
|
+
original_key = keys.shift.to_s
|
|
54
|
+
key = _transform_key_hook original_key
|
|
55
|
+
|
|
56
|
+
return _set_value(hash[key] ||= new, value, keys) unless keys.empty?
|
|
57
|
+
|
|
58
|
+
existing = hash[key]
|
|
59
|
+
new_value = if existing.nil?
|
|
60
|
+
value
|
|
61
|
+
elsif existing.is_a? Array
|
|
62
|
+
existing + [value]
|
|
63
|
+
else
|
|
64
|
+
[existing, value]
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
hash[key] = _transform_value_hook new_value,
|
|
68
|
+
transformed_key: key,
|
|
69
|
+
original_key: original_key,
|
|
70
|
+
target: hash
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
item = Frebby.new
|
|
76
|
+
ARGF.reduce [] do |lines, line|
|
|
77
|
+
lines << line
|
|
78
|
+
next lines unless ARGF.eof?
|
|
79
|
+
item.instance_eval lines.join, ARGF.filename
|
|
80
|
+
[]
|
|
81
|
+
end
|
|
82
|
+
STDOUT.puts Frebby._transform_result_hook(item).to_json
|
data/lib/frebby/hooks.rb
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Frebby
|
|
4
|
+
class << self
|
|
5
|
+
# rubocop:disable Style/ClassVars
|
|
6
|
+
|
|
7
|
+
@@hooks = {
|
|
8
|
+
key: [],
|
|
9
|
+
value: [],
|
|
10
|
+
result: []
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
def customize_key(&hook)
|
|
14
|
+
@@hooks[:key] << hook
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def customize_value(&hook)
|
|
18
|
+
@@hooks[:value] << hook
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def customize_result(&hook)
|
|
22
|
+
@@hooks[:result] << hook
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def _transform_key_hook(key, **data)
|
|
26
|
+
results = @@hooks[:key].map { |hook| hook.call(key, **data) }
|
|
27
|
+
results.compact.first || key
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def _transform_value_hook(value, **data)
|
|
31
|
+
results = @@hooks[:value].map { |hook| hook.call(value, **data) }
|
|
32
|
+
results.compact.first || value
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def _transform_result_hook(result, **data)
|
|
36
|
+
results = @@hooks[:result].map { |hook| hook.call(result, **data) }
|
|
37
|
+
results.compact.first || result
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# rubocop:enable Style/ClassVars
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'frebby/hooks'
|
|
4
|
+
require 'frebby/transform'
|
|
5
|
+
|
|
6
|
+
Frebby.pluralize 'play', as: 'plays'
|
|
7
|
+
Frebby.pluralize 'task', as: 'tasks'
|
|
8
|
+
Frebby.pluralize 'pre_task', as: 'pre_tasks'
|
|
9
|
+
Frebby.pluralize 'post_task', as: 'post_tasks'
|
|
10
|
+
Frebby.pluralize 'handler', as: 'handlers'
|
|
11
|
+
Frebby.pluralize 'tag', as: 'tags'
|
|
12
|
+
Frebby.pluralize 'notify'
|
|
13
|
+
|
|
14
|
+
Frebby.customize_result { |result| result['plays'] }
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'json'
|
|
4
|
+
require 'open3'
|
|
5
|
+
|
|
6
|
+
class Frebby
|
|
7
|
+
class << self
|
|
8
|
+
def read_file(filename)
|
|
9
|
+
source = caller_locations(1..1).first.absolute_path
|
|
10
|
+
current_dir = source == '-' ? Dir.pwd : File.dirname(source)
|
|
11
|
+
file = File.expand_path(filename, current_dir)
|
|
12
|
+
raise "File #{file} does not exist" unless File.exist?(file)
|
|
13
|
+
raise "Could not read file #{file}" unless File.readable?(file)
|
|
14
|
+
JSON.parse run_recursive(file)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def read_text(text)
|
|
18
|
+
JSON.parse run_recursive(stdin_text: text)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def run_recursive(*args, stdin_text: nil)
|
|
24
|
+
args.unshift 'frebby'
|
|
25
|
+
Open3.popen3 args.join(' ') do |stdin, stdout, stderr, thread|
|
|
26
|
+
stdin.write stdin_text unless stdin_text.nil?
|
|
27
|
+
stdin.close
|
|
28
|
+
error = stderr.read
|
|
29
|
+
status = thread.value
|
|
30
|
+
raise error unless status.success? && error.empty?
|
|
31
|
+
stdout.read
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'frebby/hooks'
|
|
4
|
+
|
|
5
|
+
class Frebby
|
|
6
|
+
class << self
|
|
7
|
+
def transform(key, into:)
|
|
8
|
+
customize_key { |k| into if k == key.to_s }
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# rubocop:disable Naming/UncommunicativeMethodParamName
|
|
12
|
+
# ^ Because I think `as` makes sense here and allows for a nice DSL
|
|
13
|
+
def pluralize(key, as: nil)
|
|
14
|
+
customize_key { |k| as if k == key.to_s } unless as.nil?
|
|
15
|
+
|
|
16
|
+
customize_value do |v, original_key:, transformed_key:, **_data|
|
|
17
|
+
keys = [key.to_s, as.to_s].compact
|
|
18
|
+
should_be_array = keys.include?(original_key) ||
|
|
19
|
+
keys.include?(transformed_key)
|
|
20
|
+
should_be_array && !v.is_a?(Array) ? [v] : nil
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
# rubocop:enable Naming/UncommunicativeMethodParamName
|
|
24
|
+
|
|
25
|
+
def as_json(&blk)
|
|
26
|
+
item = Frebby.new(&blk)
|
|
27
|
+
Frebby._transform_result_hook(item).to_json
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: frebby
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Ole Claussen
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2018-03-10 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: rake
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '12.3'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '12.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: '3.7'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '3.7'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: rubocop
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0.52'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0.52'
|
|
55
|
+
description: |
|
|
56
|
+
`frebby` is a very, very simple Ruby script that generates JSON out of a Ruby
|
|
57
|
+
based configuration language. It is intended as an alternative to the numerous
|
|
58
|
+
attempts to write a more human-readable language for tool configuration (YAML,
|
|
59
|
+
TOML, HCL, to name a few).
|
|
60
|
+
email: claussen.ole@gmail.com
|
|
61
|
+
executables:
|
|
62
|
+
- frebby
|
|
63
|
+
extensions: []
|
|
64
|
+
extra_rdoc_files: []
|
|
65
|
+
files:
|
|
66
|
+
- bin/frebby
|
|
67
|
+
- lib/frebby/hooks.rb
|
|
68
|
+
- lib/frebby/presets/ansible.rb
|
|
69
|
+
- lib/frebby/presets/packer.rb
|
|
70
|
+
- lib/frebby/presets/terraform.rb
|
|
71
|
+
- lib/frebby/recursion.rb
|
|
72
|
+
- lib/frebby/transform.rb
|
|
73
|
+
homepage: https://github.com/oclaussen/frebby
|
|
74
|
+
licenses:
|
|
75
|
+
- Apache-2.0
|
|
76
|
+
metadata: {}
|
|
77
|
+
post_install_message:
|
|
78
|
+
rdoc_options: []
|
|
79
|
+
require_paths:
|
|
80
|
+
- lib
|
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
82
|
+
requirements:
|
|
83
|
+
- - ">="
|
|
84
|
+
- !ruby/object:Gem::Version
|
|
85
|
+
version: '0'
|
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
|
+
requirements:
|
|
88
|
+
- - ">="
|
|
89
|
+
- !ruby/object:Gem::Version
|
|
90
|
+
version: '0'
|
|
91
|
+
requirements: []
|
|
92
|
+
rubyforge_project:
|
|
93
|
+
rubygems_version: 2.6.11
|
|
94
|
+
signing_key:
|
|
95
|
+
specification_version: 4
|
|
96
|
+
summary: vs. JSON
|
|
97
|
+
test_files: []
|