platte 0.1.2

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.
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: []