filegen 0.0.1 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/.gitignore +1 -0
  2. data/.rdebugrc +7 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +10 -0
  5. data/.simplecov +9 -0
  6. data/.travis.yml +7 -0
  7. data/.yardopts +6 -0
  8. data/Gemfile +30 -0
  9. data/{LICENSE.txt → LICENSE.md} +1 -1
  10. data/README.DEVELOPER.md +28 -0
  11. data/README.md +106 -7
  12. data/Rakefile +60 -1
  13. data/bin/filegen +1 -1
  14. data/config/rubocop-disabled.yml +0 -0
  15. data/config/rubocop-enabled.yml +140 -0
  16. data/cucumber.yml +2 -0
  17. data/features/evaluate_template.feature +134 -0
  18. data/features/output_meta_data.feature +20 -0
  19. data/features/step_definitions.rb +9 -0
  20. data/features/support/env.rb +20 -0
  21. data/filegen.gemspec +8 -9
  22. data/lib/filegen.rb +11 -1
  23. data/lib/filegen/data.rb +48 -0
  24. data/lib/filegen/data_source_builder.rb +49 -0
  25. data/lib/filegen/data_sources.rb +5 -0
  26. data/lib/filegen/data_sources/environment.rb +21 -0
  27. data/lib/filegen/data_sources/yaml.rb +18 -0
  28. data/lib/filegen/erb_generator.rb +21 -6
  29. data/lib/filegen/exceptions.rb +8 -0
  30. data/lib/filegen/options.rb +77 -6
  31. data/lib/filegen/runner.rb +29 -9
  32. data/lib/filegen/version.rb +2 -1
  33. data/rubocop-todo.yml +144 -0
  34. data/scripts/terminal +12 -0
  35. data/spec/data_source_builder_spec.rb +53 -0
  36. data/spec/data_sources/environment_spec.rb +20 -0
  37. data/spec/data_sources/yaml_spec.rb +31 -0
  38. data/spec/data_spec.rb +60 -0
  39. data/spec/erb_generator_spec.rb +31 -0
  40. data/spec/options_spec.rb +32 -0
  41. data/spec/spec_helper.rb +10 -0
  42. data/spec/support/config.rb +6 -0
  43. data/spec/support/debugging.rb +5 -0
  44. data/spec/support/environment.rb +7 -0
  45. data/spec/support/filesystem.rb +11 -0
  46. data/spec/support/here_doc.rb +2 -0
  47. metadata +58 -25
  48. data/lib/filegen/env.rb +0 -14
@@ -1,22 +1,42 @@
1
1
  # encoding: utf-8
2
2
  module Filegen
3
+ # Commandline from end
3
4
  class Runner
5
+ private
6
+
4
7
  attr_reader :options, :generator
5
8
 
6
- def initialize(argv)
7
- @options = Options.new(argv)
8
- @generator = ErbGenerator.new(Env.new.my_binding)
9
+ public
10
+
11
+ # Create runner
12
+ # @param [Array] argv
13
+ # Commandline arguments
14
+ # @param [IO] stdin
15
+ # Stdin
16
+ # @param [IO] stdout
17
+ # Stdout
18
+ # @param [IO] stderr
19
+ # Stderr
20
+ # @param [Kernel] kernel
21
+ # Kernel class
22
+ def initialize(argv, stdin = $stdin, stdout = $stdout, stderr = $stderr, kernel = Kernel)
23
+ $stdin, $stdout, $stderr, @kernel = stdin, stdout, stderr, kernel
24
+
25
+ @options = Options.new(argv)
26
+ @generator = ErbGenerator.new(Data.new(@options.data_sources))
9
27
  end
10
28
 
11
- def run
29
+ # Execute runner
30
+ def execute!
12
31
  begin
13
- generator.compile(options.source,options.destination)
14
- rescue Exception => e
15
- puts e.message
16
- exit 1
32
+ generator.compile(options.source, options.destination)
33
+ exitstatus = 0
34
+ rescue RuntimeError => e
35
+ $stderr.puts e.message
36
+ exitstatus = 1
17
37
  end
18
38
 
19
- exit 0
39
+ @kernel.exit(exitstatus)
20
40
  end
21
41
  end
22
42
  end
@@ -1,3 +1,4 @@
1
+ #main Filegen
1
2
  module Filegen
2
- VERSION = "0.0.1"
3
+ VERSION = '0.1.1'
3
4
  end
@@ -0,0 +1,144 @@
1
+ # This configuration was generated by `rubocop --auto-gen-config`.
2
+ # The point is for the user to remove these configuration records
3
+ # one by one as the offences are removed from the code base.
4
+
5
+ AccessModifierIndentation:
6
+ Enabled: true
7
+
8
+ Alias:
9
+ Enabled: false
10
+
11
+ AlignParameters:
12
+ Enabled: false
13
+
14
+ Blocks:
15
+ Enabled: false
16
+
17
+ BracesAroundHashParameters:
18
+ Enabled: false
19
+
20
+ CaseEquality:
21
+ Enabled: false
22
+
23
+ CharacterLiteral:
24
+ Enabled: false
25
+
26
+ ClassVars:
27
+ Enabled: false
28
+
29
+ CollectionMethods:
30
+ Enabled: false
31
+
32
+ ColonMethodCall:
33
+ Enabled: false
34
+
35
+ Documentation:
36
+ Enabled: false
37
+
38
+ EmptyLinesAroundAccessModifier:
39
+ Enabled: false
40
+
41
+ EmptyLinesAroundBody:
42
+ Enabled: false
43
+
44
+ Encoding:
45
+ Enabled: false
46
+
47
+ Eval:
48
+ Enabled: false
49
+
50
+ FinalNewline:
51
+ Enabled: false
52
+
53
+ HashSyntax:
54
+ Enabled: false
55
+
56
+ IfUnlessModifier:
57
+ Enabled: false
58
+
59
+ IndentationWidth:
60
+ Enabled: false
61
+
62
+ Lambda:
63
+ Enabled: false
64
+
65
+ LeadingCommentSpace:
66
+ Enabled: false
67
+
68
+ LineLength:
69
+ Max: 188
70
+
71
+ MethodLength:
72
+ Max: 23
73
+
74
+ ParenthesesAroundCondition:
75
+ Enabled: false
76
+
77
+ PerlBackrefs:
78
+ Enabled: false
79
+
80
+ RaiseArgs:
81
+ Enabled: false
82
+
83
+ RedundantSelf:
84
+ Enabled: false
85
+
86
+ RegexpLiteral:
87
+ Enabled: false
88
+
89
+ Semicolon:
90
+ Enabled: false
91
+
92
+ SignalException:
93
+ Enabled: false
94
+
95
+ SingleLineBlockParams:
96
+ Enabled: false
97
+
98
+ SpaceAfterComma:
99
+ Enabled: false
100
+
101
+ SpaceAfterControlKeyword:
102
+ Enabled: false
103
+
104
+ SpaceAfterNot:
105
+ Enabled: false
106
+
107
+ SpaceAroundBlockBraces:
108
+ Enabled: false
109
+
110
+ SpaceAroundEqualsInParameterDefault:
111
+ Enabled: false
112
+
113
+ SpaceAroundOperators:
114
+ Enabled: false
115
+
116
+ SpaceInsideBrackets:
117
+ Enabled: false
118
+
119
+ SpaceInsideHashLiteralBraces:
120
+ Enabled: false
121
+
122
+ SpaceInsideParens:
123
+ Enabled: false
124
+
125
+ SpecialGlobalVars:
126
+ Enabled: false
127
+
128
+ StringLiterals:
129
+ Enabled: false
130
+
131
+ TrailingBlankLines:
132
+ Enabled: false
133
+
134
+ TrailingWhitespace:
135
+ Enabled: false
136
+
137
+ TrivialAccessors:
138
+ Enabled: false
139
+
140
+ UselessAssignment:
141
+ Enabled: false
142
+
143
+ WordArray:
144
+ Enabled: false
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require 'tmrb'
5
+
6
+ tmux = TmRb::Multiplexer.new
7
+ # creates an empty window
8
+ tmux.new_session(session_name: 'filegen')
9
+
10
+ tmux.new_window(name: 'code', command: 'vim -c :NERDTree lib')
11
+ tmux.new_window(name: 'spec', command: 'vim -c :NERDTree spec')
12
+ tmux.start
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe DataSourceBuilder do
5
+ context '#sources' do
6
+ it 'returns data sources' do
7
+ yaml_builder = double('yaml_builder')
8
+ env_builder = double('env_builder')
9
+
10
+ params = double('params')
11
+ allow(params).to receive(:data_sources).and_return([:yaml, :env])
12
+ allow(params).to receive(:data_source_builders).and_return(yaml: yaml_builder, env: env_builder)
13
+ allow(params).to receive(:yaml_file).and_return('')
14
+
15
+ expect { DataSourceBuilder.new(params) }.not_to raise_error
16
+ end
17
+
18
+ it 'raises an exception on invalid input' do
19
+ params = double('params')
20
+ allow(params).to receive(:data_sources).and_return([:yaml, 'garbage'])
21
+ allow(params).to receive(:data_source_builders).and_return({})
22
+ allow(params).to receive(:yaml_file).and_return('')
23
+
24
+ expect { DataSourceBuilder.new(params) }.to raise_error Exceptions::InvalidDataSources
25
+ end
26
+
27
+ it 'supports order of data sources: env first' do
28
+ yaml_builder = double('yaml_builder')
29
+ env_builder = double('env_builder')
30
+
31
+ params = double('params')
32
+ allow(params).to receive(:data_sources).and_return([:env, :yaml])
33
+ allow(params).to receive(:data_source_builders).and_return(yaml: yaml_builder, env: env_builder)
34
+ allow(params).to receive(:yaml_file).and_return('')
35
+
36
+ builder = DataSourceBuilder.new(params)
37
+ expect(builder.sources.first).to be(env_builder)
38
+ end
39
+
40
+ it 'supports order of data sources: yaml first' do
41
+ yaml_builder = double('yaml_builder')
42
+ env_builder = double('env_builder')
43
+
44
+ params = double('params')
45
+ allow(params).to receive(:data_sources).and_return([:yaml, :env])
46
+ allow(params).to receive(:data_source_builders).and_return(yaml: yaml_builder, env: env_builder)
47
+ allow(params).to receive(:yaml_file).and_return('')
48
+
49
+ builder = DataSourceBuilder.new(params)
50
+ expect(builder.sources.first).to be yaml_builder
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe DataSources::Environment do
5
+ context '#fetch' do
6
+ it 'retrieves environment variables' do
7
+ in_environment 'MY_NAME' => 'Karl' do
8
+ source = DataSources::Environment.new
9
+ expect(source.fetch('MY_NAME')).to eq('Karl')
10
+ end
11
+ end
12
+
13
+ it 'returns nil if variable cannot be found' do
14
+ in_environment 'MY_NAME' => 'Karl' do
15
+ source = DataSources::Environment.new
16
+ expect(source.fetch('NOT_MY_NAME')).to be_nil
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe DataSources::Yaml do
5
+ context '#fetch' do
6
+ it 'retrieves variables from yaml file' do
7
+ file = create_file('blub.yaml', <<-EOF.strip_heredoc
8
+ ---
9
+ MY_NAME: Karl
10
+ EOF
11
+ )
12
+ source = DataSources::Yaml.new(file)
13
+ expect(source.fetch('MY_NAME')).to eq('Karl')
14
+ end
15
+
16
+ it 'returns nil if variable cannot be found' do
17
+ file = create_file('blub.yaml', <<-EOF.strip_heredoc
18
+ ---
19
+ MY_NAME: Karl
20
+ EOF
21
+ )
22
+ source = DataSources::Yaml.new(file)
23
+ expect(source.fetch('NOT_MY_NAME')).to be_nil
24
+ end
25
+
26
+ it 'returns nil if file cannot be found' do
27
+ source = DataSources::Yaml.new('not valid file')
28
+ expect(source.fetch('NOT_MY_NAME')).to be_nil
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,60 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe Filegen::Data do
5
+ context '#instance_binding' do
6
+ it 'let you variables' do
7
+ source = double('DataSource')
8
+ expect(source).to receive(:fetch).with('MY_NAME').and_return('Karl')
9
+
10
+ data = Filegen::Data.new(source)
11
+ # rubocop:disable Eval
12
+ result = eval('lookup("MY_NAME")', data.instance_binding)
13
+ # rubocop:enable Eval
14
+ expect(result).to eq('Karl')
15
+ end
16
+ end
17
+
18
+ context '#lookup' do
19
+ it 'provides access to variables' do
20
+ source = double('DataSource')
21
+ expect(source).to receive(:fetch).with('MY_NAME').and_return('Karl')
22
+
23
+ data = Filegen::Data.new(source)
24
+ expect(data.lookup('MY_NAME')).to eq('Karl')
25
+ end
26
+
27
+ it 'supports multiple data sources: first has match' do
28
+ source1 = double('DataSource1')
29
+ expect(source1).to receive(:fetch).with('MY_NAME').and_return('Egon')
30
+
31
+ source2 = double('DataSource2')
32
+ expect(source2).not_to receive(:fetch)
33
+
34
+ data = Filegen::Data.new([source1, source2])
35
+ expect(data.lookup('MY_NAME')).to eq('Egon')
36
+ end
37
+
38
+ it 'supports multiple data sources: last has match' do
39
+ source1 = double('DataSource1')
40
+ expect(source1).to receive(:fetch).with('MY_NAME').and_return(nil)
41
+
42
+ source2 = double('DataSource2')
43
+ expect(source2).to receive(:fetch).with('MY_NAME').and_return('Egon')
44
+
45
+ data = Filegen::Data.new([source1, source2])
46
+ expect(data.lookup('MY_NAME')).to eq('Egon')
47
+ end
48
+
49
+ it 'returns "" if none matches' do
50
+ source1 = double('DataSource1')
51
+ expect(source1).to receive(:fetch).with('MY_NAME').and_return(nil)
52
+
53
+ source2 = double('DataSource2')
54
+ expect(source2).to receive(:fetch).with('MY_NAME').and_return(nil)
55
+
56
+ data = Filegen::Data.new([source1, source2])
57
+ expect(data.lookup('MY_NAME')).to eq('')
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe ErbGenerator do
5
+ context '#compile' do
6
+ it 'needs a source and a target' do
7
+ data = double('binding')
8
+ allow(data).to receive(:instance_binding) do
9
+ Class.new do
10
+ def name
11
+ 'Karl'
12
+ end
13
+
14
+ def instance_binding
15
+ binding
16
+ end
17
+ end.new.instance_binding
18
+ end
19
+
20
+ source = double('source')
21
+ allow(source).to receive(:encoding)
22
+ allow(source).to receive(:read).and_return('Hello <%= name %>')
23
+
24
+ destination = double('destination')
25
+ expect(destination).to receive(:puts).with('Hello Karl')
26
+
27
+ gen = ErbGenerator.new(data)
28
+ gen.compile(source, destination)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe Options do
5
+ context '#destination' do
6
+ it 'returns an io handle' do
7
+ options = Options.new([])
8
+ expect(options.destination).to respond_to(:puts)
9
+ end
10
+ end
11
+
12
+ context '#source' do
13
+ it 'returns an io handle' do
14
+ template_file = create_file('template.erb')
15
+
16
+ options = Options.new([template_file])
17
+ expect(options.source).to respond_to(:read)
18
+ end
19
+
20
+ it 'raises an exception if file does not exist' do
21
+ options = Options.new(['template_file'])
22
+ expect { options.source }.to raise_error RuntimeError
23
+ end
24
+
25
+ it 'raises an exception if file does not have a erb-extension' do
26
+ template_file = create_file('template')
27
+
28
+ options = Options.new([template_file])
29
+ expect { options.source }.to raise_error RuntimeError
30
+ end
31
+ end
32
+ end