lb-project 0.0.1
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 +7 -0
- data/.gitignore +41 -0
- data/.rspec +6 -0
- data/.rubocop.yml +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +7 -0
- data/Guardfile +43 -0
- data/LICENSE +20 -0
- data/README.md +28 -0
- data/Rakefile +6 -0
- data/bin/lb-project +29 -0
- data/config/devtools.yml +2 -0
- data/config/flay.yml +3 -0
- data/config/flog.yml +2 -0
- data/config/mutant.yml +3 -0
- data/config/reek.yml +103 -0
- data/config/rubocop.yml +10 -0
- data/config/yardstick.yml +2 -0
- data/lb-project.gemspec +42 -0
- data/lib/lb/project/app.rb +9 -0
- data/lib/lb/project/config.rb +35 -0
- data/lib/lb/project/page.rb +19 -0
- data/lib/lb/project/registry/registration.rb +73 -0
- data/lib/lb/project/registry.rb +58 -0
- data/lib/lb/project/render.rb +28 -0
- data/lib/lb/project/route.rb +15 -0
- data/lib/lb/project/site.rb +41 -0
- data/lib/lb/project/types.rb +10 -0
- data/lib/lb/project/version.rb +8 -0
- data/lib/lb/project/view.rb +19 -0
- data/lib/lb/project.rb +159 -0
- data/lib/lb-project.rb +5 -0
- data/rakelib/ci.rake +24 -0
- data/spec/fixtures/config/application.yml +10 -0
- data/spec/fixtures/config/lb-project.yml +3 -0
- data/spec/fixtures/config.ru +9 -0
- data/spec/fixtures/docs/assets/javascripts/main.bundle.js +0 -0
- data/spec/fixtures/docs/assets/stylesheets/main.bundle.css +0 -0
- data/spec/fixtures/lib/example/app.rb +14 -0
- data/spec/fixtures/lib/example/page/index.rb +13 -0
- data/spec/fixtures/lib/example/page.rb +8 -0
- data/spec/fixtures/lib/example.rb +15 -0
- data/spec/fixtures/locales/en.yml +7 -0
- data/spec/fixtures/templates/index.html.slim +7 -0
- data/spec/fixtures/templates/layouts/main.html.slim +13 -0
- data/spec/fixtures/webpack-assets.json +1 -0
- data/spec/spec_helper.rb +31 -0
- data/spec/support/helper.rb +5 -0
- data/spec/unit/lb/project/class_methods/config_spec.rb +57 -0
- data/spec/unit/lb/project/class_methods/development_quest_spec.rb +39 -0
- data/spec/unit/lb/project/class_methods/logger_spec.rb +25 -0
- data/spec/unit/lb/project/class_methods/rack_env_spec.rb +39 -0
- data/spec/unit/lb/project/class_methods/root_for_spec.rb +28 -0
- data/spec/unit/lb/project/class_methods/root_spec.rb +31 -0
- data/spec/unit/lb/project/class_methods/setup_spec.rb +23 -0
- metadata +373 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 43956f0e7b1f6e48a65014512abd750ad68c18318bbf3c00aa6d1d49a46a96bc
|
4
|
+
data.tar.gz: 40a8e5823b486781458458dd931f4669ccc722bb48a2503f9c846a700c251c50
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ec0c25e1e978a2c8b261de4ad35febecbb21165032863a597020047b0a15932e79258b83f455671f5c829923b3fafdf0d0345074c316c5b85a6298a17f192e00
|
7
|
+
data.tar.gz: 5bf9094b84a40341f9465fd9a777528c0a1b90f10d5215d532e1b2be2dcfde17cf7e05da585a6d2776579dc2c089497058f7e6ca7d9fb93d365117b2772da575
|
data/.gitignore
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
## MAC OS
|
2
|
+
.DS_Store
|
3
|
+
|
4
|
+
## TEXTMATE
|
5
|
+
*.tmproj
|
6
|
+
tmtags
|
7
|
+
|
8
|
+
## EMACS
|
9
|
+
*~
|
10
|
+
\#*
|
11
|
+
.\#*
|
12
|
+
|
13
|
+
## VIM
|
14
|
+
*.sw[op]
|
15
|
+
|
16
|
+
## Rubinius
|
17
|
+
*.rbc
|
18
|
+
.rbx
|
19
|
+
|
20
|
+
## PROJECT::GENERAL
|
21
|
+
*.gem
|
22
|
+
coverage
|
23
|
+
profiling
|
24
|
+
turbulence
|
25
|
+
rdoc
|
26
|
+
pkg
|
27
|
+
tmp
|
28
|
+
doc
|
29
|
+
log
|
30
|
+
.yardoc
|
31
|
+
measurements
|
32
|
+
|
33
|
+
## BUNDLER
|
34
|
+
.bundle
|
35
|
+
Gemfile.lock
|
36
|
+
|
37
|
+
## ctags
|
38
|
+
tags
|
39
|
+
gems.tags
|
40
|
+
|
41
|
+
## PROJECT::SPECIFIC
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
./config/rubocop.yml
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.5.0
|
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
guard :bundler do
|
5
|
+
watch('Gemfile')
|
6
|
+
watch('Gemfile.lock')
|
7
|
+
watch(/\A(.+)\.gemspec\z/)
|
8
|
+
end
|
9
|
+
|
10
|
+
guard :rspec, cmd: 'bundle exec rspec ' +
|
11
|
+
File.read('.rspec').split.join(' '),
|
12
|
+
failed_mode: :keep do
|
13
|
+
# Run all specs if configuration is modified
|
14
|
+
watch('.rspec') { 'spec' }
|
15
|
+
watch('Guardfile') { 'spec' }
|
16
|
+
watch('Gemfile.lock') { 'spec' }
|
17
|
+
watch('spec/spec_helper.rb') { 'spec' }
|
18
|
+
|
19
|
+
# Run all specs if supporting files files are modified
|
20
|
+
watch(%r{\Aspec/(?:fixtures|lib|support|shared)/.+\.rb\z}) { 'spec' }
|
21
|
+
|
22
|
+
# Run unit specs if associated lib code is modified
|
23
|
+
watch(%r{\Alib/(.+)\.rb\z}) do |m|
|
24
|
+
Dir["spec/unit/#{m[1]}*"]
|
25
|
+
end
|
26
|
+
|
27
|
+
watch(%r{\Alib/(.+)/support/(.+)\.rb\z}) do |m|
|
28
|
+
Dir["spec/unit/#{m[1]}/#{m[2]}*"]
|
29
|
+
end
|
30
|
+
|
31
|
+
watch("lib/#{File.basename(File.expand_path('../', __FILE__))}.rb") do
|
32
|
+
'spec'
|
33
|
+
end
|
34
|
+
|
35
|
+
# Run a spec if it is modified
|
36
|
+
watch(%r{\Aspec/(?:unit|integration|features)/.+_spec\.rb\z})
|
37
|
+
end
|
38
|
+
|
39
|
+
guard :rubocop, cli: %w[--config config/rubocop.yml] do
|
40
|
+
watch(/.+\.(?:rb|rake|gemspec)\z/)
|
41
|
+
watch(%r{\Aconfig/rubocop\.yml\z}) { |m| File.dirname(m[0]) }
|
42
|
+
watch(%r{(?:.+/)?\.rubocop\.yml\z}) { |m| File.dirname(m[0]) }
|
43
|
+
end
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2017-2018 Firas Zaidan
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
[gem]: https://rubygems.org/gems/lb-project
|
2
|
+
[gemnasium]: https://gemnasium.com/lb-rb/lb-project
|
3
|
+
[roda]: http://roda.jeremyevans.net/
|
4
|
+
[dry-view]: http://dry-rb.org/gems/dry-view/
|
5
|
+
|
6
|
+
# lb-project
|
7
|
+
|
8
|
+
[][gem]
|
9
|
+
[][gemnasium]
|
10
|
+
|
11
|
+
This static site builder allows an easy migration to a dynamic site. In many
|
12
|
+
projects it is unclear if or when a static site has to be migrated to a dynamic
|
13
|
+
one. Maintaining a static site is less work, so we want to keep it static until
|
14
|
+
the point is reached, where we have to migrate the project to a full dynamic
|
15
|
+
stack.
|
16
|
+
|
17
|
+
The target of lb-project is to minimize this migration effort. We use
|
18
|
+
[Roda][roda] and [dry-view][dry-view] because this are currently excellent
|
19
|
+
solutions that are suited for big projects. This means you can start
|
20
|
+
lightweight, without worrying that it becomes to small.
|
21
|
+
|
22
|
+
## Credits
|
23
|
+
|
24
|
+
* [Firas Zaidan](https://github.com/zaidan)
|
25
|
+
|
26
|
+
## License
|
27
|
+
|
28
|
+
See `LICENSE` file.
|
data/Rakefile
ADDED
data/bin/lb-project
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
root = Dir.pwd
|
5
|
+
$LOAD_PATH << File.join(root, 'lib')
|
6
|
+
|
7
|
+
require 'yaml'
|
8
|
+
LB_PROJECT_YML = 'config/lb-project.yml'
|
9
|
+
config_file = File.join(root, LB_PROJECT_YML)
|
10
|
+
unless File.exist?(config_file)
|
11
|
+
puts "#{LB_PROJECT_YML} not found: '#{config_file}'"
|
12
|
+
exit 1
|
13
|
+
end
|
14
|
+
config = YAML.load_file(config_file)
|
15
|
+
|
16
|
+
begin
|
17
|
+
namespace = config.fetch('namespace')
|
18
|
+
require namespace
|
19
|
+
LB::Project::Render.new.call
|
20
|
+
exit 0
|
21
|
+
rescue KeyError
|
22
|
+
puts "'namespace' not set in '#{LB_PROJECT_YML}'!"
|
23
|
+
raise
|
24
|
+
rescue LoadError
|
25
|
+
puts "Can not require namespace '#{namespace}'!"
|
26
|
+
puts "Please fix namespace in '#{LB_PROJECT_YML}'."
|
27
|
+
raise
|
28
|
+
end
|
29
|
+
exit 1
|
data/config/devtools.yml
ADDED
data/config/flay.yml
ADDED
data/config/flog.yml
ADDED
data/config/mutant.yml
ADDED
data/config/reek.yml
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
---
|
2
|
+
Attribute:
|
3
|
+
enabled: false
|
4
|
+
exclude: []
|
5
|
+
BooleanParameter:
|
6
|
+
enabled: true
|
7
|
+
exclude: []
|
8
|
+
ClassVariable:
|
9
|
+
enabled: true
|
10
|
+
exclude: []
|
11
|
+
ControlParameter:
|
12
|
+
enabled: true
|
13
|
+
exclude: []
|
14
|
+
DataClump:
|
15
|
+
enabled: true
|
16
|
+
exclude: []
|
17
|
+
max_copies: 0
|
18
|
+
min_clump_size: 2
|
19
|
+
DuplicateMethodCall:
|
20
|
+
enabled: true
|
21
|
+
exclude: []
|
22
|
+
max_calls: 1
|
23
|
+
allow_calls: []
|
24
|
+
FeatureEnvy:
|
25
|
+
enabled: true
|
26
|
+
exclude: []
|
27
|
+
IrresponsibleModule:
|
28
|
+
enabled: true
|
29
|
+
exclude: []
|
30
|
+
LongParameterList:
|
31
|
+
enabled: true
|
32
|
+
exclude: []
|
33
|
+
max_params: 2
|
34
|
+
overrides: {}
|
35
|
+
LongYieldList:
|
36
|
+
enabled: true
|
37
|
+
exclude: []
|
38
|
+
max_params: 0
|
39
|
+
NestedIterators:
|
40
|
+
enabled: true
|
41
|
+
exclude: []
|
42
|
+
max_allowed_nesting: 1
|
43
|
+
ignore_iterators: []
|
44
|
+
NilCheck:
|
45
|
+
enabled: true
|
46
|
+
exclude: []
|
47
|
+
RepeatedConditional:
|
48
|
+
enabled: true
|
49
|
+
exclude: []
|
50
|
+
max_ifs: 1
|
51
|
+
TooManyConstants:
|
52
|
+
enabled: true
|
53
|
+
exclude: []
|
54
|
+
TooManyInstanceVariables:
|
55
|
+
enabled: true
|
56
|
+
exclude: []
|
57
|
+
max_instance_variables: 2
|
58
|
+
TooManyMethods:
|
59
|
+
enabled: true
|
60
|
+
exclude: []
|
61
|
+
max_methods: 15
|
62
|
+
TooManyStatements:
|
63
|
+
enabled: true
|
64
|
+
exclude: []
|
65
|
+
max_statements: 5
|
66
|
+
UncommunicativeMethodName:
|
67
|
+
enabled: true
|
68
|
+
exclude: []
|
69
|
+
reject:
|
70
|
+
- !ruby/regexp /^[a-z]$/
|
71
|
+
- !ruby/regexp /[0-9]$/
|
72
|
+
- !ruby/regexp /[A-Z]/
|
73
|
+
accept: []
|
74
|
+
UncommunicativeModuleName:
|
75
|
+
enabled: true
|
76
|
+
exclude: []
|
77
|
+
reject:
|
78
|
+
- !ruby/regexp /^.$/
|
79
|
+
- !ruby/regexp /[0-9]$/
|
80
|
+
accept: []
|
81
|
+
UncommunicativeParameterName:
|
82
|
+
enabled: true
|
83
|
+
exclude: []
|
84
|
+
reject:
|
85
|
+
- !ruby/regexp /^.$/
|
86
|
+
- !ruby/regexp /[0-9]$/
|
87
|
+
- !ruby/regexp /[A-Z]/
|
88
|
+
accept: []
|
89
|
+
UncommunicativeVariableName:
|
90
|
+
enabled: true
|
91
|
+
exclude: []
|
92
|
+
reject:
|
93
|
+
- !ruby/regexp /^.$/
|
94
|
+
- !ruby/regexp /[0-9]$/
|
95
|
+
- !ruby/regexp /[A-Z]/
|
96
|
+
accept: []
|
97
|
+
UnusedParameters:
|
98
|
+
enabled: true
|
99
|
+
exclude: []
|
100
|
+
UtilityFunction:
|
101
|
+
enabled: true
|
102
|
+
exclude: []
|
103
|
+
max_helper_calls: 0
|
data/config/rubocop.yml
ADDED
data/lb-project.gemspec
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
require File.expand_path('../lib/lb/project/version', __FILE__)
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = 'lb-project'
|
8
|
+
gem.version = LB::Project::VERSION.dup
|
9
|
+
gem.authors = ['Firas Zaidan']
|
10
|
+
gem.email = ['firas@zaidan.de']
|
11
|
+
gem.description = 'Static site builder with easy migration to dynamic site'
|
12
|
+
gem.summary = gem.description
|
13
|
+
gem.homepage = 'https://github.com/lb-rb/lb-project'
|
14
|
+
gem.license = 'MIT'
|
15
|
+
|
16
|
+
gem.bindir = 'bin'
|
17
|
+
gem.require_paths = %w[lib bin]
|
18
|
+
gem.files = `git ls-files`
|
19
|
+
.split($INPUT_RECORD_SEPARATOR)
|
20
|
+
gem.executables = `git ls-files -- bin/*`
|
21
|
+
.split("\n").map { |f| File.basename(f) }
|
22
|
+
gem.test_files = `git ls-files -- spec`
|
23
|
+
.split($INPUT_RECORD_SEPARATOR)
|
24
|
+
gem.extra_rdoc_files = %w[README.md]
|
25
|
+
gem.required_ruby_version = '>= 2.5'
|
26
|
+
|
27
|
+
gem.add_dependency 'dry-initializer', '~> 2.3', '< 2.4'
|
28
|
+
gem.add_dependency 'dry-struct', '~> 0.4', '< 0.5'
|
29
|
+
gem.add_dependency 'dry-types', '~> 0.12', '< 0.13'
|
30
|
+
gem.add_dependency 'dry-view', '~> 0.3', '>= 0.3.0', '< 0.3.1'
|
31
|
+
gem.add_dependency 'r18n-core', '~> 2.2', '< 2.3'
|
32
|
+
gem.add_dependency 'roda', '~> 2.29', '< 2.30'
|
33
|
+
gem.add_dependency 'roda-i18n', '~> 0.3', '< 0.4'
|
34
|
+
|
35
|
+
gem.add_development_dependency 'devtools', '~> 0.1.19'
|
36
|
+
gem.add_development_dependency 'guard', '~> 2.14'
|
37
|
+
gem.add_development_dependency 'guard-bundler', '~> 2.1'
|
38
|
+
gem.add_development_dependency 'guard-rspec', '~> 4.7', '>= 4.7.3'
|
39
|
+
gem.add_development_dependency 'guard-rubocop', '~> 1.3'
|
40
|
+
gem.add_development_dependency 'rubocop', '~> 0.52'
|
41
|
+
gem.add_development_dependency 'slim', '~> 3.0'
|
42
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LB
|
4
|
+
module Project
|
5
|
+
# Configuration
|
6
|
+
class Config < Dry::Struct
|
7
|
+
RequiredString = Types::Strict::String.constrained(min_size: 1)
|
8
|
+
|
9
|
+
attribute :base_path, Types::Strict::String
|
10
|
+
attribute :image_base_path, Types::Strict::String
|
11
|
+
attribute :public_path, Types::Strict::String
|
12
|
+
attribute :template_path, Types::Strict::String
|
13
|
+
|
14
|
+
def self.load(root, name, env)
|
15
|
+
path = File.join(File.join(root, 'config'), "#{name}.yml")
|
16
|
+
yaml = File.exist?(path) ? YAML.load_file(path) : {}
|
17
|
+
|
18
|
+
new(config(yaml, env))
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.config(yaml, env)
|
22
|
+
schema.keys.each_with_object({}) do |key, memo|
|
23
|
+
memo[key] = value_for(yaml, env, key)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.value_for(yaml, env, key)
|
28
|
+
ENV.fetch(
|
29
|
+
key.to_s.upcase,
|
30
|
+
yaml.fetch(env.to_s, {})[key.to_s]
|
31
|
+
)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LB
|
4
|
+
module Project
|
5
|
+
# Page view
|
6
|
+
class Page < View
|
7
|
+
extend LB::Project::Registry::Registration[:page]
|
8
|
+
|
9
|
+
def title
|
10
|
+
t = LB::Project.t.page
|
11
|
+
self.class.page_key.split('/').each do |key|
|
12
|
+
t = t.send(key)
|
13
|
+
end
|
14
|
+
|
15
|
+
t.title
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LB
|
4
|
+
module Project
|
5
|
+
class Registry
|
6
|
+
# Mixin for registration
|
7
|
+
module Registration
|
8
|
+
def self.[](registry_name, registry = LB::Project::Registry.new)
|
9
|
+
rcmethod = "#{registry_name}_registry_config"
|
10
|
+
setup(registry_name, registry, rcmethod)
|
11
|
+
define_helpers(registry_name, rcmethod) unless respond_to?(rcmethod)
|
12
|
+
|
13
|
+
self
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.define_helpers(registry_name, rcmethod)
|
17
|
+
rmethod = "#{registry_name}_registry"
|
18
|
+
|
19
|
+
define_registry_config(rcmethod)
|
20
|
+
define_registry(rcmethod, rmethod)
|
21
|
+
define_registry_name(registry_name, rcmethod)
|
22
|
+
define_registry_as(registry_name, rmethod)
|
23
|
+
define_key(registry_name)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.define_registry_config(rcmethod)
|
27
|
+
define_method(rcmethod) do
|
28
|
+
Registration.instance_variable_get("@#{rcmethod}")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.define_registry(rcmethod, rmethod)
|
33
|
+
define_method(rmethod) do
|
34
|
+
send(rcmethod).registry
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.define_registry_name(registry_name, rcmethod)
|
39
|
+
rnmethod = "#{registry_name}_registry_name"
|
40
|
+
define_method(rnmethod) do
|
41
|
+
send(rcmethod).name
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.define_registry_as(registry_name, rmethod)
|
46
|
+
define_method("register_#{registry_name}_as") do |key|
|
47
|
+
send(rmethod).register(key.to_s, self)
|
48
|
+
instance_variable_set("@#{registry_name}_key", key.to_s)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.define_key(registry_name)
|
53
|
+
define_method("#{registry_name}_key") do
|
54
|
+
instance_variable_get("@#{registry_name}_key")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.setup(registry_name, registry, rcmethod)
|
59
|
+
config = Config.new(registry_name, registry)
|
60
|
+
Registration.instance_variable_set("@#{rcmethod}", config)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Stores the registration configuration
|
64
|
+
class Config
|
65
|
+
extend Dry::Initializer
|
66
|
+
|
67
|
+
param :name, Dry::Types['coercible.string']
|
68
|
+
param :registry
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LB
|
4
|
+
module Project
|
5
|
+
# Basic key value store
|
6
|
+
class Registry
|
7
|
+
include Dry::Equalizer(:keys)
|
8
|
+
include Enumerable
|
9
|
+
|
10
|
+
attr_reader :keys
|
11
|
+
|
12
|
+
# Error that is raised when key is not found in registry
|
13
|
+
class KeyNotFoundError < KeyError
|
14
|
+
def initialize(key)
|
15
|
+
super("#{key.inspect} doesn't exist in registry")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(keys = {})
|
20
|
+
@keys = keys
|
21
|
+
end
|
22
|
+
|
23
|
+
def each(&block)
|
24
|
+
return to_enum unless block
|
25
|
+
keys.each_pair { |key, value| yield(key, value) }
|
26
|
+
end
|
27
|
+
|
28
|
+
def key?(key)
|
29
|
+
!key.nil? && keys.key?(key.to_sym)
|
30
|
+
end
|
31
|
+
|
32
|
+
def fetch(key)
|
33
|
+
raise ArgumentError, 'key cannot be nil' if key.nil?
|
34
|
+
|
35
|
+
keys.fetch(key.to_sym) do
|
36
|
+
return yield if block_given?
|
37
|
+
|
38
|
+
raise KeyNotFoundError, key
|
39
|
+
end
|
40
|
+
end
|
41
|
+
alias [] fetch
|
42
|
+
|
43
|
+
def respond_to_missing?(key, include_private = false)
|
44
|
+
keys.key?(key) || super
|
45
|
+
end
|
46
|
+
|
47
|
+
def register(key, value)
|
48
|
+
keys[key] = value
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def method_missing(key, *)
|
54
|
+
keys.fetch(key) { super }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LB
|
4
|
+
module Project
|
5
|
+
# Render
|
6
|
+
class Render
|
7
|
+
def call
|
8
|
+
Page.page_registry.each do |name, klass|
|
9
|
+
page = klass.new
|
10
|
+
File.write(file_for(name), page.call(options(page)))
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def file_for(name)
|
15
|
+
File.expand_path("#{name}.html", LB::Project.public_path).tap do |file|
|
16
|
+
FileUtils.mkdir_p File.dirname(file)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def options(page, locals = {})
|
21
|
+
{
|
22
|
+
context: ::Struct.new(:site, :page).new(LB::Project::Site.new, page),
|
23
|
+
locals: locals
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LB
|
4
|
+
module Project
|
5
|
+
# Base route
|
6
|
+
class Route < Roda
|
7
|
+
def self.setup(route)
|
8
|
+
translations = [File.join(LB::Project.root, 'locales')]
|
9
|
+
route.plugin :i18n, translations: translations
|
10
|
+
route.opts[:root] = LB::Project.root
|
11
|
+
route.plugin :public, root: 'docs'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LB
|
4
|
+
module Project
|
5
|
+
# Site context for templates
|
6
|
+
class Site
|
7
|
+
include R18n::Helpers
|
8
|
+
|
9
|
+
def initialize(context = {})
|
10
|
+
@context = context
|
11
|
+
end
|
12
|
+
|
13
|
+
def options
|
14
|
+
@options ||= {}
|
15
|
+
end
|
16
|
+
|
17
|
+
def [](*args)
|
18
|
+
options.fetch(*args)
|
19
|
+
end
|
20
|
+
|
21
|
+
def path_for(bundle, type)
|
22
|
+
path = 'webpack-assets.json'
|
23
|
+
file = File.read(path)
|
24
|
+
json = JSON.parse(file)
|
25
|
+
LB::Project.config.base_path + json[bundle][type]
|
26
|
+
end
|
27
|
+
|
28
|
+
def js_for(bundle)
|
29
|
+
path_for(bundle, 'js')
|
30
|
+
end
|
31
|
+
|
32
|
+
def css_for(bundle)
|
33
|
+
path_for(bundle, 'css')
|
34
|
+
end
|
35
|
+
|
36
|
+
def image_path(path)
|
37
|
+
"#{LB::Project.config.image_base_path}/#{path}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|