file_templater 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d257cfba2b31bcafaee4785008f68e5d187401c2
4
+ data.tar.gz: c41333e40ac118c6abd00c45dd75ebd352ac7588
5
+ SHA512:
6
+ metadata.gz: 70fd4f23174142d21e63fda267855c60501945b18167cdc79705f98859c11f19bf89a88d65797f82e032adb26ee458b1aa8bcbdefb7215526f55c4e3ba996697
7
+ data.tar.gz: 629360b5ef0856d50a4438d48734ab6657699acd0028292141f1bd6fc2b47e4f554828298e9cd930f019343423c81dfea6b4b67c2835af69c683467b06e5dcda
data/bin/template ADDED
@@ -0,0 +1,13 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ # Include rel-path ../lib/ in the $LOAD_PATH if it's not there already.
4
+ lib_directory = File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
5
+ $LOAD_PATH.unshift(lib_directory) unless $LOAD_PATH.map { |directory| File.expand_path(directory) }.include?(lib_directory)
6
+
7
+ require "file_templater"
8
+
9
+ FileTemplater::FileActions.create_hub_if_necessary
10
+ FileTemplater::FileActions.require_all_bindings
11
+
12
+ handler = FileTemplater::OptionsHandler.new(ARGV)
13
+ handler.process_actions
@@ -0,0 +1,132 @@
1
+ module FileTemplater
2
+ class FileActions
3
+ class << self
4
+ def create_hub_if_necessary
5
+ HUBS.each do |k, v|
6
+ Dir.mkdir(v) unless Dir.exists?(v)
7
+ end
8
+ end
9
+
10
+ def add(path)
11
+ expanded = File.expand_path(path)
12
+ # Three cases of what we are adding can arise:
13
+ # file of the template being added
14
+ # directory of the template being added
15
+ # binding of the template being added
16
+ type = File.directory?(expanded) ? :directory : (expanded.end_with?(".rb") ? :binding : :file)
17
+ hub = (type == :binding ? :binding : :template)
18
+
19
+ if type == :file
20
+ # If the file we are adding is a single file,
21
+ # make a directory and put the file in it.
22
+ expanded_sans_extension = File.join(HUBS[hub], File.basename(expanded, ".*"))
23
+ FileUtils.mkdir(expanded_sans_extension)
24
+ FileUtils.copy_entry(expanded, File.join(expanded_sans_extension, File.basename(expanded)))
25
+ elsif type == :binding
26
+ # If we are adding a binding,
27
+ # we need to modify the code to work with our system.
28
+ output_file = File.open(File.join(HUBS[hub], File.basename(expanded)), "w")
29
+
30
+ output_file.print "module Bindings\n"
31
+ File.open(expanded, "r").each do |line|
32
+ if line.lstrip.start_with?("class ")
33
+ output_file.print(line + "def get_binding\nbinding\nend\n")
34
+ else
35
+ output_file.print line
36
+ end
37
+ end
38
+ output_file.print "end\n"
39
+
40
+ output_file.close
41
+
42
+ # We will save the original file just in case.
43
+ FileUtils.copy_entry(expanded, File.join(HUBS[:original], File.basename(expanded)))
44
+ else
45
+ FileUtils.copy_entry(expanded, File.join(HUBS[hub], File.basename(expanded)))
46
+ end
47
+ end
48
+
49
+ def remove(path)
50
+ removing_template = !path.end_with?(".rb")
51
+
52
+ unless removing_template
53
+ # Remove the associated binding.
54
+ begin
55
+ FileUtils.remove_file(File.join(HUBS[:binding], path))
56
+ FileUtils.remove_file(File.join(HUBS[:original], path))
57
+ rescue StandardError
58
+ # If we failed to remove one of these files, try to remove a template by the same name.
59
+ removing_template = true
60
+ end
61
+ end
62
+
63
+ # Remove the associated template.
64
+ FileUtils.remove_dir(File.join(HUBS[:template], path), true) if removing_template
65
+ end
66
+
67
+ def list
68
+ # In our list, we want to indicate if a template does not have a corresponding binding.
69
+ # As a result, we should list like so:
70
+ # Template Binding
71
+ # example example.rb
72
+ Terminal::Table.new do |t|
73
+ templates = list_templates.sort
74
+ bindings = list_bindings.sort
75
+
76
+ # table header
77
+ t.add_row ["Template", "Binding"]
78
+ t.add_separator
79
+
80
+ templates.each do |tm|
81
+ bind = tm + ".rb"
82
+ bind = nil unless bindings.include?(bind)
83
+ bindings.delete(bind) if bind
84
+
85
+ t.add_row [tm, bind]
86
+ end
87
+
88
+ bindings.each do |b|
89
+ t.add_row [nil, b]
90
+ end
91
+ end
92
+ end
93
+
94
+ def copy(path)
95
+ if File.exist?(path)
96
+ puts "A file of this name already exists.\nPlease remove it, or else this command will not work."
97
+ return
98
+ end
99
+
100
+ # This code is very similar to that of remove.
101
+ copying_template = !(path.end_with?(".rb") && File.exist?(File.join(HUBS[:binding], path)))
102
+
103
+ FileUtils.copy_entry(File.join(HUBS[copying_template ? :template : :original], path), path)
104
+ end
105
+
106
+ def combined_list
107
+ list_templates + list_bindings
108
+ end
109
+
110
+ def list_templates
111
+ unique_directory_list(HUBS[:template])
112
+ end
113
+
114
+ def list_bindings
115
+ unique_directory_list(HUBS[:binding])
116
+ end
117
+
118
+ # Requires all of the .rb files in HUBS[:binding].
119
+ def require_all_bindings
120
+ unique_directory_list(HUBS[:binding]).each do |f|
121
+ if f.end_with?(".rb")
122
+ require File.join(HUBS[:binding], f)
123
+ end
124
+ end
125
+ end
126
+
127
+ def unique_directory_list(path)
128
+ Dir.entries(path).reject { |d| d == "." || d == ".." }
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,103 @@
1
+ module FileTemplater
2
+ class OptionsHandler
3
+ def initialize(argv)
4
+ @nomodify = false
5
+ @binding = nil
6
+
7
+ @actions = []
8
+
9
+ parser = OptionParser.new do |o|
10
+ o.banner = "Usage: template [options] [binding arguments]"
11
+
12
+ o.separator ""
13
+ o.separator "Specific options:"
14
+
15
+ o.on("-t", "--template TEMPLATE",
16
+ "Load TEMPLATE to insert",
17
+ "into the current directory") do |t|
18
+ @actions << [:template, t]
19
+ end
20
+
21
+ o.on("-b", "--binding BINDING",
22
+ "Load BINDING as the binding",
23
+ "for the loaded template") do |b|
24
+ @binding = b
25
+ end
26
+
27
+ o.on("-a", "--add THING", Array,
28
+ "Add THING, a template or a binding,",
29
+ "to the template or binding directory") do |t|
30
+ @actions << [:add, t]
31
+ end
32
+
33
+ o.on("-r", "--remove THING", Array,
34
+ "Removes template or binding THING") do |tb|
35
+ @actions << [:remove, tb]
36
+ end
37
+
38
+ o.on("-l", "--list",
39
+ "Lists the templates and bindings",
40
+ "that are loaded") do
41
+ @actions << [:list]
42
+ end
43
+
44
+ o.on("-m", "--no-modify",
45
+ "Prevents modifying the template source",
46
+ "when loading") do
47
+ @nomodify = true
48
+ end
49
+
50
+ o.on("-c", "--copy TEMPLATE", Array,
51
+ "Copies TEMPLATE and corresponding binding",
52
+ "into current directory") do |tb|
53
+ @actions << [:copy, tb]
54
+ end
55
+
56
+ o.separator ""
57
+ o.separator "Common options:"
58
+
59
+ o.on_tail("-v", "--version", "Display the version") do
60
+ puts "File Templater (template) version " + VERSION
61
+ exit
62
+ end
63
+
64
+ o.on_tail("-h", "--help", "Show this message") do
65
+ puts o
66
+ exit
67
+ end
68
+ end
69
+
70
+ parser.parse!(argv)
71
+ @arguments = argv
72
+ end
73
+
74
+ def process_actions
75
+ @actions.each do |a|
76
+ command = a.first
77
+ arguments = a[1]
78
+
79
+ case command
80
+ when :template
81
+ # arguments is the template name,
82
+ # @arguments are the extraneous arguments
83
+ template = Template.new(arguments, @arguments, nomodify: @nomodify, bind: @binding)
84
+ template.load
85
+ when :add
86
+ arguments.each do |ar|
87
+ FileActions.add(ar)
88
+ end
89
+ when :remove
90
+ arguments.each do |ar|
91
+ FileActions.remove(ar)
92
+ end
93
+ when :list
94
+ puts FileActions.list
95
+ when :copy
96
+ arguments.each do |ar|
97
+ FileActions.copy(ar)
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,61 @@
1
+ module FileTemplater
2
+ class Template
3
+ # options can include:
4
+ # bind: which binding rather than the default to use
5
+ # nomodify: if the template ERB will be loaded or not
6
+ def initialize(template, arguments, options = {})
7
+ @nomodify = options[:nomodify]
8
+
9
+ @template = File.join(HUBS[:template], template)
10
+ binding_string = options[:bind] || template + ".rb"
11
+ using_binding = File.exist?(File.join(HUBS[:binding], binding_string))
12
+
13
+ if using_binding
14
+ binding_string = File.basename(binding_string, ".*")
15
+
16
+ # Convert binding_string to a class object.
17
+ binding_string = "Bindings::" + binding_string.split("_").map { |w| w.capitalize }.join
18
+ binding_class = Object.const_get(binding_string)
19
+ @bind = binding_class.new(*arguments)
20
+ end
21
+ end
22
+
23
+ def load(folder = @template)
24
+ FileActions.unique_directory_list(folder).each do |f|
25
+ # We need the whole path to f, but we will keep the short name.
26
+ short_name = f
27
+ f = File.join(folder, f)
28
+
29
+ if File.directory?(f)
30
+ self.load f
31
+ else
32
+ if !@nomodify && f.end_with?(".erb")
33
+ output_file = File.open(File.join(Dir.pwd, transform_file_name(short_name)), "w")
34
+
35
+ input_file = File.open(f, "r")
36
+ output_file.print(ERB.new(input_file.read, nil, "<>").result(@bind && @bind.get_binding))
37
+ input_file.close
38
+
39
+ output_file.close
40
+ else
41
+ FileUtils.copy_entry(f, File.join(Dir.pwd, transform_file_name(short_name)))
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ # Expands the variable-in-file-name notation.
48
+ # file is expected to be a short name
49
+ def transform_file_name(file)
50
+ if @bind
51
+ variables = file.scan(/{{([^}]*)}}/).flatten
52
+
53
+ variables.each do |v|
54
+ file.sub!("{{#{v}}}", @bind.get_binding.eval(v))
55
+ end
56
+ end
57
+
58
+ !@nomodify && file.end_with?(".erb") ? File.basename(file, ".*") : file
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,11 @@
1
+ module FileTemplater
2
+ VERSION = "0.1.0"
3
+
4
+ # The hub is where we store our templates and bindings.
5
+ HUBS = {
6
+ :main => File.join(Dir.home, ".templater"),
7
+ :template => File.join(Dir.home, ".templater", "templates"),
8
+ :binding => File.join(Dir.home, ".templater", "bindings"),
9
+ :original => File.join(Dir.home, ".templater", "original")
10
+ }
11
+ end
@@ -0,0 +1,9 @@
1
+ require "erb"
2
+ require "fileutils"
3
+ require "optparse"
4
+ require "terminal-table"
5
+
6
+ require "file_templater/variables"
7
+ require "file_templater/template"
8
+ require "file_templater/file_actions"
9
+ require "file_templater/options_handler"
metadata ADDED
@@ -0,0 +1,64 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: file_templater
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Sam Craig
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: terminal-table
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.5'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
27
+ description:
28
+ email: sammidysam@gmail.com
29
+ executables:
30
+ - template
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - bin/template
35
+ - lib/file_templater.rb
36
+ - lib/file_templater/file_actions.rb
37
+ - lib/file_templater/options_handler.rb
38
+ - lib/file_templater/template.rb
39
+ - lib/file_templater/variables.rb
40
+ homepage: https://github.com/Sammidysam/file_templater
41
+ licenses:
42
+ - gpl-3.0
43
+ metadata: {}
44
+ post_install_message:
45
+ rdoc_options: []
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ requirements: []
59
+ rubyforge_project:
60
+ rubygems_version: 2.4.8
61
+ signing_key:
62
+ specification_version: 4
63
+ summary: A simple system to create files/file structures from ERB templates.
64
+ test_files: []