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.
@@ -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
@@ -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
@@ -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,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'frebby/transform'
4
+
5
+ Frebby.pluralize 'builder', as: 'builders'
6
+ Frebby.pluralize 'provisioner', as: 'provisioners'
7
+ Frebby.pluralize 'post_processor', as: 'post-processors'
8
+ Frebby.pluralize 'inline'
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'frebby/transform'
4
+
5
+ Frebby.pluralize 'tag', as: 'tags'
@@ -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: []