mvc_one 0.1.0.pre.rc3 → 0.1.0.pre.rc5
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 +4 -4
- data/.rubocop.yml +32 -9
- data/Gemfile +7 -6
- data/Gemfile.lock +89 -3
- data/Rakefile +3 -3
- data/exe/mvc_one +23 -11
- data/lib/mvc_one/application.rb +56 -0
- data/lib/mvc_one/contracts/application_contract.rb +5 -1
- data/lib/mvc_one/controllers/application_controller.rb +50 -48
- data/lib/mvc_one/models/application_model.rb +3 -1
- data/lib/mvc_one/regexp_router.rb +89 -85
- data/lib/mvc_one/repositories/application_relation.rb +24 -22
- data/lib/mvc_one/repositories/application_repository.rb +13 -9
- data/lib/mvc_one/serializers/application_serializer.rb +100 -98
- data/lib/mvc_one/version.rb +1 -1
- data/lib/mvc_one.rb +3 -3
- data/mvc_one.gemspec +25 -24
- data/templates/config/routes_rb.erb +2 -0
- data/templates/general/application_rb.erb +1 -37
- data/templates/general/config_ru.erb +0 -1
- data/templates/general/database_yml.erb +2 -2
- data/templates/general/gemfile.erb +3 -1
- data/templates/general/secrets_yml.erb +2 -2
- metadata +54 -52
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 69e5e06df9043af06f3c3cad8f62755e91a772a2b894726f7a5f49edb566ae60
|
4
|
+
data.tar.gz: 984bfbd6a6428678c6096e300cc0a0c161f80ccf01a04eeb6d259020c25178b5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 864f1663d0f62f71dcaa7cdc46dd6adff1b67bec0ff5a7b0530bac44e149b4207dd252936a0b7194e4371b457457c65a616bb352fad6c4247eeeac543555f582
|
7
|
+
data.tar.gz: 7902064cb8b39c02722285d7692fc1c6a588fac5039bd1af54d6789bc0827629892cd1b410c1e536537b7926e6c5ba743415317231291dbc174f39c20cf6b4bf
|
data/.rubocop.yml
CHANGED
@@ -1,13 +1,36 @@
|
|
1
|
+
require:
|
2
|
+
- rubocop-rake
|
3
|
+
- rubocop-sequel
|
4
|
+
- rubocop-rspec
|
5
|
+
|
1
6
|
AllCops:
|
2
|
-
|
7
|
+
NewCops: enable
|
8
|
+
|
9
|
+
Metrics/BlockLength:
|
10
|
+
Enabled: false
|
11
|
+
|
12
|
+
RSpec/MultipleExpectations:
|
13
|
+
Enabled: false
|
14
|
+
|
15
|
+
RSpec/ExampleLength:
|
16
|
+
Enabled: false
|
17
|
+
|
18
|
+
RSpec/MultipleMemoizedHelpers:
|
19
|
+
Enabled: false
|
20
|
+
|
21
|
+
Metrics/AbcSize:
|
22
|
+
Max: 50
|
23
|
+
|
24
|
+
Metrics/ClassLength:
|
25
|
+
Max: 150
|
3
26
|
|
4
|
-
|
5
|
-
Enabled:
|
6
|
-
EnforcedStyle: double_quotes
|
27
|
+
Metrics/MethodLength:
|
28
|
+
Enabled: false
|
7
29
|
|
8
|
-
Style/
|
9
|
-
Enabled:
|
10
|
-
EnforcedStyle: double_quotes
|
30
|
+
Style/Documentation:
|
31
|
+
Enabled: false
|
11
32
|
|
12
|
-
|
13
|
-
|
33
|
+
Naming/PredicateName:
|
34
|
+
AllowedMethods:
|
35
|
+
- 'has_many'
|
36
|
+
- 'has_one'
|
data/Gemfile
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
source
|
3
|
+
source 'https://rubygems.org'
|
4
4
|
|
5
5
|
# Specify your gem's dependencies in mvc_one.gemspec
|
6
6
|
gemspec
|
7
7
|
|
8
|
-
gem
|
9
|
-
|
10
|
-
gem
|
11
|
-
|
12
|
-
gem
|
8
|
+
gem 'rake', '~> 13.0'
|
9
|
+
gem 'rspec', '~> 3.0'
|
10
|
+
gem 'rubocop', require: false
|
11
|
+
gem 'rubocop-rake', require: false
|
12
|
+
gem 'rubocop-rspec', require: false
|
13
|
+
gem 'rubocop-sequel', require: false
|
data/Gemfile.lock
CHANGED
@@ -1,18 +1,84 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
mvc_one (0.1.0.pre.
|
5
|
-
|
4
|
+
mvc_one (0.1.0.pre.rc5)
|
5
|
+
bcrypt (~> 3.1)
|
6
|
+
dry-struct (~> 1.5)
|
7
|
+
dry-transaction (~> 0.14)
|
8
|
+
dry-validation (~> 1.9)
|
9
|
+
rack (~> 3)
|
10
|
+
rack-session (~> 2)
|
11
|
+
sequel (~> 5.60)
|
12
|
+
slim (~> 5)
|
13
|
+
sqlite3 (~> 1.5)
|
14
|
+
thor (~> 1.2)
|
6
15
|
|
7
16
|
GEM
|
8
17
|
remote: https://rubygems.org/
|
9
18
|
specs:
|
10
19
|
ast (2.4.2)
|
20
|
+
bcrypt (3.1.18)
|
21
|
+
concurrent-ruby (1.2.2)
|
11
22
|
diff-lcs (1.5.0)
|
23
|
+
dry-configurable (1.0.1)
|
24
|
+
dry-core (~> 1.0, < 2)
|
25
|
+
zeitwerk (~> 2.6)
|
26
|
+
dry-core (1.0.0)
|
27
|
+
concurrent-ruby (~> 1.0)
|
28
|
+
zeitwerk (~> 2.6)
|
29
|
+
dry-events (1.0.1)
|
30
|
+
concurrent-ruby (~> 1.0)
|
31
|
+
dry-core (~> 1.0, < 2)
|
32
|
+
dry-inflector (1.0.0)
|
33
|
+
dry-initializer (3.1.1)
|
34
|
+
dry-logic (1.5.0)
|
35
|
+
concurrent-ruby (~> 1.0)
|
36
|
+
dry-core (~> 1.0, < 2)
|
37
|
+
zeitwerk (~> 2.6)
|
38
|
+
dry-matcher (0.10.0)
|
39
|
+
dry-core (~> 1.0)
|
40
|
+
dry-monads (1.6.0)
|
41
|
+
concurrent-ruby (~> 1.0)
|
42
|
+
dry-core (~> 1.0, < 2)
|
43
|
+
zeitwerk (~> 2.6)
|
44
|
+
dry-schema (1.13.0)
|
45
|
+
concurrent-ruby (~> 1.0)
|
46
|
+
dry-configurable (~> 1.0, >= 1.0.1)
|
47
|
+
dry-core (~> 1.0, < 2)
|
48
|
+
dry-initializer (~> 3.0)
|
49
|
+
dry-logic (>= 1.5, < 2)
|
50
|
+
dry-types (>= 1.7, < 2)
|
51
|
+
zeitwerk (~> 2.6)
|
52
|
+
dry-struct (1.6.0)
|
53
|
+
dry-core (~> 1.0, < 2)
|
54
|
+
dry-types (>= 1.7, < 2)
|
55
|
+
ice_nine (~> 0.11)
|
56
|
+
zeitwerk (~> 2.6)
|
57
|
+
dry-transaction (0.15.0)
|
58
|
+
dry-core (~> 1.0)
|
59
|
+
dry-events (~> 1.0)
|
60
|
+
dry-matcher (~> 0.10)
|
61
|
+
dry-monads (~> 1.6)
|
62
|
+
dry-types (1.7.1)
|
63
|
+
concurrent-ruby (~> 1.0)
|
64
|
+
dry-core (~> 1.0)
|
65
|
+
dry-inflector (~> 1.0)
|
66
|
+
dry-logic (~> 1.4)
|
67
|
+
zeitwerk (~> 2.6)
|
68
|
+
dry-validation (1.10.0)
|
69
|
+
concurrent-ruby (~> 1.0)
|
70
|
+
dry-core (~> 1.0, < 2)
|
71
|
+
dry-initializer (~> 3.0)
|
72
|
+
dry-schema (>= 1.12, < 2)
|
73
|
+
zeitwerk (~> 2.6)
|
74
|
+
ice_nine (0.11.2)
|
12
75
|
json (2.6.3)
|
13
76
|
parallel (1.22.1)
|
14
77
|
parser (3.2.1.0)
|
15
78
|
ast (~> 2.4.1)
|
79
|
+
rack (3.0.4.2)
|
80
|
+
rack-session (2.0.0)
|
81
|
+
rack (>= 3.0.0)
|
16
82
|
rainbow (3.1.1)
|
17
83
|
rake (13.0.6)
|
18
84
|
regexp_parser (2.7.0)
|
@@ -42,9 +108,26 @@ GEM
|
|
42
108
|
unicode-display_width (>= 2.4.0, < 3.0)
|
43
109
|
rubocop-ast (1.26.0)
|
44
110
|
parser (>= 3.2.1.0)
|
111
|
+
rubocop-capybara (2.17.1)
|
112
|
+
rubocop (~> 1.41)
|
113
|
+
rubocop-rake (0.6.0)
|
114
|
+
rubocop (~> 1.0)
|
115
|
+
rubocop-rspec (2.18.1)
|
116
|
+
rubocop (~> 1.33)
|
117
|
+
rubocop-capybara (~> 2.17)
|
118
|
+
rubocop-sequel (0.3.4)
|
119
|
+
rubocop (~> 1.0)
|
45
120
|
ruby-progressbar (1.11.0)
|
121
|
+
sequel (5.66.0)
|
122
|
+
slim (5.0.0)
|
123
|
+
temple (~> 0.10.0)
|
124
|
+
tilt (>= 2.0.6, < 2.1)
|
125
|
+
sqlite3 (1.6.1-x86_64-darwin)
|
126
|
+
temple (0.10.0)
|
46
127
|
thor (1.2.1)
|
128
|
+
tilt (2.0.11)
|
47
129
|
unicode-display_width (2.4.2)
|
130
|
+
zeitwerk (2.6.7)
|
48
131
|
|
49
132
|
PLATFORMS
|
50
133
|
x86_64-darwin-20
|
@@ -53,7 +136,10 @@ DEPENDENCIES
|
|
53
136
|
mvc_one!
|
54
137
|
rake (~> 13.0)
|
55
138
|
rspec (~> 3.0)
|
56
|
-
rubocop
|
139
|
+
rubocop
|
140
|
+
rubocop-rake
|
141
|
+
rubocop-rspec
|
142
|
+
rubocop-sequel
|
57
143
|
|
58
144
|
BUNDLED WITH
|
59
145
|
2.4.7
|
data/Rakefile
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
require 'rspec/core/rake_task'
|
5
5
|
|
6
6
|
RSpec::Core::RakeTask.new(:spec)
|
7
7
|
|
8
|
-
require
|
8
|
+
require 'rubocop/rake_task'
|
9
9
|
|
10
10
|
RuboCop::RakeTask.new
|
11
11
|
|
data/exe/mvc_one
CHANGED
@@ -1,17 +1,19 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
require 'thor'
|
3
5
|
require 'erb'
|
4
6
|
require 'pry'
|
5
7
|
|
6
8
|
module MvcOne
|
7
9
|
class MyCLI < Thor
|
8
|
-
desc
|
10
|
+
desc 'new PROJECT_NAME', 'Generate new application'
|
9
11
|
def new(name)
|
10
12
|
puts "Generating #{name}"
|
11
13
|
project_template(name)
|
12
14
|
end
|
13
15
|
|
14
|
-
desc
|
16
|
+
desc 'generate controller/model/view/contract name', 'Generate new controller/model/view.'
|
15
17
|
def generate(layer, layer_name)
|
16
18
|
case layer
|
17
19
|
when 'controller'
|
@@ -30,14 +32,16 @@ module MvcOne
|
|
30
32
|
private
|
31
33
|
|
32
34
|
def generate_controller(name)
|
33
|
-
raise Error, 'cd into your project repository' unless Dir.
|
35
|
+
raise Error, 'cd into your project repository' unless Dir.exist? 'app/controllers'
|
36
|
+
|
34
37
|
file_name = "app/controllers/#{name}_controller.rb"
|
35
38
|
template = ERB.new(File.read(File.join(gem_path, 'templates/app/controller_template.erb')))
|
36
39
|
File.write(file_name, template.result(binding))
|
37
40
|
end
|
38
41
|
|
39
42
|
def generate_model(name)
|
40
|
-
raise Error, 'cd into your project repository' unless Dir.
|
43
|
+
raise Error, 'cd into your project repository' unless Dir.exist? 'app/models'
|
44
|
+
|
41
45
|
file_name = "app/models/#{name}.rb"
|
42
46
|
template = ERB.new(File.read(File.join(gem_path, 'templates/app/model_template.erb')))
|
43
47
|
File.write(file_name, template.result(binding))
|
@@ -47,13 +51,13 @@ module MvcOne
|
|
47
51
|
name_normalized = name.downcase.gsub(/\s/, '_')
|
48
52
|
make_default_dirs(name_normalized)
|
49
53
|
make_default_files(name_normalized)
|
50
|
-
template = ERB.new <<-
|
54
|
+
template = ERB.new <<-ERBTEMPLATE
|
51
55
|
class ApplicationController
|
52
56
|
def name
|
53
57
|
<%= name %>
|
54
58
|
end
|
55
59
|
end
|
56
|
-
|
60
|
+
ERBTEMPLATE
|
57
61
|
template.result(binding)
|
58
62
|
end
|
59
63
|
|
@@ -78,10 +82,19 @@ module MvcOne
|
|
78
82
|
|
79
83
|
gemfile = ERB.new(File.read(File.join(gem_path, 'templates/general/gemfile.erb')))
|
80
84
|
File.write "#{name_normalized}/Gemfile", gemfile.result(binding)
|
85
|
+
|
86
|
+
app_layout = ERB.new(File.read(File.join(gem_path, 'templates/app/application_layout.slim.erb')))
|
87
|
+
File.write "#{name_normalized}/app/views/application_layout.slim", app_layout
|
88
|
+
|
89
|
+
welcome_controller = ERB.new(File.read(File.join(gem_path, 'templates/app/welcome_controller_rb.erb')))
|
90
|
+
File.write "#{name_normalized}/app/controllers/welcome_controller.rb", welcome_controller.result(binding)
|
91
|
+
|
92
|
+
welcome_index = ERB.new(File.read(File.join(gem_path, 'templates/app/welcome_index.slim')))
|
93
|
+
File.write "#{name_normalized}/app/views/welcome/index.slim", welcome_index
|
81
94
|
end
|
82
95
|
|
83
96
|
def make_default_dirs(root_dir_name)
|
84
|
-
raise Error, "Project directory already exists: #{root_dir_name}" if Dir.
|
97
|
+
raise Error, "Project directory already exists: #{root_dir_name}" if Dir.exist? root_dir_name
|
85
98
|
|
86
99
|
Dir.mkdir(root_dir_name)
|
87
100
|
|
@@ -94,12 +107,11 @@ module MvcOne
|
|
94
107
|
Dir.mkdir("#{root_dir_name}/app/#{dir_name}")
|
95
108
|
end
|
96
109
|
end
|
97
|
-
end
|
98
110
|
|
99
|
-
|
100
|
-
|
111
|
+
def gem_path
|
112
|
+
File.expand_path("#{File.dirname(__FILE__)}/..")
|
113
|
+
end
|
101
114
|
end
|
102
115
|
end
|
103
116
|
|
104
|
-
|
105
117
|
MvcOne::MyCLI.start(ARGV)
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
require 'rack'
|
5
|
+
require 'rack/session'
|
6
|
+
|
7
|
+
module MvcOne
|
8
|
+
# Rack friendly launcher for project
|
9
|
+
class Application
|
10
|
+
# Main application config
|
11
|
+
class Config
|
12
|
+
def self.env
|
13
|
+
ENV.fetch('APP_ENV', 'development')
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.test?
|
17
|
+
env == 'test'
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.secrets
|
21
|
+
YAML.load_file('config/secrets.yml')[Application::Config.env]
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.db_config
|
25
|
+
YAML.load_file('config/database.yml')[Application::Config.env]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def initialize
|
30
|
+
@router = RegexpRouter.new(File.join( 'app', 'config', 'routes.rb'))
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.launch
|
34
|
+
Rack::Builder.new do |builder|
|
35
|
+
builder.use Rack::Session::Cookie, domain: 'localhost', path: '/', expire_after: 3600 * 24,
|
36
|
+
secret: Application::Config.secrets['session_cookie']
|
37
|
+
builder.run Application.new
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def call(env)
|
42
|
+
request = Rack::Request.new(env)
|
43
|
+
result = @router.resolve(request.path, request.request_method)
|
44
|
+
controller = result.controller.new(env, result.params, request)
|
45
|
+
controller.resolve(result.action)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
require_relative 'regexp_router'
|
51
|
+
require_relative 'contracts/application_contract'
|
52
|
+
require_relative 'controllers/application_controller'
|
53
|
+
require_relative 'models/application_model'
|
54
|
+
require_relative 'repositories/application_relation'
|
55
|
+
require_relative 'repositories/application_repository'
|
56
|
+
require_relative 'serializers/application_serializer'
|
@@ -1,5 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'dry-validation'
|
4
|
+
|
3
5
|
# Abstract class for Contract realisation in application
|
4
|
-
|
6
|
+
module MvcOne
|
7
|
+
class ApplicationContract < Dry::Validation::Contract
|
8
|
+
end
|
5
9
|
end
|
@@ -4,70 +4,72 @@ require 'slim/include'
|
|
4
4
|
require 'json'
|
5
5
|
|
6
6
|
# All app controllers must be subclasses of ApplicationController
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
module MvcOne
|
8
|
+
class ApplicationController
|
9
|
+
DEFAULT_LAYOUT = './app/views/application_layout.slim'
|
10
|
+
DEFAULT_HTTP_CODE = 200
|
10
11
|
|
11
|
-
|
12
|
-
|
12
|
+
attr_accessor :env
|
13
|
+
attr_reader :action, :params, :request
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
def self.before_action(*methods)
|
16
|
+
define_method :before_action do
|
17
|
+
methods.each { |method| send(method) }
|
18
|
+
end
|
17
19
|
end
|
18
|
-
end
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
def initialize(env, params, request)
|
22
|
+
@env = env
|
23
|
+
@params = params
|
24
|
+
@request = request
|
25
|
+
end
|
25
26
|
|
26
|
-
|
27
|
-
|
27
|
+
def resolve(action)
|
28
|
+
before_action if respond_to?(:before_action)
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
|
30
|
+
@action = action
|
31
|
+
send(action)
|
32
|
+
end
|
32
33
|
|
33
|
-
|
34
|
-
|
34
|
+
def render(code: DEFAULT_HTTP_CODE, headers: {}, body: nil, layout: DEFAULT_LAYOUT, template: nil)
|
35
|
+
return [code, headers, [body]] unless body.nil?
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
37
|
+
body = prepare_body(layout, template || template_path(action))
|
38
|
+
[code, headers, [body]]
|
39
|
+
end
|
39
40
|
|
40
|
-
|
41
|
-
|
42
|
-
|
41
|
+
def head(code, headers: {})
|
42
|
+
[code, headers, []]
|
43
|
+
end
|
43
44
|
|
44
|
-
|
45
|
-
|
46
|
-
|
45
|
+
def request_params
|
46
|
+
return @request_params if defined?(@request_params)
|
47
|
+
return @request_params = {} if request.body.nil?
|
47
48
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
49
|
+
@request_params =
|
50
|
+
case request.content_type
|
51
|
+
when 'application/json' then JSON.parse(request.body.read).transform_keys(&:to_sym)
|
52
|
+
else request.params.transform_keys(&:to_sym)
|
53
|
+
end
|
54
|
+
end
|
54
55
|
|
55
|
-
|
56
|
-
|
57
|
-
|
56
|
+
def render_partial(name, options = {}, &block)
|
57
|
+
Slim::Template.new("#{name}.slim", options).render(self, &block)
|
58
|
+
end
|
58
59
|
|
59
|
-
|
60
|
+
private
|
60
61
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
62
|
+
def template_path(action)
|
63
|
+
path = self.class.to_s.delete_suffix('Controller').split('::').map(&:downcase).join('/')
|
64
|
+
"./app/views/#{path}/#{action}.slim"
|
65
|
+
end
|
65
66
|
|
66
|
-
|
67
|
-
|
67
|
+
def prepare_body(layout, template)
|
68
|
+
return Slim::Template.new(template).render(self) if layout.nil?
|
68
69
|
|
69
|
-
|
70
|
-
|
70
|
+
Slim::Template.new(layout).render(self) do
|
71
|
+
Slim::Template.new(template).render(self)
|
72
|
+
end
|
71
73
|
end
|
72
74
|
end
|
73
75
|
end
|