rndr 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0ff7164803b3d0b959e9affe1bc763f90a970e4c
4
- data.tar.gz: 5009bf155381b14a71db1bb0c5c4ae17137f6db1
3
+ metadata.gz: 8466c3c45a0ee825f49d621e584d4a12ac6a965b
4
+ data.tar.gz: 4ecee6dcb0d4bdbd1c027413abb1ea38f602d692
5
5
  SHA512:
6
- metadata.gz: dcfee8e536056d7592b5b4af1016c3b3aa8dd0c1f7c58fea49d151d2e659705963f8b4bbf8ec7097c3a0466b9b2588366cff774fd784c440e471cf9b4724a2d8
7
- data.tar.gz: eefd0a3e16d95c94057a7a78a13a85f633f08f2ea7fd5aa29bc9ce3769a3a32b2c5f48e21936c18f0c9bae652d695dae71cb5de551751a0109dcab9c3ae6202e
6
+ metadata.gz: f4cebd0a275001d39c721de703a64b65067cdfcdecbaa078a00550e2c9c3e1bd414ce4e10488b1ff4f2a2fd035667613135783878d810c7c5a82d6f7c2fe5964
7
+ data.tar.gz: 91c0211d83f6edc8c7051f841ae1c7f029ce58a0ac3867c174cc58c6d79a2cde78d5b9656ae64b324e2d587468ccf65cf4788978560153cf7acee6cfdfaae5ad
data/.rubocop.yml CHANGED
@@ -1,6 +1,9 @@
1
1
  AllCops:
2
2
  TargetRubyVersion: 2.3
3
3
 
4
+ Lint/UnneededDisable:
5
+ Enabled: false
6
+
4
7
  Metrics/AbcSize:
5
8
  Max: 20
6
9
 
data/CHANGELOG CHANGED
@@ -1,2 +1,7 @@
1
+ 0.0.4:
2
+ - Add merge-opts directive.
3
+ - Fix issue with ignore-file directive.
4
+ - Restructure spec tests.
5
+
1
6
  0.0.3:
2
- - add default trim mode
7
+ - Add default trim mode.
data/README.md CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
  Rndr is a small Ruby cli gem that provides a method of rendering discovered erb templates. Variables for use in template rendering can be used directly by providing a either a `yaml` or `json` file, or alternatively a directory may be supplied along with the variable merging strategy. Rndr supports both standard hash merges or recursive (default).
6
6
 
7
+ In addition to supporting recursive hash merges, additional hash control options may be passed via the `--merge-opts` hash directive. This supports the available options as supported by the [deep_merge](https://github.com/danielsdeleo/deep_merge) gem.
8
+
7
9
  Paths can be ignored by either creating a `.rndrignore` file within the current working directly, or supplying a path to a desired ignore file.
8
10
 
9
11
 
@@ -35,16 +37,17 @@ Usage:
35
37
  rndr check
36
38
 
37
39
  Options:
38
- e, [--extension=EXTENSION] # Extension of templates.
39
- # Default: erb
40
- i, [--ignore=IGNORE] # Path to file containing list of files to be ignored.
41
- # Default: /Users/demo/ruby/rndr/.rndrignore
42
- m, [--merge], [--no-merge] # Recursively merge variables instead of replacing.
43
- # Default: true
44
- t, [--template=TEMPLATE] # Path to erb template or directory.
45
- # Default: /Users/demo/ruby/rndr/rndr
46
- V, [--vars=VARS] # Path to var file or directory.
47
- # Default: /Users/demo/ruby/rndr/vars
40
+ e, [--extension=EXTENSION] # Extension of templates.
41
+ # Default: erb
42
+ i, [--ignore=IGNORE] # Path to file containing list of files to be ignored.
43
+ # Default: /Users/demo/ruby/rndr/.rndrignore
44
+ m, [--merge], [--no-merge] # Recursively merge variables instead of replacing.
45
+ # Default: true
46
+ t, [--template=TEMPLATE] # Path to erb template or directory.
47
+ # Default: /Users/demo/ruby/rndr
48
+ V, [--vars=VARS] # Path to var file or directory.
49
+ # Default: /Users/demo/ruby/rndr/vars
50
+ o, [--merge-opts=key:value] # Hash of options to pass to deep_merge function
48
51
 
49
52
  Verifies discovered erb templates.
50
53
  ```
@@ -85,6 +88,7 @@ Options:
85
88
  # Default: /Users/demo/ruby/rndr/rndr
86
89
  V, [--vars=VARS] # Path to var file or directory.
87
90
  # Default: /Users/demo/ruby/rndr/vars
91
+ o, [--merge-opts=key:value] # Hash of options to pass to deep_merge function
88
92
 
89
93
  Renders discovered templates.
90
94
  ```
@@ -103,6 +107,7 @@ Options:
103
107
  # Default: true
104
108
  V, [--vars=VARS] # Path to var file or directory.
105
109
  # Default: /Users/demo/ruby/rndr/vars
110
+ o, [--merge-opts=key:value] # Hash of options to pass to deep_merge function
106
111
 
107
112
  Lists Combined Variables.
108
113
  ```
data/Rakefile CHANGED
@@ -1,9 +1,16 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # frozen_string_literal: true
3
+
1
4
  require 'bundler/gem_tasks'
2
5
  require 'coveralls/rake/task'
3
6
  require 'rspec/core/rake_task'
7
+ require 'rubocop/rake_task'
4
8
 
5
9
  RSpec::Core::RakeTask.new(:spec)
6
10
  Coveralls::RakeTask.new
7
11
 
8
- task :default => :spec
9
- task :coveralls => [ :spec, :features, 'coveralls:push' ]
12
+ task default: :spec
13
+ task coveralls: [:spec, :features, 'coveralls:push']
14
+ RuboCop::RakeTask.new(:style) do |task|
15
+ task.options << '--display-cop-names'
16
+ end
data/lib/rndr/cli.rb CHANGED
@@ -22,10 +22,14 @@ module Rndr
22
22
  method_option :vars,
23
23
  aliases: :V, type: :string, default: File.join(Dir.pwd, 'vars'),
24
24
  desc: 'Path to var file or directory.'
25
+ method_option :merge_opts,
26
+ aliases: :o, type: :hash, default: {},
27
+ desc: 'Hash of options to pass to deep_merge function'
25
28
  def check
26
29
  results = Rndr.matches(path: options[:template], ext: options[:extension],
27
30
  ignore_path: options[:ignore])
28
- template_vars = Rndr.read_vars(path: options[:vars], merge: options[:merge])
31
+ template_vars = Rndr.read_vars(path: options[:vars], merge: options[:merge],
32
+ merge_opts: options[:merge_opts])
29
33
  results.each do |path|
30
34
  template = Template.new(path: path, vars: template_vars)
31
35
  print_check_result(path: path, result: template.render?)
@@ -44,7 +48,7 @@ module Rndr
44
48
  desc: 'Path to erb template or directory.'
45
49
  def list
46
50
  results = Rndr.matches(path: options[:template], ext: options[:extension],
47
- ignore_path: '.rndrignore')
51
+ ignore_path: options[:ignore])
48
52
  if results.empty?
49
53
  puts 'No matching results.'
50
54
  else
@@ -68,10 +72,14 @@ module Rndr
68
72
  method_option :vars,
69
73
  aliases: :V, type: :string, default: File.join(Dir.pwd, 'vars'),
70
74
  desc: 'Path to var file or directory.'
71
- def render
75
+ method_option :merge_opts,
76
+ aliases: :o, type: :hash, default: {},
77
+ desc: 'Hash of options to pass to deep_merge function'
78
+ def render # rubocop:disable Metrics/AbcSize
72
79
  results = Rndr.matches(path: options[:template], ext: options[:extension],
73
- ignore_path: '.rndrignore')
74
- template_vars = Rndr.read_vars(path: options[:vars], merge: options[:merge])
80
+ ignore_path: options[:ignore])
81
+ template_vars = Rndr.read_vars(path: options[:vars], merge: options[:merge],
82
+ merge_opts: options[:merge_opts])
75
83
  results.each do |path|
76
84
  template = Template.new(path: path, vars: template_vars)
77
85
  render_path = path.gsub(/.#{options[:extension]}$/, '')
@@ -90,8 +98,12 @@ module Rndr
90
98
  method_option :vars,
91
99
  aliases: :V, type: :string, default: File.join(Dir.pwd, 'vars'),
92
100
  desc: 'Path to var file or directory.'
101
+ method_option :merge_opts,
102
+ aliases: :o, type: :hash, default: {},
103
+ desc: 'Hash of options to pass to deep_merge function'
93
104
  def vars
94
- result = Rndr.read_vars(path: options[:vars], merge: options[:merge])
105
+ result = Rndr.read_vars(path: options[:vars], merge: options[:merge],
106
+ merge_opts: options[:merge_opts])
95
107
  case options[:format].downcase
96
108
  when 'json'
97
109
  puts result.to_json
data/lib/rndr/util.rb CHANGED
@@ -15,11 +15,9 @@ module Rndr
15
15
  def self.matches(path:, ext: 'erb', ignore_path: File.join(Dir.pwd, '.rndrignore'))
16
16
  matched_paths = match_files(path: File.absolute_path(path), ext: ext)
17
17
  ignore_file_path = File.absolute_path(ignore_path)
18
- if !matched_paths.empty? && File.exist?(ignore_file_path)
19
- return filter_ignored_paths(path_list: matched_paths, ignore_path: ignore_file_path)
20
- else
21
- return matched_paths
22
- end
18
+ return filter_ignored_paths(path_list: matched_paths, ignore_path: ignore_file_path) if
19
+ !matched_paths.empty? && File.exist?(ignore_file_path)
20
+ matched_paths
23
21
  end
24
22
 
25
23
  # Accepts a file or directory and will attempt to parse the discovered file(s) as either json
@@ -27,12 +25,14 @@ module Rndr
27
25
  # template rendering in {Template#render}.
28
26
  # @param path [String] The path to the vars file or directory. Will process both json and yaml.
29
27
  # @param merge [Boolean] True to enable recursive merge of hashes.
28
+ # @param merge_opts [Hash] A hash of options to be passed to the deep_merge method
30
29
  # @return [Hash] A hash containing the processed variables. Will be used to send to the binding
31
30
  # of a rendered template. See {Template#render} for more information.
32
- def self.read_vars(path:, merge: true)
31
+ def self.read_vars(path:, merge: true, merge_opts: {})
33
32
  vars_path = File.absolute_path(path)
34
33
  return read_vars_file(vars_path) if File.file?(vars_path)
35
- return read_vars_dir(path: vars_path, merge: merge) if File.directory?(vars_path)
34
+ return read_vars_dir(path: vars_path, merge: merge, merge_opts: merge_opts) if
35
+ File.directory?(vars_path)
36
36
  {}
37
37
  end
38
38
 
@@ -87,7 +87,7 @@ module Rndr
87
87
  # @return [Hash, nil] Hash of processed data read from var passed var file.
88
88
  def read_vars_file(path)
89
89
  data = File.read(path)
90
- return JSON.load(data) if json?(data)
90
+ return JSON.parse(data) if json?(data)
91
91
  return YAML.load(data) if yaml?(data)
92
92
  nil
93
93
  end
@@ -97,15 +97,16 @@ module Rndr
97
97
  # @param path [String] Path to directory containing files to be ingested and vars
98
98
  # processed.
99
99
  # @param merge [Boolean] True if variables from files should be recursively merged.
100
+ # @param merge_opts [Hash] A hash of options to be passed to the deep_merge method
100
101
  # @return [Hash] Hash of processed variables read from files within the passed.
101
- def read_vars_dir(path:, merge:)
102
+ def read_vars_dir(path:, merge:, merge_opts: {})
102
103
  processed_vars = {}
103
104
  Dir[File.join(path, '*')].each do |file|
104
105
  file_vars = read_vars_file(file)
105
- unless file_vars.nil?
106
- processed_vars =
107
- merge_vars(base_hash: processed_vars, hash: file_vars, merge: merge)
108
- end
106
+ next if file_vars.nil?
107
+ processed_vars =
108
+ merge_vars(base_hash: processed_vars, hash: file_vars, merge: merge,
109
+ merge_opts: merge_opts)
109
110
  end
110
111
  processed_vars
111
112
  end
@@ -130,15 +131,42 @@ module Rndr
130
131
  false
131
132
  end
132
133
 
134
+ # to_bool converts the passed string to its associated bool value
135
+ # @param value [String] String to be converted to bool value
136
+ # @return [Boolean] True, False, or nil depending on input.
137
+ def to_bool(value)
138
+ return true if value.casecmp('true')
139
+ return false if value.casecmp('false')
140
+ nil
141
+ end
142
+
143
+ # deep_merge_opts converts the passed hash to the format that the deep_merge
144
+ # function accepts.
145
+ # @param hash [Hash] The options hash to be converted
146
+ # @return [Hash] A converted options hash to be passed to the deep_merge method
147
+ def deep_merge_opts(hash)
148
+ opts = {}
149
+ bool_vars = %w(extend_existing_arrays keep_array_duplicates merge_debug merge_hash_arrays
150
+ overwrite_arrays preserve_unmergeables sort_merged_arrays)
151
+ string_vars = %w(knockout_prefix unpack_arrays)
152
+ hash.each do |k, v|
153
+ opts[k.to_sym] = v if string_vars.include?(k)
154
+ opts[k.to_sym] = to_bool(v) if bool_vars.include?(k)
155
+ end
156
+ opts
157
+ end
158
+
133
159
  # merge_vars handles merging hashes, either with a recursive merge (default) or with
134
160
  # a standard merge, which has a 'replace' effect.
135
161
  # @param base_hash [Hash] Original Hash to have values merged into.
136
162
  # @param hash [Hash] Secondary hash to be merged into base hash.
137
163
  # @param merge [Boolean] True to enable recursive merging of hashes.
164
+ # @param merge_opts [Hash] A hash of options to be passed to the deep_merge method
138
165
  # @return [Hash] The merged hash.
139
- def merge_vars(base_hash:, hash:, merge: true)
166
+ def merge_vars(base_hash:, hash:, merge: true, merge_opts: {})
140
167
  if base_hash.is_a?(Hash) && hash.is_a?(Hash)
141
- return base_hash.deep_merge!(hash) if merge == true
168
+ return base_hash.deep_merge!(hash, deep_merge_opts(merge_opts)) if
169
+ merge == true
142
170
  return base_hash.merge!(hash) if merge == false
143
171
  end
144
172
  {}
data/rndr.gemspec CHANGED
@@ -20,11 +20,12 @@ Gem::Specification.new do |gem|
20
20
 
21
21
  gem.required_ruby_version = '>= 2.3'
22
22
 
23
- gem.add_dependency 'deep_merge', '>= 1.1.1'
24
- gem.add_dependency 'thor', '>= 0.19.1'
23
+ gem.add_dependency 'deep_merge', '~> 1.1'
24
+ gem.add_dependency 'thor', '~> 0.19'
25
25
 
26
- gem.add_development_dependency 'bundler', '>= 1.12.5'
27
- gem.add_development_dependency 'rake', '>= 11.2.2'
28
- gem.add_development_dependency 'rspec', '>= 3.5.0'
29
- gem.add_development_dependency 'coveralls', '>= 0.8.15'
26
+ gem.add_development_dependency 'bundler', '~> 1.12'
27
+ gem.add_development_dependency 'rake', '~> 11.2'
28
+ gem.add_development_dependency 'rspec', '~> 3.5'
29
+ gem.add_development_dependency 'rubocop', '~> 0.46'
30
+ gem.add_development_dependency 'coveralls', '~> 0.8'
30
31
  end
data/spec/cli_spec.rb CHANGED
@@ -5,19 +5,29 @@ require 'fileutils'
5
5
  require 'rndr'
6
6
  require_relative 'spec_helper'
7
7
 
8
- module Rndr # rubocop:disable Metris/ModuleLength
9
- RSpec.describe CLI do
10
- before(:all) { Dir.chdir(File.join(Dir.pwd, 'test')) }
11
- after(:all) { Dir.chdir('../') }
12
-
8
+ module Rndr # rubocop:disable Metrics/ModuleLength
9
+ RSpec.describe CLI do # rubocop:disable Metrics/BlockLength
10
+ before(:all) { Dir.chdir(File.join(Dir.pwd, 'spec/resources')) }
13
11
  let(:cli) { CLI.new }
14
-
15
- describe '#check' do
12
+ describe '#check' do # rubocop:disable Metrics/BlockLength
16
13
  context 'When the default options are supplied' do
17
14
  before do
18
15
  cli.options = {
19
- extension: 'erb', ignore: '.rndrignore',
20
- merge: true, template: 'templates', vars: 'vars'
16
+ extension: 'erb', ignore: 'rndrignore', merge: true,
17
+ merge_opts: {}, template: 'templates', vars: 'vars'
18
+ }
19
+ end
20
+ it 'should list the correctly matched results' do
21
+ expect { cli.check }.to output(/rendertest.txt.erb \[OK\]$/).to_stdout
22
+ expect { cli.check }.to_not output(/ignoretest.txt.erb [OK]$/).to_stdout
23
+ end
24
+ end
25
+
26
+ context 'When a bool merge option is supplied' do
27
+ before do
28
+ cli.options = {
29
+ extension: 'erb', ignore: 'rndrignore', merge: true,
30
+ merge_opts: { 'overwrite_arrays' => 'true' }, template: 'templates', vars: 'vars'
21
31
  }
22
32
  end
23
33
  it 'should list the correctly matched results' do
@@ -29,8 +39,8 @@ module Rndr # rubocop:disable Metris/ModuleLength
29
39
  context 'When an alternate exntesion is provided' do
30
40
  before do
31
41
  cli.options = {
32
- extension: 'tmplt', ignore: '.rndrignore',
33
- merge: true, template: 'templates', vars: 'vars'
42
+ extension: 'tmplt', ignore: 'rndrignore', merge: true,
43
+ merge_opts: {}, template: 'templates', vars: 'vars'
34
44
  }
35
45
  end
36
46
  it 'should list the correctly matched results' do
@@ -42,7 +52,7 @@ module Rndr # rubocop:disable Metris/ModuleLength
42
52
 
43
53
  describe '#list' do
44
54
  context 'When the default options are supplied' do
45
- before { cli.options = { extension: 'erb', ignore: '.rndrignore', template: 'templates' } }
55
+ before { cli.options = { extension: 'erb', ignore: 'rndrignore', template: 'templates' } }
46
56
  it 'should list the correctly matched results' do
47
57
  expect { cli.list }.to output(/rendertest.txt.erb$/).to_stdout
48
58
  expect { cli.list }.to_not output(/ignoretest.txt.erb/).to_stdout
@@ -50,7 +60,7 @@ module Rndr # rubocop:disable Metris/ModuleLength
50
60
  end
51
61
  context 'When an alternate extension is provided' do
52
62
  before do
53
- cli.options = { extension: 'tmplt', ignore: '.rndrignore', template: 'templates' }
63
+ cli.options = { extension: 'tmplt', ignore: 'rndrignore', template: 'templates' }
54
64
  end
55
65
  it 'should list the correctly matched results' do
56
66
  expect { cli.list }.to output(/exttest.txt.tmplt$/).to_stdout
@@ -59,70 +69,106 @@ module Rndr # rubocop:disable Metris/ModuleLength
59
69
  end
60
70
  end
61
71
 
62
- describe '#render' do
63
- let(:rendered_file) { File.absolute_path('../test/templates/rendertest.txt') }
64
- let(:rendered_ext) { File.absolute_path('../test/templates/exttest.txt') }
65
- let(:rendered_merged) do
66
- File.join(File.dirname(__FILE__), 'resources/rendered_merged.txt')
67
- end
68
- let(:rendered_replaced) do
69
- File.join(File.dirname(__FILE__), 'resources/rendered_replaced.txt')
70
- end
72
+ describe '#render' do # rubocop:disable Metrics/BlockLength
73
+ let(:rendered_file) { File.absolute_path('templates/rendertest.txt') }
74
+ let(:rendered_ext) { File.absolute_path('templates/exttest.txt') }
75
+ let(:spec_merged) { File.absolute_path('spec_merged.txt') }
76
+ let(:spec_opts) { File.absolute_path('spec_opts.txt') }
77
+ let(:spec_replaced) { File.absolute_path('spec_replaced.txt') }
71
78
  after(:each) do
72
79
  File.delete(rendered_file) if File.exist?(rendered_file)
73
80
  File.delete(rendered_ext) if File.exist?(rendered_ext)
74
81
  end
75
82
 
76
- context 'When the defaults are spplied' do
83
+ context 'When the defaults are supplied' do
84
+ before do
85
+ cli.options = {
86
+ extension: 'erb', ignore: 'rndrignore', merge: true,
87
+ merge_opts: {}, template: 'templates', vars: 'vars'
88
+ }
89
+ end
90
+ it 'should render items correctly' do
91
+ expect { cli.render }.to output(/rendertest.txt \[OK\]$/).to_stdout
92
+ expect { cli.render }.to_not output(/ignoretest.txt/).to_stdout
93
+ expect(FileUtils.compare_file(spec_merged, rendered_file)).to be_truthy
94
+ end
95
+ end
96
+
97
+ context 'When a boolean merge option is supplied' do
77
98
  before do
78
99
  cli.options = {
79
- extension: 'erb', ignore: '.rndrignore',
80
- merge: true, template: 'templates', vars: 'vars'
100
+ extension: 'erb', ignore: 'rndrignore', merge: true,
101
+ merge_opts: { 'overwrite_arrays' => 'true' }, template: 'templates', vars: 'vars'
81
102
  }
82
103
  end
83
104
  it 'should render items correctly' do
84
105
  expect { cli.render }.to output(/rendertest.txt \[OK\]$/).to_stdout
85
106
  expect { cli.render }.to_not output(/ignoretest.txt/).to_stdout
86
- expect(FileUtils.compare_file(rendered_merged, rendered_file)).to be_truthy
107
+ expect(FileUtils.compare_file(spec_opts, rendered_file)).to be_truthy
87
108
  end
88
109
  end
89
110
 
90
- context ' When the replace merege strategy is specified' do
111
+ context 'When the replace merege strategy is specified' do
91
112
  before do
92
113
  cli.options = {
93
- extension: 'erb', ignore: '.rndrignore',
94
- merge: false, template: 'templates', vars: 'vars'
114
+ extension: 'erb', ignore: 'rndrignore', merge: false,
115
+ merge_opts: {}, template: 'templates', vars: 'vars'
95
116
  }
96
117
  end
97
118
  it 'should render items correctly' do
98
119
  expect { cli.render }.to output(/rendertest.txt \[OK\]$/).to_stdout
99
120
  expect { cli.render }.to_not output(/ignoretest.txt/).to_stdout
100
- expect(FileUtils.compare_file(rendered_replaced, rendered_file)).to be_truthy
121
+ expect(FileUtils.compare_file(spec_replaced, rendered_file)).to be_truthy
101
122
  end
102
123
  end
103
124
 
104
125
  context 'When provided an alternate extension' do
105
126
  before do
106
127
  cli.options = {
107
- extension: 'tmplt', ignore: '.rndrignore',
108
- merge: true, template: 'templates', vars: 'vars'
128
+ extension: 'tmplt', ignore: 'rndrignore', merge: true,
129
+ merge_opts: {}, template: 'templates', vars: 'vars'
109
130
  }
110
131
  end
111
132
  it 'should render items correctly' do
112
133
  expect { cli.render }.to output(/exttest.txt \[OK\]$/).to_stdout
113
134
  expect { cli.render }.to_not output(/rendertest.txt/).to_stdout
114
- expect(FileUtils.compare_file(rendered_merged, rendered_ext)).to be_truthy
135
+ expect(FileUtils.compare_file(spec_merged, rendered_ext)).to be_truthy
115
136
  end
116
137
  end
117
138
  end
118
139
 
119
- describe '#vars' do
120
- context 'When a directory is supplied.' do
140
+ describe '#vars' do # rubocop:disable Metrics/BlockLength
141
+ context 'When a directory is supplied.' do # rubocop:disable Metrics/BlockLength
121
142
  context 'should serialize and recursively merge variables' do
122
143
  before do
123
- cli.options = { format: 'yaml', merge: true, vars: 'vars' }
124
- @merged =
125
- File.read(File.join(File.dirname(__FILE__), 'resources/vars_merged.txt'))
144
+ cli.options = { format: 'yaml', merge: true, merge_opts: {}, vars: 'vars' }
145
+ @merged = File.read(File.absolute_path('vars_merged.txt'))
146
+ end
147
+ it 'should perform a deep merge' do
148
+ expect { cli.vars }.to output(@merged).to_stdout
149
+ end
150
+ end
151
+
152
+ context 'should serialize and recursively merge variables with a boolean merge option' do
153
+ before do
154
+ cli.options = {
155
+ format: 'yaml', merge: true,
156
+ merge_opts: { 'overwrite_arrays' => 'true' }, vars: 'vars'
157
+ }
158
+ @merged = File.read(File.absolute_path('vars_opts_bool.txt'))
159
+ end
160
+ it 'should perform a deep merge' do
161
+ expect { cli.vars }.to output(@merged).to_stdout
162
+ end
163
+ end
164
+
165
+ context 'should serialize and recursively merge variables with a string merge option' do
166
+ before do
167
+ cli.options = {
168
+ format: 'yaml', merge: true,
169
+ merge_opts: { 'unpack_arrays' => ',' }, vars: 'vars'
170
+ }
171
+ @merged = File.read(File.absolute_path('vars_opts_string.txt'))
126
172
  end
127
173
  it 'should perform a deep merge' do
128
174
  expect { cli.vars }.to output(@merged).to_stdout
@@ -131,9 +177,8 @@ module Rndr # rubocop:disable Metris/ModuleLength
131
177
 
132
178
  context 'should serialize and merge variables with replace behaviour' do
133
179
  before do
134
- cli.options = { format: 'yaml', merge: false, vars: 'vars' }
135
- @replaced =
136
- File.read(File.join(File.dirname(__FILE__), 'resources/vars_replaced.txt'))
180
+ cli.options = { format: 'yaml', merge: false, merge_opts: {}, vars: 'vars' }
181
+ @replaced = File.read(File.absolute_path('vars_replaced.txt'))
137
182
  end
138
183
  it 'should perform a standard merge' do
139
184
  expect { cli.vars }.to output(@replaced).to_stdout
@@ -143,9 +188,8 @@ module Rndr # rubocop:disable Metris/ModuleLength
143
188
 
144
189
  context 'When a json file is supplied' do
145
190
  before do
146
- cli.options = { format: 'yaml', merge: true, vars: 'vars/a.json' }
147
- @vars =
148
- File.read(File.join(File.dirname(__FILE__), 'resources/vars_a.txt'))
191
+ cli.options = { format: 'yaml', merge: true, merge_opts: {}, vars: 'vars/a.json' }
192
+ @vars = File.read(File.absolute_path('vars_a.txt'))
149
193
  end
150
194
  it 'should serialize the data' do
151
195
  expect { cli.vars }.to output(@vars).to_stdout
@@ -153,9 +197,8 @@ module Rndr # rubocop:disable Metris/ModuleLength
153
197
  end
154
198
  context 'When a yaml file is supplied' do
155
199
  before do
156
- cli.options = { format: 'yaml', merge: true, vars: 'vars/b.yaml' }
157
- @vars =
158
- File.read(File.join(File.dirname(__FILE__), 'resources/vars_b.txt'))
200
+ cli.options = { format: 'yaml', merge: true, merge_opts: {}, vars: 'vars/b.yaml' }
201
+ @vars = File.read(File.absolute_path('vars_b.txt'))
159
202
  end
160
203
  it 'should serialize the data' do
161
204
  expect { cli.vars }.to output(@vars).to_stdout
File without changes
@@ -0,0 +1,15 @@
1
+ ---
2
+ child:
3
+ childarray:
4
+ - arraykey3: arrayval3
5
+ - arraykey4: arrayval4
6
+ childhash:
7
+ childhashkey1: childhashval1
8
+ childhashkey2: childhashval2
9
+ childhashkey3: childhashval3
10
+ childhashkey4: childhashval4
11
+
12
+
13
+ {"boolkey":false,"numkey":2}
14
+
15
+ parent3: mergeval
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,16 @@
1
+ ---
2
+ parent1:
3
+ child:
4
+ childarray:
5
+ - arraykey3: arrayval3
6
+ - arraykey4: arrayval4
7
+ childhash:
8
+ childhashkey1: childhashval1
9
+ childhashkey2: childhashval2
10
+ childhashkey3: childhashval3
11
+ childhashkey4: childhashval4
12
+ parent2:
13
+ boolkey: false
14
+ numkey: 2
15
+ parent3:
16
+ mergetest: mergeval
@@ -0,0 +1,18 @@
1
+ ---
2
+ parent1:
3
+ child:
4
+ childarray:
5
+ - '{"arraykey1"=>"arrayval1"}'
6
+ - '{"arraykey2"=>"arrayval2"}'
7
+ - '{"arraykey3"=>"arrayval3"}'
8
+ - '{"arraykey4"=>"arrayval4"}'
9
+ childhash:
10
+ childhashkey1: childhashval1
11
+ childhashkey2: childhashval2
12
+ childhashkey3: childhashval3
13
+ childhashkey4: childhashval4
14
+ parent2:
15
+ boolkey: false
16
+ numkey: 2
17
+ parent3:
18
+ mergetest: mergeval
data/spec/spec_helper.rb CHANGED
@@ -20,5 +20,4 @@ RSpec.configure do |config|
20
20
  config.shared_context_metadata_behavior = :apply_to_host_groups
21
21
  config.disable_monkey_patching!
22
22
  config.warnings = true
23
- # config.formatter = 'documentation' unless defined? config.formatter
24
23
  end
@@ -1,5 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  # frozen_string_literal: true
3
+ # rubocop:disable Metrics/BlockLength
3
4
 
4
5
  require 'rndr'
5
6
  require 'yaml'
@@ -8,17 +9,15 @@ require_relative 'spec_helper'
8
9
  module Rndr
9
10
  RSpec.describe Template do
10
11
  before(:all) do
11
- Dir.chdir(File.join(Dir.pwd, 'test'))
12
12
  @success_tmplt = File.absolute_path('templates/rendertest.txt.erb')
13
13
  @fail_tmplt = File.absolute_path('templates/failtest.txt.erb')
14
14
  @rendered_success = File.absolute_path('templates/rendertest.txt')
15
15
  @rendered_fail = File.absolute_path('templates/failtest.txt')
16
- @compare_success = File.join(File.dirname(__FILE__), 'resources/rendered_merged.txt')
16
+ @compare_success = File.absolute_path('spec_merged.txt')
17
17
  @vars =
18
- YAML.load(File.read(File.join(File.dirname(__FILE__), 'resources/vars_merged.txt')))
18
+ YAML.load(File.read(File.absolute_path('vars_merged.txt')))
19
19
  end
20
20
  after(:all) do
21
- Dir.chdir('../')
22
21
  File.delete(@rendered_success) if File.exist?(@rendered_success)
23
22
  File.delete(@rendered_fail) if File.exist?(@rendered_fail)
24
23
  end
@@ -59,3 +58,4 @@ module Rndr
59
58
  end
60
59
  end
61
60
  end
61
+ # rubocop:enable Metrics/BlockLength
data/spec/util_spec.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  # frozen_string_literal: true
3
-
3
+ # rubocop:disable Metrics/BlockLength
4
4
  require 'json'
5
5
  require 'rndr'
6
6
  require 'rspec'
@@ -9,9 +9,6 @@ require_relative 'spec_helper'
9
9
 
10
10
  module Rndr
11
11
  RSpec.describe Rndr do
12
- before(:all) { Dir.chdir(File.join(Dir.pwd, 'test')) }
13
- after(:all) { Dir.chdir('../') }
14
-
15
12
  describe '#matches' do
16
13
  context 'When using the defaults' do
17
14
  let(:matched) { [File.absolute_path('templates/rendertest.txt.erb')] }
@@ -19,7 +16,7 @@ module Rndr
19
16
  [File.absolute_path('templates/ignoretest.txt.erb'),
20
17
  File.absolute_path('templates/failtest.txt.erb')]
21
18
  end
22
- subject(:results) { Rndr.matches(path: 'templates') }
19
+ subject(:results) { Rndr.matches(path: 'templates', ignore_path: 'rndrignore') }
23
20
  it 'should be an Array of filtered paths with default extension' do
24
21
  expect(results).to be_a(Array)
25
22
  expect(results).to match_array(matched)
@@ -32,7 +29,9 @@ module Rndr
32
29
  [File.absolute_path('templates/ignoretest.txt.erb'),
33
30
  File.absolute_path('templates/failtest.txt.erb')]
34
31
  end
35
- subject(:results) { Rndr.matches(path: 'templates', ext: 'tmplt') }
32
+ subject(:results) do
33
+ Rndr.matches(path: 'templates', ext: 'tmplt', ignore_path: 'rndrignore')
34
+ end
36
35
  it 'should be an Array of paths with alternate extension' do
37
36
  expect(results).to be_a(Array)
38
37
  expect(results).to match_array(matched)
@@ -43,9 +42,7 @@ module Rndr
43
42
  describe '#read_vars' do
44
43
  context 'When a directory is supplied' do
45
44
  context 'should serialize and recursively merges variables' do
46
- let(:results) do
47
- YAML.load(File.read(File.join(File.dirname(__FILE__), 'resources/vars_merged.txt')))
48
- end
45
+ let(:results) { YAML.load(File.read('vars_merged.txt')) }
49
46
  subject(:vars) { Rndr.read_vars(path: 'vars', merge: true) }
50
47
  it 'should perform a deep merge' do
51
48
  expect(vars).to eql(results)
@@ -53,7 +50,7 @@ module Rndr
53
50
  end
54
51
  context 'should serialize and merge variables with replace behaviour' do
55
52
  let(:results) do
56
- YAML.load(File.read(File.join(File.dirname(__FILE__), 'resources/vars_replaced.txt')))
53
+ YAML.load(File.read('vars_replaced.txt'))
57
54
  end
58
55
  subject(:vars) { Rndr.read_vars(path: 'vars', merge: false) }
59
56
  it 'should perform a standard merge' do
@@ -63,7 +60,7 @@ module Rndr
63
60
  end
64
61
 
65
62
  context 'When a json file is supplied' do
66
- let(:results) { JSON.load(File.read('vars/a.json')) }
63
+ let(:results) { JSON.parse(File.read('vars/a.json')) }
67
64
  subject(:vars) { Rndr.read_vars(path: 'vars/a.json', merge: true) }
68
65
  it 'should serialize the data' do
69
66
  expect(vars).to eql(results)
@@ -80,3 +77,4 @@ module Rndr
80
77
  end
81
78
  end
82
79
  end
80
+ # rubocop:enable Metrics/BlockLength
data/version.txt CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.0.4
metadata CHANGED
@@ -1,99 +1,113 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rndr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bob Killen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-07 00:00:00.000000000 Z
11
+ date: 2016-12-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: deep_merge
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.1.1
19
+ version: '1.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.1.1
26
+ version: '1.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: thor
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.19.1
33
+ version: '0.19'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.19.1
40
+ version: '0.19'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.12.5
47
+ version: '1.12'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.12.5
54
+ version: '1.12'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 11.2.2
61
+ version: '11.2'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 11.2.2
68
+ version: '11.2'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 3.5.0
75
+ version: '3.5'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 3.5.0
82
+ version: '3.5'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.46'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.46'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: coveralls
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - ">="
101
+ - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: 0.8.15
103
+ version: '0.8'
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - ">="
108
+ - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: 0.8.15
110
+ version: '0.8'
97
111
  description: rndr is a tool that simply renders Ruby erb templates for use with other
98
112
  applications.
99
113
  email:
@@ -120,22 +134,26 @@ files:
120
134
  - lib/rndr/version.rb
121
135
  - rndr.gemspec
122
136
  - spec/cli_spec.rb
123
- - spec/resources/rendered_merged.txt
124
- - spec/resources/rendered_replaced.txt
137
+ - spec/resources/rndrignore
138
+ - spec/resources/spec_merged.txt
139
+ - spec/resources/spec_opts.txt
140
+ - spec/resources/spec_replaced.txt
141
+ - spec/resources/templates/exttest.txt.tmplt
142
+ - spec/resources/templates/failtest.txt.erb
143
+ - spec/resources/templates/ignoretest.txt
144
+ - spec/resources/templates/ignoretest.txt.erb
145
+ - spec/resources/templates/rendertest.txt.erb
146
+ - spec/resources/vars/a.json
147
+ - spec/resources/vars/b.yaml
125
148
  - spec/resources/vars_a.txt
126
149
  - spec/resources/vars_b.txt
127
150
  - spec/resources/vars_merged.txt
151
+ - spec/resources/vars_opts_bool.txt
152
+ - spec/resources/vars_opts_string.txt
128
153
  - spec/resources/vars_replaced.txt
129
154
  - spec/spec_helper.rb
130
155
  - spec/template_spec.rb
131
156
  - spec/util_spec.rb
132
- - test/.rndrignore
133
- - test/templates/exttest.txt.tmplt
134
- - test/templates/failtest.txt.erb
135
- - test/templates/ignoretest.txt.erb
136
- - test/templates/rendertest.txt.erb
137
- - test/vars/a.json
138
- - test/vars/b.yaml
139
157
  - version.txt
140
158
  homepage: https://github.com/arc-ts/rndr
141
159
  licenses: