lb-project 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LB
|
4
|
+
module Project
|
5
|
+
# Base view
|
6
|
+
class View < Dry::View::Controller
|
7
|
+
extend LB::Project::Registry::Registration[:view]
|
8
|
+
|
9
|
+
def self.setup(view)
|
10
|
+
view.setting :paths, [LB::Project.template_path]
|
11
|
+
view.setting :layout, 'main'
|
12
|
+
end
|
13
|
+
|
14
|
+
def view_locals(options)
|
15
|
+
options
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/lb/project.rb
ADDED
@@ -0,0 +1,159 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
# Web
|
7
|
+
require 'roda'
|
8
|
+
require 'roda/plugins/public'
|
9
|
+
|
10
|
+
# r18n
|
11
|
+
require 'r18n-core'
|
12
|
+
|
13
|
+
# Dry
|
14
|
+
require 'dry-types'
|
15
|
+
require 'dry-struct'
|
16
|
+
require 'dry-view'
|
17
|
+
require 'dry-initializer'
|
18
|
+
|
19
|
+
# Version
|
20
|
+
require 'lb/project/version'
|
21
|
+
|
22
|
+
# Custom Types
|
23
|
+
require 'lb/project/types'
|
24
|
+
|
25
|
+
# Config
|
26
|
+
require 'lb/project/config'
|
27
|
+
|
28
|
+
# LB namespace
|
29
|
+
module LB
|
30
|
+
# Project
|
31
|
+
module Project
|
32
|
+
CONFIG_NAME = 'application'
|
33
|
+
DEFAULT_RACK_ENV = 'development'
|
34
|
+
|
35
|
+
# Setup
|
36
|
+
#
|
37
|
+
# @param [File] root Path to project root
|
38
|
+
#
|
39
|
+
# @return [self]
|
40
|
+
#
|
41
|
+
# @api private
|
42
|
+
#
|
43
|
+
def self.setup(root)
|
44
|
+
@root = root
|
45
|
+
|
46
|
+
self
|
47
|
+
end
|
48
|
+
|
49
|
+
# Get root path
|
50
|
+
#
|
51
|
+
# @return [dir_name]
|
52
|
+
#
|
53
|
+
# @api private
|
54
|
+
#
|
55
|
+
def self.root
|
56
|
+
@root
|
57
|
+
end
|
58
|
+
|
59
|
+
# Get root path for file
|
60
|
+
#
|
61
|
+
# @param [File] file The file to get the root path from
|
62
|
+
# @param [File] depth The depth of the given file relative from the root
|
63
|
+
# directory
|
64
|
+
#
|
65
|
+
# @return [dir_name]
|
66
|
+
#
|
67
|
+
# @api private
|
68
|
+
#
|
69
|
+
def self.root_for(file, depth = 2)
|
70
|
+
path = File.expand_path(file)
|
71
|
+
depth.times { path = File.dirname(path) }
|
72
|
+
path
|
73
|
+
end
|
74
|
+
|
75
|
+
# Get template path
|
76
|
+
#
|
77
|
+
# @return [dir_name]
|
78
|
+
#
|
79
|
+
# @api private
|
80
|
+
#
|
81
|
+
def self.template_path
|
82
|
+
File.join(root, config.template_path)
|
83
|
+
end
|
84
|
+
|
85
|
+
# Get public path
|
86
|
+
#
|
87
|
+
# @return [dir_name]
|
88
|
+
#
|
89
|
+
# @api private
|
90
|
+
#
|
91
|
+
def self.public_path
|
92
|
+
File.join(root, config.public_path)
|
93
|
+
end
|
94
|
+
|
95
|
+
# Get main configuration
|
96
|
+
#
|
97
|
+
# @return [Config]
|
98
|
+
#
|
99
|
+
# @api private
|
100
|
+
#
|
101
|
+
def self.config
|
102
|
+
@config ||= Config.load(root, CONFIG_NAME, rack_env)
|
103
|
+
end
|
104
|
+
|
105
|
+
# Get RACK_ENV
|
106
|
+
#
|
107
|
+
# @return [String]
|
108
|
+
#
|
109
|
+
# @api private
|
110
|
+
#
|
111
|
+
def self.rack_env
|
112
|
+
@rack_env ||= ENV.fetch('RACK_ENV', DEFAULT_RACK_ENV)
|
113
|
+
end
|
114
|
+
|
115
|
+
# Check if rack_env is 'development'
|
116
|
+
#
|
117
|
+
# @return [Boolean]
|
118
|
+
#
|
119
|
+
# @api private
|
120
|
+
#
|
121
|
+
def self.development?
|
122
|
+
DEFAULT_RACK_ENV.eql? rack_env
|
123
|
+
end
|
124
|
+
|
125
|
+
def self.t(*params)
|
126
|
+
R18n.t(*params)
|
127
|
+
end
|
128
|
+
|
129
|
+
def self.logger
|
130
|
+
@logger ||= create_logger
|
131
|
+
end
|
132
|
+
|
133
|
+
def self.create_logger
|
134
|
+
logger = Logger.new(STDOUT)
|
135
|
+
logger.level = Logger::INFO
|
136
|
+
logger
|
137
|
+
end
|
138
|
+
|
139
|
+
private_class_method :create_logger
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
# Site
|
144
|
+
require 'lb/project/site'
|
145
|
+
|
146
|
+
# Routing
|
147
|
+
require 'lb/project/route'
|
148
|
+
require 'lb/project/app'
|
149
|
+
|
150
|
+
# Registry
|
151
|
+
require 'lb/project/registry'
|
152
|
+
require 'lb/project/registry/registration'
|
153
|
+
|
154
|
+
# Views
|
155
|
+
require 'lb/project/view'
|
156
|
+
require 'lb/project/page'
|
157
|
+
|
158
|
+
# Render
|
159
|
+
require 'lb/project/render'
|
data/lib/lb-project.rb
ADDED
data/rakelib/ci.rake
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Remove existing same-named tasks
|
4
|
+
%w[ci ci:metrics].each do |task|
|
5
|
+
klass = Rake::Task
|
6
|
+
klass[task].clear if klass.task_defined?(task)
|
7
|
+
end
|
8
|
+
|
9
|
+
desc 'Run all specs, metrics and mutant'
|
10
|
+
task ci: %w[ci:metrics metrics:mutant]
|
11
|
+
|
12
|
+
namespace :ci do
|
13
|
+
tasks = %w[
|
14
|
+
metrics:coverage
|
15
|
+
metrics:yardstick:verify
|
16
|
+
metrics:rubocop
|
17
|
+
metrics:flog
|
18
|
+
metrics:flay
|
19
|
+
spec:integration
|
20
|
+
]
|
21
|
+
|
22
|
+
desc 'Run metrics (except mutant)'
|
23
|
+
task metrics: tasks
|
24
|
+
end
|
File without changes
|
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Slim
|
4
|
+
require 'slim'
|
5
|
+
|
6
|
+
require 'lb-project'
|
7
|
+
|
8
|
+
# Example project
|
9
|
+
module Example
|
10
|
+
LB::Project.setup(LB::Project.root_for(__FILE__))
|
11
|
+
end
|
12
|
+
|
13
|
+
require 'example/app'
|
14
|
+
require 'example/page'
|
15
|
+
require 'example/page/index'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
doctype html
|
2
|
+
html
|
3
|
+
head
|
4
|
+
meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"
|
5
|
+
meta charset="utf-8"
|
6
|
+
meta content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" name="viewport"
|
7
|
+
|
8
|
+
title = "#{_context.page.title} - #{site.t.site.title}"
|
9
|
+
|
10
|
+
link href="#{site.css_for('main')}" rel='stylesheet' type='text/css'
|
11
|
+
script src="#{site.js_for('main')}"
|
12
|
+
|
13
|
+
== yield
|
@@ -0,0 +1 @@
|
|
1
|
+
{"main":{"js":"assets/javascripts/main.bundle.js","css":"assets/stylesheets/main.bundle.css"}}
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
if ENV['COVERAGE'] == 'true'
|
5
|
+
require 'simplecov'
|
6
|
+
|
7
|
+
SimpleCov.start do
|
8
|
+
command_name 'spec:unit'
|
9
|
+
|
10
|
+
add_filter 'config'
|
11
|
+
add_filter 'spec'
|
12
|
+
|
13
|
+
minimum_coverage 100
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
$LOAD_PATH << 'lib'
|
18
|
+
|
19
|
+
require 'lb-project'
|
20
|
+
|
21
|
+
require 'devtools/spec_helper'
|
22
|
+
|
23
|
+
# require spec support files and shared behavior
|
24
|
+
Dir[File.expand_path('../{support,shared}/**/*.rb', __FILE__)].each do |file|
|
25
|
+
require file
|
26
|
+
end
|
27
|
+
|
28
|
+
RSpec.configure do |config|
|
29
|
+
config.include(SpecHelper)
|
30
|
+
config.mock_framework = :rspec
|
31
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe LB::Project, '.config' do
|
6
|
+
subject { object.config }
|
7
|
+
|
8
|
+
let(:object) { described_class }
|
9
|
+
|
10
|
+
let(:default_hash) do
|
11
|
+
{
|
12
|
+
base_path: '',
|
13
|
+
image_base_path: 'assets/images',
|
14
|
+
public_path: 'docs',
|
15
|
+
template_path: 'templates'
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:default) { LB::Project::Config.new(default_hash) }
|
20
|
+
|
21
|
+
let(:env) { 'RACK_ENV' }
|
22
|
+
|
23
|
+
before(:each) do
|
24
|
+
root = LB::Project.root_for(__FILE__, 6)
|
25
|
+
LB::Project.setup(File.join(root, 'spec/fixtures'))
|
26
|
+
end
|
27
|
+
|
28
|
+
after(:each) do
|
29
|
+
object.remove_instance_variable(:@rack_env)
|
30
|
+
object.remove_instance_variable(:@config)
|
31
|
+
object.remove_instance_variable(:@root)
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'without RACK_ENV' do
|
35
|
+
it 'should return default config' do
|
36
|
+
expect(subject).to eql(default)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'with RACK_ENV=production' do
|
41
|
+
let(:production_hash) { default_hash.merge(public_path: 'htdocs') }
|
42
|
+
let(:production) { LB::Project::Config.new(production_hash) }
|
43
|
+
let(:rack_env) { 'production' }
|
44
|
+
|
45
|
+
before(:each) do
|
46
|
+
ENV[env] = rack_env
|
47
|
+
end
|
48
|
+
|
49
|
+
after(:each) do
|
50
|
+
ENV.delete(env)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should return production config' do
|
54
|
+
expect(subject).to eql(production)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe LB::Project, '.development?' do
|
6
|
+
subject { object.development? }
|
7
|
+
|
8
|
+
let(:object) { described_class }
|
9
|
+
|
10
|
+
let(:default) { 'development' }
|
11
|
+
|
12
|
+
let(:env) { 'RACK_ENV' }
|
13
|
+
|
14
|
+
after(:each) do
|
15
|
+
object.remove_instance_variable(:@rack_env)
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'without RACK_ENV' do
|
19
|
+
it 'should return true' do
|
20
|
+
expect(subject).to be true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'with RACK_ENV=production' do
|
25
|
+
let(:rack_env) { 'production' }
|
26
|
+
|
27
|
+
before(:each) do
|
28
|
+
ENV[env] = rack_env
|
29
|
+
end
|
30
|
+
|
31
|
+
after(:each) do
|
32
|
+
ENV.delete(env)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should return false' do
|
36
|
+
expect(subject).to be false
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe LB::Project, '.logger' do
|
6
|
+
subject { object.logger }
|
7
|
+
|
8
|
+
let(:object) { described_class }
|
9
|
+
|
10
|
+
let(:expected_level) { Logger::INFO }
|
11
|
+
|
12
|
+
let(:expected_type) { Logger }
|
13
|
+
|
14
|
+
after(:each) do
|
15
|
+
object.remove_instance_variable(:@logger)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should return logger of type Logger' do
|
19
|
+
expect(subject.class).to be(expected_type)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should set log level to info' do
|
23
|
+
expect(subject.level).to be(expected_level)
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe LB::Project, '.rack_env' do
|
6
|
+
subject { object.rack_env }
|
7
|
+
|
8
|
+
let(:object) { described_class }
|
9
|
+
|
10
|
+
let(:default) { 'development' }
|
11
|
+
|
12
|
+
let(:env) { 'RACK_ENV' }
|
13
|
+
|
14
|
+
after(:each) do
|
15
|
+
object.remove_instance_variable(:@rack_env)
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'without RACK_ENV' do
|
19
|
+
it 'should return default RACK_ENV' do
|
20
|
+
expect(subject).to eql(default)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'with RACK_ENV=production' do
|
25
|
+
let(:rack_env) { 'production' }
|
26
|
+
|
27
|
+
before(:each) do
|
28
|
+
ENV[env] = rack_env
|
29
|
+
end
|
30
|
+
|
31
|
+
after(:each) do
|
32
|
+
ENV.delete(env)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should return production' do
|
36
|
+
expect(subject).to eql(rack_env)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe LB::Project, '.root_for' do
|
6
|
+
subject { object.root_for(*args) }
|
7
|
+
|
8
|
+
let(:args) { [file] }
|
9
|
+
let(:object) { described_class }
|
10
|
+
let(:file) { __FILE__ }
|
11
|
+
|
12
|
+
let(:expected) { File.dirname(File.dirname(File.expand_path(file))) }
|
13
|
+
|
14
|
+
it 'should equal the absolute parent path (two directory levels up)' do
|
15
|
+
expect(subject).to eql(expected)
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'with depth of 3' do
|
19
|
+
let(:args) { [file, 3] }
|
20
|
+
let(:expected) do
|
21
|
+
File.dirname(File.dirname(File.dirname(File.expand_path(file))))
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should equal the absolute parent path (two directory levels up)' do
|
25
|
+
expect(subject).to eql(expected)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe LB::Project, '.root' do
|
6
|
+
subject { object.root }
|
7
|
+
|
8
|
+
let(:object) { described_class }
|
9
|
+
|
10
|
+
context 'without setup' do
|
11
|
+
it 'should return nil' do
|
12
|
+
expect(subject).to be_nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'without setup' do
|
17
|
+
let(:root) { double(:root) }
|
18
|
+
|
19
|
+
before(:each) do
|
20
|
+
object.setup(root)
|
21
|
+
end
|
22
|
+
|
23
|
+
after(:each) do
|
24
|
+
object.remove_instance_variable(:@root)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should return nil' do
|
28
|
+
expect(subject).to be(root)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe LB::Project, '.setup' do
|
6
|
+
subject { object.setup(root) }
|
7
|
+
|
8
|
+
let(:root) { double(:root) }
|
9
|
+
let(:object) { described_class }
|
10
|
+
|
11
|
+
after(:each) do
|
12
|
+
object.remove_instance_variable(:@root)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should return self' do
|
16
|
+
expect(subject).to eql(object)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should set root' do
|
20
|
+
subject
|
21
|
+
expect(object.root).to be(root)
|
22
|
+
end
|
23
|
+
end
|