platte 0.1.2

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
+ SHA256:
3
+ metadata.gz: 778b2b5738f5225b86802852cfb7adac9bb9e8b903d65115cc8abf93ba920089
4
+ data.tar.gz: ebf44b9aca79e561a27861c361db16e96cd6fe082054b2a7ae1cb53fdc861bce
5
+ SHA512:
6
+ metadata.gz: e8b5ada773fa22ec6782be64cc26503ba635e03adc46824e8c41446163165dc1187bc8313d025154bb383cac0a1407ca70d402add9ac07872f0d5d7098cd4f4c
7
+ data.tar.gz: 4c975521329607e77d7a0f5bcedd192802be5b241e79f89e5a2ccbb54d4923033eaf4fad80f04caea18e6e41d7ff740ccd6c196fce56c0eccfc96093e2888c88
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2018 Kiefernwald
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # Platte
2
+
3
+ [![Build Status](https://travis-ci.org/kiefernwald/platte.svg?branch=master)](https://travis-ci.org/kiefernwald/platte)
4
+ [![Coverage Status](https://coveralls.io/repos/github/kiefernwald/platte/badge.svg?branch=specs)](https://coveralls.io/github/kiefernwald/platte?branch=specs)
5
+
6
+ ![Plattenbau](pic.jpg)
7
+
8
+ *(Transport of Plattenbau parts in Karl-Marx-Stadt, GDR, 1975 [CC BY-SA 3.0 de](https://creativecommons.org/licenses/by-sa/3.0/de/deed.en) Deutsche Fotothek)*
9
+
10
+ Platte is a small command line tool that combines static HTML pages from modules. It is named after the german word [Plattenbau](https://en.wikipedia.org/wiki/Plattenbau) which is a way of building houses based on pre-fabricated parts.
11
+
12
+ ![Plattenbau](output.png)
13
+
14
+ ## Installation
15
+
16
+ Platte requires a ruby environment with version 2.3 or higher. To install, run:
17
+
18
+ `gem install platte`
19
+
20
+ ## Usage
21
+
22
+ After the gem installation, `platte` is available in command line. It lets you combine a static HTML file from a given set of modules. Modules are folders with some configuation files and code in it and sit in the `modules` subfolder of the tool. They come in two flavours:
23
+
24
+ 1. Main modules names, ending with `.main` – usually they hold the surrounding HTML structure with placeholders for resources
25
+ 2. Other modules names end with `.module` – they are building blocks you can freely combine together as the body of a main module
26
+
27
+ You can use the `platte` command as follows:
28
+
29
+ ### list
30
+
31
+ `platte list`
32
+
33
+ This call shows you which modules are available in your system.
34
+
35
+ ### combine
36
+
37
+ `platte combine <TARGET FILE> <MAIN MODULE> <MODULE 1> ... <MODULE N>`
38
+
39
+ This lets you combine a single main-module with any number of other modules to a given target file.
40
+
41
+ Example call:
42
+
43
+ `platte combine some/output/file.html html5 header content`
44
+
45
+ ## Module structure
46
+
47
+ TODO More docs
48
+
49
+ ## Contributing
50
+
51
+ Bug reports and pull requests are welcome on GitHub at https://github.com/kiefernwald/platte.
data/bin/platte ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- mode: ruby -*-
3
+ # frozen_string_literal: true
4
+
5
+ require './lib/platte'
6
+
7
+ Platte.start
data/lib/combinator.rb ADDED
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mustache'
4
+ require 'htmlbeautifier'
5
+ require './lib/platte_module'
6
+
7
+ # Combinator class
8
+ class Combinator
9
+ INDENTATION = ' '
10
+
11
+ # Combines the given platte modules
12
+ def combine main, modules, beautify: true
13
+ html = Mustache.render(
14
+ main.template,
15
+ module_contents: generate_body(modules),
16
+ stylesheets: generate_stylesheets(modules),
17
+ )
18
+
19
+ postprocess(html, beautify: beautify)
20
+ end
21
+
22
+ private
23
+
24
+ def generate_body platte_modules
25
+ body = ''
26
+ platte_modules.each { |mod| body += mod.template.to_s }
27
+
28
+ body
29
+ end
30
+
31
+ def generate_stylesheets platte_modules
32
+ styles = []
33
+ platte_modules.each { |mod| styles.concat(mod.stylesheets) }
34
+
35
+ styles.uniq
36
+ end
37
+
38
+ def postprocess html, beautify: true
39
+ return HtmlBeautifier.beautify(html, indent: INDENTATION) if beautify
40
+
41
+ html
42
+ end
43
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Exception thrown during creation of a Platte module
4
+ class PlatteModuleCreationException < StandardError
5
+ def initialize reason
6
+ @reason = reason
7
+ end
8
+
9
+ attr_reader :reason
10
+ end
data/lib/platte.rb ADDED
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'thor'
4
+ require 'fileutils'
5
+ require 'colorize'
6
+ require './lib/combinator'
7
+ require './lib/platte_module_loader'
8
+
9
+ # Platte command line tool
10
+ class Platte < Thor
11
+ desc 'combine FILE MAIN [MODULE [MODULE ...]]', 'combine FILE from MAIN and MODULES.'
12
+ option :no_beautify, type: :boolean, default: false
13
+ def combine file, main, *modules
14
+ main_module, platte_modules = get_modules main, modules
15
+ combine_and_save(file, main_module, platte_modules)
16
+ copy_assets File.dirname(file), main_module, platte_modules
17
+ output_final_info
18
+ rescue PlatteModuleCreationException => e
19
+ output_error e, "Could not load modules to construct #{file}!"
20
+ rescue StandardError => e
21
+ output_error e, "Could not construct #{file}!"
22
+ end
23
+
24
+ desc 'list', 'list all available modules.'
25
+ def list
26
+ puts '🏢 The following main modules are available:'.green
27
+ get_modules_from_folder('modules', extension: 'main').each(&method(:output_single_module))
28
+ puts "\n📦 The following modules are available:".green
29
+ get_modules_from_folder('modules').each(&method(:output_single_module))
30
+ end
31
+
32
+ private
33
+
34
+ def combine_and_save file, main_module, platte_modules
35
+ output_module_info(file, main_module, platte_modules)
36
+ write_to_file file, Combinator.new.combine(main_module, platte_modules, beautify: !options[:no_beautify])
37
+ end
38
+
39
+ def output_final_info
40
+ puts 'Done.'.green
41
+ puts '🏢'
42
+ end
43
+
44
+ def output_error error, message
45
+ puts message.black.on_red
46
+ puts " #{error.reason}".red
47
+ end
48
+
49
+ def output_module_info file, main_module, platte_modules
50
+ puts "#{'🏗 Constructing'.green} #{file.yellow} #{'from the following modules:'.green}"
51
+ output_single_module(main_module, is_main: true)
52
+ platte_modules.each(&method(:output_single_module))
53
+ end
54
+
55
+ def output_single_module module_object, is_main: false
56
+ module_name = is_main ? "#{module_object.name} (main module)" : module_object.name
57
+ puts " * #{module_name} – #{module_object.description}".blue
58
+ end
59
+
60
+ def get_modules_from_folder folder, extension: 'module'
61
+ loader = PlatteModuleLoader.new
62
+ Dir.glob("*.#{extension}", base: folder)
63
+ .map { |mod| loader.create_from_folder "modules/#{mod}" }
64
+ end
65
+
66
+ def get_modules main, modules
67
+ puts 'Loading selected modules...'.green
68
+ loader = PlatteModuleLoader.new
69
+ main_module = loader.create_from_folder "modules/#{main}.main"
70
+ platte_modules = modules.map { |mod| loader.create_from_folder "modules/#{mod}.module" }
71
+
72
+ [main_module, platte_modules]
73
+ end
74
+
75
+ def write_to_file file, contents
76
+ file = File.new(file, 'w')
77
+ file.write(contents)
78
+ file.close
79
+ end
80
+
81
+ def copy_assets destination, main, modules
82
+ puts 'Copying assets...'.green
83
+ FileUtils.copy_entry "#{main.directory}/assets", "#{destination}/assets"
84
+ modules&.each { |mod| FileUtils.copy_entry "#{mod.directory}/assets", "#{destination}/assets" }
85
+ end
86
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Platte
4
+ VERSION = '0.1.2'
5
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require_relative 'exception/platte_module_creation_exception'
5
+
6
+ # A single module
7
+ class PlatteModule
8
+ # rubocop:disable Metrics/ParameterLists
9
+ def initialize folder, name, description, template, stylesheets = [], javascripts = []
10
+ @folder = folder
11
+ @name = name
12
+ @template = template
13
+ @description = description
14
+ @stylesheets = stylesheets if stylesheets
15
+ @javascripts = javascripts if javascripts
16
+ end
17
+ # rubocop:enable Metrics/ParameterLists
18
+
19
+ def directory
20
+ File.expand_path "./#{@folder}"
21
+ end
22
+
23
+ attr_reader :name
24
+ attr_reader :description
25
+ attr_reader :stylesheets
26
+ attr_reader :javascripts
27
+ attr_reader :template
28
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Loader for Platte modules
4
+ class PlatteModuleLoader
5
+ def create_from_folder folder
6
+ raise PlatteModuleCreationException, "Module at #{folder} could not be found!" unless File.exist? folder
7
+
8
+ # Extract info
9
+ name, description, stylesheets, javascripts = get_module_info(folder)
10
+
11
+ # Read template
12
+ template = File.read("#{folder}/template.mustache")
13
+
14
+ PlatteModule.new folder, name, description, template, stylesheets, javascripts
15
+ end
16
+
17
+ private
18
+
19
+ def get_module_info folder
20
+ info = JSON.parse(File.read("#{folder}/info.json"))
21
+ name = info['name']
22
+ description = info['description']
23
+ stylesheets = info['stylesheets'] || nil
24
+ javascripts = info['javascripts'] || nil
25
+
26
+ [name, description, stylesheets, javascripts]
27
+ end
28
+ end
data/platte.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
5
+ require 'platte/version'
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = 'platte'
9
+ s.version = Platte::VERSION
10
+ s.authors = ['Thomas Bretzke']
11
+ s.homepage = 'https://github.com/kiefernwald/platte'
12
+ s.summary = 'A static generator tool for static HTML pages combined from modules.'
13
+ s.license = 'MIT'
14
+
15
+ s.executables = %w[platte]
16
+ s.require_paths = %w[lib]
17
+ s.files = %w[LICENSE README.md platte.gemspec] + Dir['lib/**/*.rb', 'bin/*']
18
+
19
+ s.required_ruby_version = '~> 2.3'
20
+
21
+ s.add_dependency 'colorize'
22
+ s.add_dependency 'htmlbeautifier'
23
+ s.add_dependency 'mustache', '~> 1.0'
24
+ s.add_dependency 'thor'
25
+
26
+ s.add_development_dependency 'bundler', '~> 1.16'
27
+ s.add_development_dependency 'rake', '~> 10.0'
28
+ s.add_development_dependency 'rspec', '~> 3.0'
29
+ s.add_development_dependency 'rubocop', '~> 0.49.0'
30
+ end
metadata ADDED
@@ -0,0 +1,166 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: platte
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Thomas Bretzke
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-11-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: colorize
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: htmlbeautifier
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: mustache
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: thor
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.16'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.16'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '10.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '10.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.49.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.49.0
125
+ description:
126
+ email:
127
+ executables:
128
+ - platte
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - LICENSE
133
+ - README.md
134
+ - bin/platte
135
+ - lib/combinator.rb
136
+ - lib/exception/platte_module_creation_exception.rb
137
+ - lib/platte.rb
138
+ - lib/platte/version.rb
139
+ - lib/platte_module.rb
140
+ - lib/platte_module_loader.rb
141
+ - platte.gemspec
142
+ homepage: https://github.com/kiefernwald/platte
143
+ licenses:
144
+ - MIT
145
+ metadata: {}
146
+ post_install_message:
147
+ rdoc_options: []
148
+ require_paths:
149
+ - lib
150
+ required_ruby_version: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - "~>"
153
+ - !ruby/object:Gem::Version
154
+ version: '2.3'
155
+ required_rubygems_version: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ requirements: []
161
+ rubyforge_project:
162
+ rubygems_version: 2.7.7
163
+ signing_key:
164
+ specification_version: 4
165
+ summary: A static generator tool for static HTML pages combined from modules.
166
+ test_files: []