codestrap 0.1.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.
Files changed (150) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.travis.yml +4 -0
  4. data/.yardopts +3 -0
  5. data/BOILERPLATE.md +151 -0
  6. data/CODESTRAPFILE.md +28 -0
  7. data/Gemfile +6 -0
  8. data/LICENSE.txt +13 -0
  9. data/README.md +69 -0
  10. data/Rakefile +51 -0
  11. data/bin/strap +8 -0
  12. data/bin/upstrap +8 -0
  13. data/codestrap.gemspec +37 -0
  14. data/config/projects/codestrap.rb +22 -0
  15. data/config/software/codestrap.rb +20 -0
  16. data/config/software/ruby.rb +247 -0
  17. data/config/software/zlib.rb +86 -0
  18. data/features/client.feature +99 -0
  19. data/features/fixtures/client/home/codestrap/bin/.empty +0 -0
  20. data/features/fixtures/client/home/codestrap/content/bash.erb +3 -0
  21. data/features/fixtures/client/home/codestrap/content/gem/dir/file +0 -0
  22. data/features/fixtures/client/home/codestrap/content/gem/dir/template +3 -0
  23. data/features/fixtures/client/home/codestrap/content/gem/file +1 -0
  24. data/features/fixtures/client/home/codestrap/content/gem/template +3 -0
  25. data/features/fixtures/client/home/codestrap/content/local_remote.erb +1 -0
  26. data/features/fixtures/client/home/codestrap/content/local_remote/dir/file +0 -0
  27. data/features/fixtures/client/home/codestrap/content/local_remote/dir/template +3 -0
  28. data/features/fixtures/client/home/codestrap/content/local_remote/file +1 -0
  29. data/features/fixtures/client/home/codestrap/content/local_remote/template +3 -0
  30. data/features/fixtures/client/home/codestrap/objects/local.json +3 -0
  31. data/features/fixtures/client/output/.empty +0 -0
  32. data/features/fixtures/client/var/lib/codestrap/bin/.empty +0 -0
  33. data/features/fixtures/client/var/lib/codestrap/content/bashremote.erb +3 -0
  34. data/features/fixtures/client/var/lib/codestrap/content/gemremote/dir/file +0 -0
  35. data/features/fixtures/client/var/lib/codestrap/content/gemremote/dir/template +3 -0
  36. data/features/fixtures/client/var/lib/codestrap/content/gemremote/file +0 -0
  37. data/features/fixtures/client/var/lib/codestrap/content/gemremote/template +3 -0
  38. data/features/fixtures/client/var/lib/codestrap/content/remote_local.erb +1 -0
  39. data/features/fixtures/client/var/lib/codestrap/content/remote_local/dir/file +0 -0
  40. data/features/fixtures/client/var/lib/codestrap/content/remote_local/dir/template +3 -0
  41. data/features/fixtures/client/var/lib/codestrap/content/remote_local/file +1 -0
  42. data/features/fixtures/client/var/lib/codestrap/content/remote_local/template +3 -0
  43. data/features/fixtures/client/var/lib/codestrap/content/remote_remote.erb +1 -0
  44. data/features/fixtures/client/var/lib/codestrap/content/remote_remote/dir/file +0 -0
  45. data/features/fixtures/client/var/lib/codestrap/content/remote_remote/dir/template +3 -0
  46. data/features/fixtures/client/var/lib/codestrap/content/remote_remote/file +0 -0
  47. data/features/fixtures/client/var/lib/codestrap/content/remote_remote/template +3 -0
  48. data/features/fixtures/client/var/lib/codestrap/objects/remote.json +3 -0
  49. data/features/fixtures/logging/home/logging/codestrap/bin/stubdirectory/.empty +0 -0
  50. data/features/fixtures/logging/home/logging/codestrap/bin/stubnotlink +0 -0
  51. data/features/fixtures/logging/home/logging/codestrap/content/.empty +0 -0
  52. data/features/fixtures/logging/home/logging/codestrap/objects/.empty +0 -0
  53. data/features/fixtures/server/mixed/var/lib/stub/content/address.erb +3 -0
  54. data/features/fixtures/server/mixed/var/lib/stub/content/cell.erb +3 -0
  55. data/features/fixtures/server/mixed/var/lib/stub/content/email.erb +3 -0
  56. data/features/fixtures/server/mixed/var/lib/stub/content/mobile.erb +3 -0
  57. data/features/fixtures/server/mixed/var/lib/stub/content/name.erb +3 -0
  58. data/features/fixtures/server/mixed/var/lib/stub/content/phone.erb +3 -0
  59. data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/Modulefile +12 -0
  60. data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/README +17 -0
  61. data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/manifests/init.pp +42 -0
  62. data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/spec/spec_helper.rb +18 -0
  63. data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/tests/init.pp +13 -0
  64. data/features/fixtures/server/mixed/var/lib/stub/objects/contact.json +8 -0
  65. data/features/fixtures/server/mixed/var/lib/stub/objects/shadow/contact.json +8 -0
  66. data/features/fixtures/strap/projects/etc/.empty +0 -0
  67. data/features/fixtures/strap/projects/home/user/dir/bin/.empty +0 -0
  68. data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/Modulefile +12 -0
  69. data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/README +17 -0
  70. data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/manifests/:stub:project.name:/subclass.pp +3 -0
  71. data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/manifests/init.pp +42 -0
  72. data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/spec/spec_helper.rb +18 -0
  73. data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/tests/init.pp +13 -0
  74. data/features/fixtures/strap/projects/home/user/dir/objects/contact.json +8 -0
  75. data/features/fixtures/strap/projects/home/user/dir/objects/shadow/contact.json +8 -0
  76. data/features/fixtures/strap/projects/output/.empty +0 -0
  77. data/features/fixtures/stub/contact/etc/.empty +0 -0
  78. data/features/fixtures/stub/contact/home/user/dir/bin/.empty +0 -0
  79. data/features/fixtures/stub/contact/home/user/dir/content/address.erb +3 -0
  80. data/features/fixtures/stub/contact/home/user/dir/content/cell.erb +3 -0
  81. data/features/fixtures/stub/contact/home/user/dir/content/email.erb +3 -0
  82. data/features/fixtures/stub/contact/home/user/dir/content/mobile.erb +3 -0
  83. data/features/fixtures/stub/contact/home/user/dir/content/name.erb +3 -0
  84. data/features/fixtures/stub/contact/home/user/dir/content/phone.erb +3 -0
  85. data/features/fixtures/stub/contact/home/user/dir/objects/contact.json +8 -0
  86. data/features/fixtures/stub/contact/home/user/dir/objects/shadow/contact.json +8 -0
  87. data/features/fixtures/stub/contact/output/.empty +0 -0
  88. data/features/fixtures/stub/date/etc/.empty +0 -0
  89. data/features/fixtures/stub/date/home/user/stub/bin/.empty +0 -0
  90. data/features/fixtures/stub/date/home/user/stub/content/day.erb +3 -0
  91. data/features/fixtures/stub/date/home/user/stub/content/hour.erb +3 -0
  92. data/features/fixtures/stub/date/home/user/stub/content/minute.erb +3 -0
  93. data/features/fixtures/stub/date/home/user/stub/content/month.erb +3 -0
  94. data/features/fixtures/stub/date/home/user/stub/content/second.erb +3 -0
  95. data/features/fixtures/stub/date/home/user/stub/content/year.erb +3 -0
  96. data/features/fixtures/stub/date/home/user/stub/objects/.empty +0 -0
  97. data/features/fixtures/stub/date/output/.empty +0 -0
  98. data/features/fixtures/stub/script/etc/.empty +0 -0
  99. data/features/fixtures/stub/script/home/user/stub/bin/.empty +0 -0
  100. data/features/fixtures/stub/script/home/user/stub/content/credentials.erb +6 -0
  101. data/features/fixtures/stub/script/home/user/stub/objects/credentials.rb +11 -0
  102. data/features/fixtures/stub/script/output/.empty +0 -0
  103. data/features/logging.feature +39 -0
  104. data/features/object_scripts.feature +13 -0
  105. data/features/server.feature +36 -0
  106. data/features/step_definitions/client_steps.rb +99 -0
  107. data/features/step_definitions/logging_steps.rb +65 -0
  108. data/features/step_definitions/object_scripts_steps.rb +26 -0
  109. data/features/step_definitions/server_steps.rb +112 -0
  110. data/features/step_definitions/strap_steps.rb +69 -0
  111. data/features/step_definitions/stub_option_simple_steps.rb +31 -0
  112. data/features/step_definitions/stub_steps.rb +94 -0
  113. data/features/strap.feature +34 -0
  114. data/features/stub.feature +157 -0
  115. data/features/stub_option_simple.feature +14 -0
  116. data/features/stub_packages.feature +15 -0
  117. data/features/support/env.rb +197 -0
  118. data/lib/codestrap.rb +415 -0
  119. data/lib/codestrap/cli.rb +76 -0
  120. data/lib/codestrap/client.rb +179 -0
  121. data/lib/codestrap/config.rb +199 -0
  122. data/lib/codestrap/log.rb +56 -0
  123. data/lib/codestrap/mixin.rb +20 -0
  124. data/lib/codestrap/namespace.rb +19 -0
  125. data/lib/codestrap/object/abstract.rb +33 -0
  126. data/lib/codestrap/object/factory.rb +86 -0
  127. data/lib/codestrap/object/standard/datetime.rb +24 -0
  128. data/lib/codestrap/object/standard/files.rb +40 -0
  129. data/lib/codestrap/object/standard/project.rb +33 -0
  130. data/lib/codestrap/object/standard/rest.rb +30 -0
  131. data/lib/codestrap/patch.rb +122 -0
  132. data/lib/codestrap/server/rest.rb +177 -0
  133. data/lib/codestrap/server/version.rb +5 -0
  134. data/lib/codestrap/strap/abstract.rb +135 -0
  135. data/lib/codestrap/strap/factory.rb +85 -0
  136. data/lib/codestrap/strap/standard.rb +95 -0
  137. data/lib/codestrap/stub/abstract.rb +156 -0
  138. data/lib/codestrap/stub/factory.rb +87 -0
  139. data/lib/codestrap/stub/standard.rb +23 -0
  140. data/lib/codestrap/version.rb +3 -0
  141. data/omnibus.rb +53 -0
  142. data/package-scripts/codestrap/postinst +25 -0
  143. data/package-scripts/codestrap/postrm +17 -0
  144. data/package-scripts/codestrap/preinst +7 -0
  145. data/package-scripts/codestrap/prerm +15 -0
  146. data/resources/codestrap/pkg/background.png +0 -0
  147. data/resources/codestrap/pkg/distribution.xml.erb +22 -0
  148. data/resources/codestrap/pkg/license.html.erb +202 -0
  149. data/resources/codestrap/pkg/welcome.html.erb +7 -0
  150. metadata +466 -0
@@ -0,0 +1,179 @@
1
+ require 'digest'
2
+ require 'etc'
3
+ require 'net/http'
4
+ require 'json'
5
+ require 'tmpdir'
6
+ require 'tempfile'
7
+ require 'fileutils'
8
+
9
+ module Codestrap
10
+ class Client
11
+ def initialize(url)
12
+ uri = URI url
13
+ @url = url
14
+ @scheme = uri.scheme
15
+ @host = uri.host
16
+ @port = uri.port
17
+ self.capability uri
18
+ end
19
+
20
+ # Cache directory path. Will be created if directory doesn't exist
21
+ #
22
+ # @return [String]
23
+ def cache
24
+ @cache ||= begin
25
+ cache = File.join(Dir.tmpdir, Etc.getlogin, digest, 'codestrap')
26
+ FileUtils.mkpath cache unless File.exist? cache
27
+ @cache = cache
28
+ end
29
+ end
30
+
31
+ # Content cache directory path. Will be created if directory doesn't exists
32
+ #
33
+ # @return [String]
34
+ def cache_content
35
+ @cache_content ||= begin
36
+ cache_content = File.join(cache, 'content')
37
+ FileUtils.mkpath cache_content unless File.exist? cache_content
38
+ @cache_content = cache_content
39
+ end
40
+ end
41
+
42
+ # Object cache directory path. Will be created if directory doesn't exists
43
+ #
44
+ # @return [String]
45
+ def cache_object
46
+ @cache_object ||= begin
47
+ cache_object = File.join(cache, 'objects')
48
+ FileUtils.mkpath cache_object unless File.exist? cache_object
49
+ @cache_object = cache_object
50
+ end
51
+ end
52
+
53
+ # Return MD5 hexdigest digest of the capability URL
54
+ #
55
+ # @return [String]
56
+ def digest
57
+ @digest ||= (Digest::MD5.hexdigest @url)
58
+ end
59
+
60
+ # Sets capability URL. Returns JSON capability document as hash.
61
+ #
62
+ # @param [URI] uri
63
+ # Capability URI
64
+ # @return [Hash|nil]
65
+ # JSON document as a Hash
66
+ def capability(uri=nil)
67
+ return @capability unless uri
68
+ begin
69
+ response = Net::HTTP.get_response URI uri
70
+ @capability = JSON.parse(response.body)
71
+ return @capability
72
+ rescue Errno::ECONNREFUSED
73
+ nil
74
+ end
75
+ end
76
+
77
+ def stubmetadata(file)
78
+ return nil unless @capability
79
+ response = Net::HTTP.get_response URI stubmetadataurl + '?name=' + file
80
+ JSON.parse(response.body)
81
+ end
82
+
83
+ def stubmetadataurl
84
+ return nil unless @capability
85
+ "#{@scheme}://#{@host}:#{@port}#{@capability['urls']['stub']['metadata']}"
86
+ end
87
+
88
+ def stublist
89
+ return nil unless @capability
90
+ response = Net::HTTP.get_response URI stubmetadataurl
91
+ JSON.parse(response.body).keys
92
+ end
93
+
94
+ def stubfileurl
95
+ return nil unless @capability
96
+ "#{@scheme}://#{@host}:#{@port}#{@capability['urls']['stub']['file']}"
97
+ end
98
+
99
+ def strapmetadata(project)
100
+ return nil unless @capability
101
+ response = Net::HTTP.get_response URI strapmetadataurl + '?name=' + project
102
+ JSON.parse(response.body)[project]
103
+ end
104
+
105
+ def straplist
106
+ return nil unless @capability
107
+ response = Net::HTTP.get_response URI strapmetadataurl
108
+ JSON.parse(response.body).keys
109
+ end
110
+
111
+ def strapmetadataurl
112
+ return nil unless @capability
113
+ "#{@scheme}://#{@host}:#{@port}#{@capability['urls']['strap']['metadata']}"
114
+ end
115
+
116
+ def strapprojecturl
117
+ return nil unless @capability
118
+ "#{@scheme}://#{@host}:#{@port}#{@capability['urls']['strap']['project']}"
119
+ end
120
+
121
+ def objecturl
122
+ return nil unless @capability
123
+ "#{@scheme}://#{@host}:#{@port}#{@capability['urls']['objects']}"
124
+ end
125
+
126
+ def getobjects(objects=nil)
127
+ return {} unless @capability
128
+ response = Net::HTTP.get_response URI objecturl
129
+ JSON.parse(response.body)
130
+ end
131
+
132
+ def getstub(codestrap)
133
+ return nil unless @capability
134
+ path = File.join(cache_content, codestrap + '.erb')
135
+
136
+ # Get metadata
137
+ metadata = stubmetadata codestrap
138
+ if not metadata or metadata.empty?
139
+ return nil
140
+ end
141
+
142
+ # create file
143
+ response = Net::HTTP.get_response URI stubfileurl + "/#{codestrap}"
144
+ File.open(path, 'w') do |file|
145
+ file.write response.body
146
+ end
147
+
148
+ path
149
+ end
150
+
151
+ def getstrap(project)
152
+ return nil unless @capability
153
+ path = File.join(cache_content, project)
154
+
155
+ # Get metadata
156
+ metadata = strapmetadata project
157
+ if not metadata or metadata.empty?
158
+ return nil
159
+ end
160
+
161
+ # Make directories
162
+ metadata['files'].each do |file|
163
+ next unless file['ftype'].eql?('directory')
164
+ FileUtils.mkdir_p File.join(path, file['file'])
165
+ end
166
+
167
+ # Make files
168
+ metadata['files'].each do |file|
169
+ next unless file['ftype'].eql?('file')
170
+ response = Net::HTTP.get_response URI strapprojecturl + "/#{project}/" + file['file']
171
+ File.open(File.join(path, file['file']), 'w') do |fh|
172
+ fh.write response.body
173
+ end
174
+ end
175
+
176
+ path
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,199 @@
1
+ module Codestrap
2
+ module Server
3
+ class Config
4
+ # Bind IP Address
5
+ # @return [String]
6
+ attr_accessor :bind
7
+ # Port number
8
+ # @return [Integer]
9
+ attr_accessor :port
10
+ # Array of files
11
+ # @return [Array]
12
+ attr_accessor :base
13
+ # Ignore files from project
14
+ # @return [Array]
15
+ attr_accessor :ignore
16
+
17
+ # List of content directories
18
+ # @return [Array]
19
+ def content
20
+ Array(base).map { |dir| File.join(dir, 'content') }
21
+ end
22
+
23
+ # List of object directories
24
+ # @return [Array]
25
+ def objects
26
+ Array(base).map { |dir| File.join(dir, 'objects') }
27
+ end
28
+ end
29
+ end
30
+ module Local
31
+ class Config
32
+ # Array of directories
33
+ # @return [Array]
34
+ attr_accessor :base
35
+ # Array of capability URLs
36
+ # @return [Array]
37
+ attr_accessor :urls
38
+ # List of files to ignore when parsing boiler plates
39
+ # @return [Array]
40
+ attr_accessor :ignore
41
+ # Directory to store links to executable
42
+ # @return [String]
43
+ def links
44
+ links = nil
45
+ Array(base).each do |dir|
46
+ path = File.join(dir, 'bin')
47
+ next unless File.exist? path
48
+ links = path
49
+ break
50
+ end
51
+ links
52
+ end
53
+
54
+ # List of content directories
55
+ # @return [Array]
56
+ def content
57
+ Array(base).map { |dir| File.join(dir, 'content') }
58
+ end
59
+
60
+ # List of object directories
61
+ # @return [Array]
62
+ def objects
63
+ Array(base).map { |dir| File.join(dir, 'objects') }
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ class Codestrapfile
70
+ def self.server
71
+ @@server ||= Codestrap::Server::Config.new
72
+ end
73
+
74
+ def self.local
75
+ @@local ||= Codestrap::Local::Config.new
76
+ end
77
+
78
+ def server
79
+ @@server ||= Codestrap::Server::Config.new
80
+
81
+ if block_given?
82
+ yield @@server
83
+ else
84
+ @@server
85
+ end
86
+ end
87
+
88
+ def local
89
+ @@local ||= Codestrap::Local::Config.new
90
+
91
+ if block_given?
92
+ yield @@local
93
+ else
94
+ @@local
95
+ end
96
+ end
97
+
98
+ def self.config
99
+ obj = Codestrapfile.new()
100
+ yield obj if block_given?
101
+ end
102
+ end
103
+
104
+ module Codestrap
105
+ # Loaded variables from Codestrapfile presented as getters
106
+ class Config
107
+ def initialize
108
+ # Setup defaults
109
+ Codestrapfile.config do |conf|
110
+ conf.local.base = %W[codestrap .codestrap].map { |d| File.join(ENV['HOME'], d) }
111
+ conf.local.ignore = []
112
+ conf.server.bind = '127.0.0.1'
113
+ conf.server.port = '4567'
114
+ conf.server.base = conf.local.base
115
+ conf.server.ignore = conf.local.ignore
116
+ end
117
+
118
+ @@codestrapfile_mtime = Time.new(0)
119
+ load_codestrapfile
120
+ end
121
+
122
+ def codestrapfile_mtime(codestrapfile)
123
+ if not codestrapfile and ENV['CODESTRAPFILE'] and File.exist? ENV['CODESTRAPFILE']
124
+ codestrapfile = ENV['CODESTRAPFILE']
125
+ end
126
+ if codestrapfile
127
+ return File::Stat.new(codestrapfile).mtime
128
+ else
129
+ return Time.new(0)
130
+ end
131
+ end
132
+
133
+ def reload_on_change
134
+ reload = false
135
+ mtime = nil
136
+ codestrapfile = nil
137
+ if ENV['CODESTRAPFILE'] and !@@codestrapfile
138
+ reload = true
139
+ codestrapfile = ENV['CODESTRAPFILE']
140
+ mtime = codestrapfile_mtime(codestrapfile)
141
+ elsif ENV['CODESTRAPFILE'] and !ENV['CODESTRAPFILE'].eql?(@@codestrapfile)
142
+ reload = true
143
+ codestrapfile = ENV['CODESTRAPFILE']
144
+ mtime = codestrapfile_mtime(codestrapfile)
145
+ elsif @@codestrapfile
146
+ mtime = codestrapfile_mtime(@@codestrapfile)
147
+ if mtime > @@codestrapfile_mtime
148
+ reload = true
149
+ end
150
+ end
151
+ if reload
152
+ load codestrapfile
153
+ @@codestrapfile = codestrapfile
154
+ @@codestrapfile_mtime = mtime
155
+ true
156
+ end
157
+ false
158
+ end
159
+
160
+ def load_codestrapfile(codestrapfile=nil)
161
+ codestrapfile_mtime = nil
162
+ unless codestrapfile
163
+ # Load possible codestrapfiles
164
+ [ENV['CODESTRAPFILE'], File.join(ENV['HOME'], 'codestrap', 'Codestrapfile'), File.join(ENV['HOME'], '.codestrap', 'Codestrapfile')].each do |sf|
165
+ next unless sf and File.exist?(sf)
166
+ codestrapfile = sf
167
+ codestrapfile_mtime = codestrapfile_mtime(sf)
168
+ break
169
+ end
170
+ end
171
+
172
+ if codestrapfile
173
+ load codestrapfile
174
+ @@codestrapfile = codestrapfile
175
+ @@codestrapfile_mtime = codestrapfile_mtime
176
+ end
177
+ end
178
+
179
+ def self.local
180
+ @@config ||= Codestrapfile.new
181
+ @@config.local
182
+ end
183
+
184
+ def local
185
+ @@config ||= Codestrapfile.new
186
+ @@config.local
187
+ end
188
+
189
+ def self.server
190
+ @@config ||= Codestrapfile.new
191
+ @@config.server
192
+ end
193
+
194
+ def server
195
+ @@config ||= Codestrapfile.new
196
+ @@config.server
197
+ end
198
+ end
199
+ end
@@ -0,0 +1,56 @@
1
+ module Codestrap
2
+ # Logging with pre set error messages
3
+ #
4
+ # The Log class has been designed to keep track of all possible messages the program will generate
5
+ class Log
6
+ @@msgs = {
7
+ STRAPMISSING: Proc.new { |*args| sprintf %q[Could not find project "%s".], *args },
8
+ STUBMISSING: Proc.new { |*args| sprintf %q[Could not find template "%s".], *args },
9
+ NOPATH: Proc.new { |*args| sprintf %q[No path to "%s".], *args },
10
+ LINKTARGET: Proc.new { |*args| sprintf %q[Invalid link target "%s". The link target must be the "%s" command], *args },
11
+ INVALIDCMD: Proc.new { |*args| sprintf %q[Invalid command "%s".], *args },
12
+ FILEEXISTS: Proc.new { |*args| sprintf %q[File "%s" exists. Can not overwrite.], *args },
13
+ GENERATE_NOTLINK: Proc.new { |*args| sprintf %q[File "%s" is not a symlink.], *args },
14
+ }
15
+
16
+ # Log pre set fatal message
17
+ #
18
+ # @param [Symbol] msg
19
+ # @param [Array] args
20
+ def fatal(msg, *args)
21
+ puts @@msgs[msg].call(*args)
22
+ end
23
+
24
+ # Log pre set error message
25
+ #
26
+ # @param [Symbol] msg
27
+ # @param [Array] args
28
+ def error(msg, *args)
29
+ puts @@msgs[msg].call(*args)
30
+ end
31
+
32
+ # Log pre set error message
33
+ #
34
+ # @param [Symbol] msg
35
+ # @param [Array] args
36
+ def warn(msg, *args)
37
+ puts @@msgs[msg].call(*args)
38
+ end
39
+
40
+ # Log pre set error message
41
+ #
42
+ # @param [Symbol] msg
43
+ # @param [Array] args
44
+ def info(msg, *args)
45
+ puts @@msgs[msg].call(*args)
46
+ end
47
+
48
+ # Log pre set error message
49
+ #
50
+ # @param [Symbol] msg
51
+ # @param [Array] args
52
+ def debug(msg, *args)
53
+ puts @@msgs[msg].call(*args)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,20 @@
1
+ module Codestrap
2
+ module Mixin
3
+ module Exceptions
4
+ module Factory
5
+ class FactoryException < Exception; end
6
+ class FactoryAbstractMethod < Exception; end
7
+ class FactoryNotImplemented < Exception; end
8
+ class FactoryArgumentError < ArgumentError; end
9
+ class FactoryMethodEnforcement < ArgumentError; end
10
+ end
11
+ module Template
12
+ class RendererAbstractOnly < Exception; end
13
+ class RendererRequiredMethod < Exception; end
14
+ class RendererCannotOverwrite < Exception; end
15
+ class RendererTypeError < Exception; end
16
+ class RendererMissingRoot < Exception; end
17
+ end
18
+ end
19
+ end
20
+ end