easy_html_generator 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.
Files changed (69) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING.md +44 -0
  3. data/LICENSE +22 -0
  4. data/README.md +332 -0
  5. data/bin/ehg +52 -0
  6. data/lib/easy_html_generator.rb +100 -0
  7. data/lib/easy_html_generator/checksum.rb +39 -0
  8. data/lib/easy_html_generator/config.rb +147 -0
  9. data/lib/easy_html_generator/generator.rb +25 -0
  10. data/lib/easy_html_generator/generator/base.rb +83 -0
  11. data/lib/easy_html_generator/generator/combine.rb +28 -0
  12. data/lib/easy_html_generator/generator/compile/coffee.rb +30 -0
  13. data/lib/easy_html_generator/generator/compile/haml.rb +70 -0
  14. data/lib/easy_html_generator/generator/compile/haml/context.rb +52 -0
  15. data/lib/easy_html_generator/generator/compile/haml/helper/activesupport_override.rb +48 -0
  16. data/lib/easy_html_generator/generator/compile/haml/helper/asset_helper.rb +78 -0
  17. data/lib/easy_html_generator/generator/compile/haml/layout.rb +35 -0
  18. data/lib/easy_html_generator/generator/compile/sass.rb +47 -0
  19. data/lib/easy_html_generator/generator/copy.rb +44 -0
  20. data/lib/easy_html_generator/generator/delete.rb +20 -0
  21. data/lib/easy_html_generator/generator/minimize/css.rb +28 -0
  22. data/lib/easy_html_generator/generator/minimize/html.rb +32 -0
  23. data/lib/easy_html_generator/generator/minimize/images.rb +33 -0
  24. data/lib/easy_html_generator/generator/minimize/js.rb +28 -0
  25. data/lib/easy_html_generator/generator/service/analytics.rb +34 -0
  26. data/lib/easy_html_generator/generator/service/bower.rb +34 -0
  27. data/lib/easy_html_generator/generator/service/grunt.rb +24 -0
  28. data/lib/easy_html_generator/generator/structure.rb +20 -0
  29. data/lib/easy_html_generator/generators.rb +53 -0
  30. data/lib/easy_html_generator/project.rb +77 -0
  31. data/lib/easy_html_generator/rackapp.rb +67 -0
  32. data/lib/easy_html_generator/workspace.rb +59 -0
  33. data/src/demo/assets/images/demo.png +0 -0
  34. data/src/demo/assets/public/robots.txt +0 -0
  35. data/src/demo/assets/scripts/demo.js.coffee +1 -0
  36. data/src/demo/assets/scripts/plain.js +0 -0
  37. data/src/demo/assets/styles/app.css.sass +2 -0
  38. data/src/demo/assets/styles/plain.css +0 -0
  39. data/src/demo/lib/generators/project_generator.rb +12 -0
  40. data/src/demo/lib/helper/projecthelper.rb +5 -0
  41. data/src/demo/views/index.html.haml +1 -0
  42. data/src/demo/views/index/_lore_ipsum.haml +1 -0
  43. data/src/demo/views/layout.haml +8 -0
  44. data/src/demo/views/plain.html +0 -0
  45. data/src/shared/assets/images/shared.png +0 -0
  46. data/src/shared/assets/scripts/shared.js.coffee +1 -0
  47. data/src/shared/assets/scripts/shared.plain.js +0 -0
  48. data/src/shared/assets/styles/mixins/_arrows.sass +32 -0
  49. data/src/shared/assets/styles/mixins/_bootstrap-fixes.sass +12 -0
  50. data/src/shared/assets/styles/mixins/_buttons.sass +32 -0
  51. data/src/shared/assets/styles/mixins/_css3.sass +266 -0
  52. data/src/shared/assets/styles/mixins/_headjs-bootstrap-mediaqueries.sass +42 -0
  53. data/src/shared/assets/styles/mixins/_helper.sass +70 -0
  54. data/src/shared/assets/styles/mixins/_normalize.sass +340 -0
  55. data/src/shared/assets/styles/mixins/_reset.sass +46 -0
  56. data/src/shared/lib/generators/shared_generator.rb +12 -0
  57. data/src/shared/lib/helper/shared_helper.rb +16 -0
  58. data/src/shared/project.yml +127 -0
  59. data/src/shared/views/404.yml +5 -0
  60. data/src/template/assets/public/robots.txt +0 -0
  61. data/src/template/assets/scripts/index.js.coffee +1 -0
  62. data/src/template/assets/styles/index.css.sass +2 -0
  63. data/src/template/lib/generators/project_generator.rb +12 -0
  64. data/src/template/lib/helper/project_helper.rb +5 -0
  65. data/src/template/project.yml +128 -0
  66. data/src/template/views/index.html.haml +4 -0
  67. data/src/template/views/index/_lore_ipsum.haml +2 -0
  68. data/src/template/views/layout.haml +9 -0
  69. metadata +402 -0
@@ -0,0 +1,100 @@
1
+ # encoding: utf-8
2
+
3
+ # add lib folder to paths
4
+ $LOAD_PATH.unshift File.dirname(__FILE__)
5
+
6
+ # just require bootsrap and it will be in the sass path
7
+ require 'bootstrap-sass'
8
+ require 'bundler'
9
+ require 'colorize'
10
+ require 'rack'
11
+
12
+ # main module loads projects and dispatches rack requests
13
+ module EasyHtmlGenerator
14
+ EHC_WORKSPACE_PATH =
15
+ File.expand_path File.join(File.dirname(__FILE__), '..')
16
+
17
+ EHC_SRC_PATH = File.join(EHC_WORKSPACE_PATH, 'src')
18
+ EHC_SHARED_PATH = File.join(EHC_SRC_PATH, 'shared')
19
+ EHC_SHARED_HELPER_PATH = File.join(EHC_SHARED_PATH, 'lib', 'helper')
20
+ EHC_SHARED_GENERATORS_PATH = File.join(EHC_SHARED_PATH, 'lib', 'generators')
21
+ EHC_SHARED_STYLES_PATH = File.join(EHC_SHARED_PATH, 'assets', 'styles')
22
+
23
+ WORKSPACE_PATH = Bundler.root
24
+ SRC_PATH = File.join(WORKSPACE_PATH, 'src')
25
+ DIST_PATH = File.join(WORKSPACE_PATH, 'dist')
26
+ SHARED_PATH = File.join(SRC_PATH, 'shared')
27
+ SHARED_HELPER_PATH = File.join(SHARED_PATH, 'lib', 'helper')
28
+ SHARED_GENERATORS_PATH = File.join(SHARED_PATH, 'lib', 'generators')
29
+ SHARED_STYLES_PATH = File.join(SHARED_PATH, 'assets', 'styles')
30
+
31
+ CREATE_ON_INIT = [
32
+ SRC_PATH,
33
+ DIST_PATH
34
+ ]
35
+
36
+ COPY_ON_INIT = {
37
+ EHC_SHARED_PATH => SHARED_PATH,
38
+ "#{EHC_SRC_PATH}/template" => "#{SRC_PATH}/demo"
39
+ }
40
+
41
+ Dir[File.dirname(__FILE__) + '/easy_html_generator/*.rb']
42
+ .each { |file| require file }
43
+
44
+ def self.projects
45
+ Workspace.projects
46
+ end
47
+
48
+ def self.dispatch(request)
49
+ path = request.env['REQUEST_PATH'] || request.env['PATH_INFO']
50
+ cleaned_path = clean_path path
51
+ project_name = project_name_by_path path
52
+
53
+ project = Workspace.project_by_name project_name
54
+
55
+ return path unless project
56
+
57
+ project.generate if project.should_generate_for? cleaned_path
58
+
59
+ # return absolute dist path
60
+ File.join(project.dist_path, cleaned_path)
61
+ end
62
+
63
+ def self.project_name_by_path(path)
64
+ path = path.slice(1..-1) if path.start_with? '/'
65
+ path = path.split('/').first if path.include? '/'
66
+ path
67
+ end
68
+
69
+ def self.clean_path(path)
70
+ path = path.slice(1..-1) if path.start_with? '/'
71
+ path.sub!("#{project_name_by_path(path)}/", '')
72
+ path
73
+ end
74
+
75
+ def self.generate_all
76
+ Workspace.projects.each(&:generate)
77
+ end
78
+
79
+ def self.generate_project(project)
80
+ Workspace.projects[project].generate
81
+ end
82
+
83
+ def self.start_server(host, port)
84
+ app = Rack::Builder.new do
85
+ use Rack::Reloader, 0
86
+ use Rack::ContentLength
87
+ use Rack::AbstractFormat
88
+ use Rack::Deflater
89
+ use Rack::ETag
90
+
91
+ run EasyHtmlGenerator::Rackapp
92
+ end
93
+
94
+ config = { app: app,
95
+ Host: host,
96
+ Port: port}
97
+
98
+ Rack::Server.start config
99
+ end
100
+ end
@@ -0,0 +1,39 @@
1
+ # encoding: utf-8
2
+ require 'digest/md5'
3
+
4
+ # this class handles file checksums
5
+ class EasyHtmlGenerator::Checksum
6
+ @file_checksums = {}
7
+
8
+ def self.checksum(input)
9
+ Digest::MD5.hexdigest(input)
10
+ end
11
+
12
+ def self.file_checksum(file)
13
+ checksum(File.read(file))
14
+ end
15
+
16
+ def self.file_changed?(file, context = '')
17
+ key = build_key(file, context)
18
+
19
+ return true unless @file_checksums.key? key
20
+
21
+ @file_checksums[key] != file_checksum(file)
22
+ end
23
+
24
+ def self.store_file(file, context = '')
25
+ key = build_key(file, context)
26
+
27
+ @file_checksums[key] = file_checksum(file)
28
+ end
29
+
30
+ def self.invalidate_file(file, context = '')
31
+ key = build_key(file, context)
32
+
33
+ @file_checksums.delete(key)
34
+ end
35
+
36
+ def self.build_key(file, context = '')
37
+ "#{context}.#{file}"
38
+ end
39
+ end
@@ -0,0 +1,147 @@
1
+ # encoding: utf-8
2
+ require 'yaml'
3
+
4
+ # this class loads a yml file, symbolizes the keys and make the hash
5
+ # accessable via object attributes
6
+ class EasyHtmlGenerator::Config
7
+ def self.from_file(path)
8
+ return unless File.exist? path
9
+
10
+ ConfigHash.new YAML.load(File.open(path))
11
+ end
12
+
13
+ # symbolizes the keys and makes the hash accessable via object attributes
14
+ class ConfigHash < Hash
15
+ def initialize(hash = nil)
16
+ super
17
+
18
+ return unless hash
19
+
20
+ hash = self.class.symbolize_keys hash
21
+ hash.each { |k, v| self[k] = v }
22
+ end
23
+
24
+ def method_missing(name, *args)
25
+ # setter
26
+ if /^(\w+)=$/ =~ name
27
+ self[Regexp.last_match(1).to_sym] = args[0]
28
+ # getter
29
+ else
30
+ return super.method_missing name unless key? name
31
+ end
32
+
33
+ self[name]
34
+ end
35
+
36
+ def self.symbolize_keys(obj)
37
+ case obj
38
+ when Array
39
+ obj.inject([]) do |res, val|
40
+ res << case val
41
+ when Hash, Array
42
+ symbolize_keys(val)
43
+ else
44
+ val
45
+ end
46
+ res
47
+ end
48
+ when Hash
49
+ obj.inject(ConfigHash.new) do |res, (key, val)|
50
+ nkey = case key
51
+ when String
52
+ key.to_sym
53
+ else
54
+ key
55
+ end
56
+ nval = case val
57
+ when Hash, Array
58
+ symbolize_keys(val)
59
+ else
60
+ val
61
+ end
62
+ res[nkey] = nval
63
+ res
64
+ end
65
+ else
66
+ obj
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ # class EasyHtmlGenerator::Config
73
+ # def self.from_file(path)
74
+ # return unless File.exist? path
75
+ #
76
+ # ConfigHash.new YAML.load(File.open(path))
77
+ # end
78
+ #
79
+ # # symbolizes the keys and makes the hash accessable via object attributes
80
+ # class ConfigHash < Hash
81
+ # def initialize(hash = nil)
82
+ # super
83
+ # return unless hash
84
+ #
85
+ # hash = self.class.symbolize_keys hash
86
+ # hash.each { |k, v| self[k] = v }
87
+ # end
88
+ #
89
+ # def method_missing(name, *args)
90
+ # # setter
91
+ # if /^(\w+)=$/ =~ name
92
+ # self[Regexp.last_match(1).to_sym] = args[0]
93
+ # # getter
94
+ # else
95
+ # return super.method_missing name unless key? name
96
+ # end
97
+ #
98
+ # self[name]
99
+ # end
100
+ #
101
+ # def self.symbolize_keys(obj)
102
+ # case obj
103
+ # when Array
104
+ # inject_array(obj)
105
+ # when Hash
106
+ # inject_hash(obj)
107
+ # else
108
+ # obj
109
+ # end
110
+ # end
111
+ #
112
+ # def self.inject_array(obj)
113
+ # obj.each_with_object([]) do |res, val|
114
+ # res << case val
115
+ # when Hash, Array
116
+ # symbolize_keys(val)
117
+ # else
118
+ # val
119
+ # end
120
+ # res
121
+ # end
122
+ # end
123
+ #
124
+ # def self.inject_hash(obj)
125
+ # obj.each_with_object(ConfigHash.new) do |res, (key, val)|
126
+ # nkey = inject_hash_key key
127
+ # nval = inject_hash_value val
128
+ # res[nkey] = nval
129
+ # res
130
+ # end
131
+ # end
132
+ #
133
+ # def self.inject_hash_key(key)
134
+ # case key
135
+ # when String then return key.to_sym
136
+ # else return key
137
+ # end
138
+ # end
139
+ #
140
+ # def self.inject_hash_value(val)
141
+ # case val
142
+ # when Hash, Array then symbolize_keys(val)
143
+ # else val
144
+ # end
145
+ # end
146
+ # end
147
+ # end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+
3
+ # this is a module namespace wrapper
4
+ module EasyHtmlGenerator::Generator
5
+ Dir[File.dirname(__FILE__) + '/generator/*.rb']
6
+ .each { |file| require file }
7
+
8
+ # this is a wrapper module for generator services
9
+ module Service
10
+ Dir[File.dirname(__FILE__) + '/generator/service/*.rb']
11
+ .each { |file| require file }
12
+ end
13
+
14
+ # this is a wrapper module for compiling generators
15
+ module Compile
16
+ Dir[File.dirname(__FILE__) + '/generator/compile/*.rb']
17
+ .each { |file| require file }
18
+ end
19
+
20
+ # this is a wrapper module for minimizing generators
21
+ module Minimize
22
+ Dir[File.dirname(__FILE__) + '/generator/minimize/*.rb']
23
+ .each { |file| require file }
24
+ end
25
+ end
@@ -0,0 +1,83 @@
1
+ # encoding: utf-8
2
+ require 'colorize'
3
+ require 'fileutils'
4
+ require 'easy_html_generator/generators'
5
+
6
+ # this is the generator base class
7
+ class EasyHtmlGenerator::Generator::Base
8
+ attr_reader :config
9
+
10
+ def initialize(project, config)
11
+ @project = project
12
+ @config = config
13
+ end
14
+
15
+ def src_path
16
+ "#{@project.src_path}/#{@config.src}"
17
+ end
18
+
19
+ def dest_path
20
+ "#{@project.dist_path}/#{@config.dest}"
21
+ end
22
+
23
+ def log_running
24
+ log "#{self.class.name.yellow}"
25
+ end
26
+
27
+ def generate
28
+ return unless @config.enabled
29
+
30
+ log_running
31
+
32
+ selector = File.join(src_path, @config.selector)
33
+
34
+ FileUtils.mkdir_p dest_path
35
+
36
+ walk_files(selector) do |i, o|
37
+ next unless should_do_file? i
38
+
39
+ do_file(i, o)
40
+ end
41
+ end
42
+
43
+ def walk_files(selector)
44
+ Dir[selector].each do |input_file|
45
+ output_file = input_to_output_file(input_file)
46
+
47
+ yield(input_file, output_file)
48
+ end
49
+ end
50
+
51
+ def should_do_file?(i)
52
+ EasyHtmlGenerator::Checksum.file_changed? i
53
+ end
54
+
55
+ def input_to_output_file(input_file)
56
+ input_file.sub(src_path, dest_path)
57
+ end
58
+
59
+ def do_input(input, *_args)
60
+ input
61
+ end
62
+
63
+ def do_file(src, target, *args)
64
+ return unless File.exist?(src) && File.file?(src)
65
+
66
+ log "-> do_file #{src.sub(@project.src_path, '').green}"
67
+
68
+ FileUtils.mkdir_p File.dirname(target)
69
+
70
+ args.push target
71
+ i = File.read(src)
72
+ o = do_input(i, *args)
73
+
74
+ File.write(target, o)
75
+
76
+ EasyHtmlGenerator::Checksum.store_file(src)
77
+ end
78
+
79
+ def log(msg)
80
+ STDERR.puts " | #{msg.sub(@project.src_path, '')
81
+ .sub('EasyHtmlGenerator::', '')}"
82
+ end
83
+ end
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ require 'fileutils'
3
+ require 'easy_html_generator/generator/base'
4
+
5
+ # this generator combines files in the dist folder
6
+ class EasyHtmlGenerator::Generator::Combine <
7
+ EasyHtmlGenerator::Generator::Base
8
+
9
+ def generate
10
+ return unless @config.enabled
11
+
12
+ log_running
13
+
14
+ @config.packages.each do |config|
15
+ do_config config
16
+ end
17
+ end
18
+
19
+ def do_config(config)
20
+ o = ''
21
+ config.files.each do |file_pattern|
22
+ Dir[File.join(@project.dist_path, file_pattern)].each do |file|
23
+ o += File.read(file) + "\n"
24
+ end
25
+ end
26
+ File.write(File.join(@project.dist_path, config.file), o)
27
+ end
28
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+ require 'coffee_script'
3
+ require 'easy_html_generator/generator/base'
4
+
5
+ # this generator coffee sass files from src folder and copies them
6
+ # to the dist folder
7
+ class EasyHtmlGenerator::Generator::Compile::Coffee <
8
+ EasyHtmlGenerator::Generator::Base
9
+
10
+ def initialize(project, config)
11
+ super(project, config)
12
+
13
+ @config.src = project.config.paths.src.scripts
14
+ @config.dest = project.config.paths.dist.scripts
15
+ end
16
+
17
+ def do_input(input, src = 'inline')
18
+ result = CoffeeScript.compile input
19
+
20
+ return result unless @config.minimize
21
+
22
+ EasyHtmlGenerator::Generator::Minimize::Js.compress result
23
+ rescue StandardError => e
24
+ raise e, "#{e.message} in #{src} ", e.backtrace
25
+ end
26
+
27
+ def input_to_output_file(i)
28
+ super(i).gsub('.js.coffee', '.js')
29
+ end
30
+ end