ezframe 0.0.4 → 0.1.0
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/README.md +1 -1
- data/asset/css/materialize.min.css +13 -0
- data/asset/css/style.css +3 -0
- data/{app_template/asset/image/favicon.ico → asset/image/c_e.ico} +0 -0
- data/{app_template/asset → asset}/js/ezframe.js +29 -59
- data/asset/js/materialize.min.js +6 -0
- data/asset/js/mymaterialize.js +38 -0
- data/exe/console +2 -2
- data/exe/{create_table.rb → create_table} +0 -0
- data/exe/dbmigrate +67 -0
- data/ezframe.gemspec +3 -0
- data/lib/ezframe/auth.rb +7 -2
- data/lib/ezframe/column_set.rb +30 -14
- data/lib/ezframe/column_type.rb +207 -67
- data/lib/ezframe/config.rb +5 -1
- data/lib/ezframe/controller.rb +34 -34
- data/lib/ezframe/database.rb +2 -2
- data/lib/ezframe/editor.rb +41 -41
- data/lib/ezframe/email.rb +34 -0
- data/lib/ezframe/ht.rb +20 -0
- data/lib/ezframe/html.rb +22 -14
- data/lib/ezframe/japanese_utils.rb +5 -0
- data/lib/ezframe/loader.rb +2 -2
- data/lib/ezframe/materialize.rb +3 -4
- data/lib/ezframe/message.rb +46 -0
- data/lib/ezframe/model.rb +0 -1
- data/lib/ezframe/page_base.rb +53 -67
- data/lib/ezframe/route.rb +122 -0
- data/lib/ezframe/server.rb +1 -1
- data/lib/ezframe/template.rb +3 -2
- data/lib/ezframe/util.rb +36 -16
- data/lib/ezframe/version.rb +1 -1
- data/lib/ezframe.rb +2 -1
- metadata +57 -14
- data/.rubocop.yml +0 -44
- data/app_template/config/generic.yml +0 -3
- data/app_template/config/materialize.yml +0 -5
- data/app_template/config.ru +0 -10
- data/app_template/pages/basic.rb +0 -5
- data/exe/setup.rb +0 -15
- data/lib/ezframe/page_kit.rb +0 -63
@@ -0,0 +1,122 @@
|
|
1
|
+
module Ezframe
|
2
|
+
class Route
|
3
|
+
class << self
|
4
|
+
def choose(request, route_h = nil)
|
5
|
+
path_parts = request.path_info.split("/").drop(1)
|
6
|
+
route_h ||= Config[:route].deep_dup
|
7
|
+
# puts "config=#{Config[:route]}, route_h=#{route_h}"
|
8
|
+
args = {}
|
9
|
+
class_a = []
|
10
|
+
# p path_parts
|
11
|
+
if path_parts.empty?
|
12
|
+
root_conf = route_h[:/]
|
13
|
+
# p root_conf
|
14
|
+
if root_conf
|
15
|
+
klass = get_class(root_conf[:class])
|
16
|
+
return [ klass.new, make_method_name("default", request.request_method) ]
|
17
|
+
end
|
18
|
+
return [ 404 ]
|
19
|
+
end
|
20
|
+
# URLを解析して、クラスの決定とIDの取得を行う
|
21
|
+
while path_parts.length > 0
|
22
|
+
part = path_parts.shift
|
23
|
+
# break if part.empty?
|
24
|
+
# mylog "part=#{part}, route_h=#{route_h.inspect}"
|
25
|
+
if route_h.has_key?(part.to_sym)
|
26
|
+
# mylog "has_route: #{part}"
|
27
|
+
class_a.push(part)
|
28
|
+
if path_parts[0].to_i > 0
|
29
|
+
args[part.to_sym] = val = path_parts.shift
|
30
|
+
# mylog "value: part=#{part}, val=#{val}"
|
31
|
+
end
|
32
|
+
route_h = route_h[part.to_sym]
|
33
|
+
break if route_h.nil?
|
34
|
+
# mylog "route_h changed: #{route_h}"
|
35
|
+
else
|
36
|
+
# routeに無ければ、メソッドを探す
|
37
|
+
# mylog "no_route: #{part}"
|
38
|
+
klass = get_class(class_a[-1])
|
39
|
+
return [ 404 ] unless klass
|
40
|
+
instance = klass.new
|
41
|
+
method_name = make_method_name(part, request.request_method)
|
42
|
+
if instance.respond_to?(method_name)
|
43
|
+
return [instance, method_name, args]
|
44
|
+
else
|
45
|
+
mylog "undefined method: #{klass}.#{method_name}: full path=#{request.path_info}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
# 最後にメソッド名が無い場合はpublic_default_#{method}を実行。
|
50
|
+
#puts "class_a=#{class_a}"
|
51
|
+
klass = get_class(class_a[-1])
|
52
|
+
return [404] unless klass
|
53
|
+
if path_parts.length > 0
|
54
|
+
part = path_parts.shift
|
55
|
+
else
|
56
|
+
part = "default"
|
57
|
+
end
|
58
|
+
method_name = make_method_name(part, request.request_method)
|
59
|
+
#mylog "method_name=#{method_name}"
|
60
|
+
instance = klass.new
|
61
|
+
if instance.respond_to?(method_name)
|
62
|
+
return [instance, method_name, args]
|
63
|
+
end
|
64
|
+
return [ 404 ]
|
65
|
+
end
|
66
|
+
|
67
|
+
# ページクラスの階層を辿る
|
68
|
+
def get_path(class_snake, route_h = nil)
|
69
|
+
route_h = Config[:route] unless route_h
|
70
|
+
@get_path_found_it = nil
|
71
|
+
return scan_hash(class_snake, route_h.deep_dup).reverse
|
72
|
+
end
|
73
|
+
|
74
|
+
# targetに対応する名称のクラスまでの経路を返す
|
75
|
+
def scan_hash(target, hash)
|
76
|
+
if hash.keys.include?(target)
|
77
|
+
@get_path_found_it = true
|
78
|
+
return [ target ]
|
79
|
+
else
|
80
|
+
hash.each do |k, v|
|
81
|
+
if v.is_a?(Hash)
|
82
|
+
a = scan_hash(target, v)
|
83
|
+
if @get_path_found_it
|
84
|
+
a.push(k)
|
85
|
+
return a
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def make_method_name(base_name, method = "get")
|
93
|
+
return ["public", base_name, method.downcase].join("_")
|
94
|
+
end
|
95
|
+
|
96
|
+
def get_class(keys)
|
97
|
+
mylog "get_class: #{keys.inspect}"
|
98
|
+
return nil unless keys
|
99
|
+
keys = [ keys ] if keys.is_a?(String)
|
100
|
+
klass = (%w[Ezframe] + keys.map { |k| k.to_camel }).join("::")
|
101
|
+
# mylog "get_class: #{klass}"
|
102
|
+
if Object.const_defined?(klass)
|
103
|
+
return Object.const_get(klass)
|
104
|
+
else
|
105
|
+
raise "get_class: undefined class: #{klass}"
|
106
|
+
end
|
107
|
+
return nil
|
108
|
+
end
|
109
|
+
|
110
|
+
def find_file(target)
|
111
|
+
Find.find("./asset").each do |file|
|
112
|
+
path_a = file.split("/")
|
113
|
+
if path_a[-1] == target
|
114
|
+
suffix = "." + target.split(".")[-1]
|
115
|
+
return [200, { "Content-Type" => Rack::Mime.mime_type(suffix) }, [File.open(file, &:read)]]
|
116
|
+
end
|
117
|
+
end
|
118
|
+
return [ 404 ]
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
data/lib/ezframe/server.rb
CHANGED
data/lib/ezframe/template.rb
CHANGED
@@ -8,16 +8,17 @@ module Ezframe
|
|
8
8
|
unless File.exist?(filename)
|
9
9
|
raise "fill_template: file does not exist: #{filename}"
|
10
10
|
end
|
11
|
-
|
12
11
|
instr = File.open(filename, &:read)
|
13
12
|
return fill_in_text(instr, opts)
|
14
13
|
end
|
15
14
|
|
16
15
|
def fill_in_text(text, opts = {})
|
17
|
-
outstr = text.gsub(/\#\{(
|
16
|
+
outstr = text.gsub(/\#\{([^\}]+)\}/) do
|
18
17
|
keyword = $1
|
19
18
|
if opts[keyword.to_sym]
|
20
19
|
opts[keyword.to_sym]
|
20
|
+
elsif ENV[keyword]
|
21
|
+
ENV[keyword]
|
21
22
|
else
|
22
23
|
mylog "[WARN] no value for keyword: #{keyword}"
|
23
24
|
nil
|
data/lib/ezframe/util.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
|
-
class
|
2
|
-
def
|
3
|
-
|
1
|
+
class Integer
|
2
|
+
def to_sym
|
3
|
+
return self.to_s.to_sym
|
4
|
+
end
|
5
|
+
|
6
|
+
def add_comma
|
7
|
+
return self.to_s.reverse.gsub(/(\d{3})(\d)/) { "#{$1},#{$2}" }.reverse
|
4
8
|
end
|
5
9
|
end
|
6
10
|
|
@@ -30,6 +34,10 @@ class Hash
|
|
30
34
|
|
31
35
|
def add_class(klass)
|
32
36
|
return unless klass
|
37
|
+
if klass.is_a?(Array)
|
38
|
+
klass.each {|k| add_class(k) }
|
39
|
+
return
|
40
|
+
end
|
33
41
|
c = self[:class]
|
34
42
|
if !c
|
35
43
|
self[:class] = c = []
|
@@ -37,12 +45,8 @@ class Hash
|
|
37
45
|
a = [ c ]
|
38
46
|
self[:class] = c = a
|
39
47
|
end
|
40
|
-
if
|
41
|
-
|
42
|
-
else
|
43
|
-
return if c.include?(klass)
|
44
|
-
c.push(klass)
|
45
|
-
end
|
48
|
+
return if c.include?(klass)
|
49
|
+
c.push(klass)
|
46
50
|
end
|
47
51
|
|
48
52
|
def remove_class(klass)
|
@@ -75,17 +79,33 @@ class Object
|
|
75
79
|
end
|
76
80
|
end
|
77
81
|
|
78
|
-
|
79
|
-
|
80
|
-
|
82
|
+
class Time
|
83
|
+
def to_date_key
|
84
|
+
return "%d-%02d-%02d"%[ self.year, self.mon, self.mday ]
|
81
85
|
end
|
82
|
-
return child
|
83
86
|
end
|
84
87
|
|
88
|
+
# クラス名をsnake caseにする。
|
89
|
+
def class_to_snake(class_name)
|
90
|
+
return nil unless class_name
|
91
|
+
class_name = class_name.to_s
|
92
|
+
if class_name.index("::")
|
93
|
+
return class_name.split("::")[-1].to_snake.to_sym
|
94
|
+
else
|
95
|
+
return class_name.to_snake.to_sym
|
96
|
+
end
|
97
|
+
end
|
85
98
|
|
86
|
-
|
87
|
-
|
99
|
+
# URLのオプションを解析
|
100
|
+
def parse_query_string(str)
|
101
|
+
query_a = URI::decode_www_form(str)
|
102
|
+
res_h = {}
|
103
|
+
query_a.map { |a| res_h[a[0].to_sym] = a[1] }
|
104
|
+
return res_h
|
105
|
+
end
|
88
106
|
|
89
107
|
def mylog(msg)
|
90
|
-
File.
|
108
|
+
if File.exist?("log")
|
109
|
+
File.open("log/mylog.log", "a"){|f| f.puts "#{Time.now}:[#{$$}]:#{msg}" }
|
110
|
+
end
|
91
111
|
end
|
data/lib/ezframe/version.rb
CHANGED
data/lib/ezframe.rb
CHANGED
@@ -17,13 +17,14 @@ require_relative 'ezframe/ht'
|
|
17
17
|
require_relative 'ezframe/html'
|
18
18
|
require_relative 'ezframe/materialize'
|
19
19
|
require_relative 'ezframe/model'
|
20
|
-
require_relative 'ezframe/page_kit'
|
21
20
|
require_relative 'ezframe/page_base'
|
22
21
|
require_relative 'ezframe/template'
|
23
22
|
require_relative 'ezframe/server'
|
23
|
+
require_relative 'ezframe/message'
|
24
24
|
require_relative 'ezframe/auth.rb'
|
25
25
|
require_relative 'ezframe/editor.rb'
|
26
26
|
require_relative 'ezframe/loader'
|
27
|
+
require_relative 'ezframe/route'
|
27
28
|
|
28
29
|
|
29
30
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ezframe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- KAMACHI Masayuki
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-02-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,6 +66,34 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 1.1.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.12.2
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.12.2
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: mailcatcher
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.7.1
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.7.1
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
98
|
name: rake
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,29 +150,42 @@ dependencies:
|
|
122
150
|
- - "~>"
|
123
151
|
- !ruby/object:Gem::Version
|
124
152
|
version: 1.4.0
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: oj
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 3.10.2
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 3.10.2
|
125
167
|
description: easy web framework
|
126
168
|
email:
|
127
169
|
- kamachi@sakuraforest.co.jp
|
128
170
|
executables:
|
129
171
|
- console
|
130
|
-
- create_table
|
131
|
-
-
|
172
|
+
- create_table
|
173
|
+
- dbmigrate
|
132
174
|
extensions: []
|
133
175
|
extra_rdoc_files: []
|
134
176
|
files:
|
135
177
|
- ".gitignore"
|
136
|
-
- ".rubocop.yml"
|
137
178
|
- README.md
|
138
179
|
- Rakefile
|
139
|
-
-
|
140
|
-
-
|
141
|
-
-
|
142
|
-
-
|
143
|
-
-
|
144
|
-
-
|
180
|
+
- asset/css/materialize.min.css
|
181
|
+
- asset/css/style.css
|
182
|
+
- asset/image/c_e.ico
|
183
|
+
- asset/js/ezframe.js
|
184
|
+
- asset/js/materialize.min.js
|
185
|
+
- asset/js/mymaterialize.js
|
145
186
|
- exe/console
|
146
|
-
- exe/create_table
|
147
|
-
- exe/
|
187
|
+
- exe/create_table
|
188
|
+
- exe/dbmigrate
|
148
189
|
- ezframe.gemspec
|
149
190
|
- lib/ezframe.rb
|
150
191
|
- lib/ezframe/auth.rb
|
@@ -154,14 +195,16 @@ files:
|
|
154
195
|
- lib/ezframe/controller.rb
|
155
196
|
- lib/ezframe/database.rb
|
156
197
|
- lib/ezframe/editor.rb
|
198
|
+
- lib/ezframe/email.rb
|
157
199
|
- lib/ezframe/ht.rb
|
158
200
|
- lib/ezframe/html.rb
|
159
201
|
- lib/ezframe/japanese_utils.rb
|
160
202
|
- lib/ezframe/loader.rb
|
161
203
|
- lib/ezframe/materialize.rb
|
204
|
+
- lib/ezframe/message.rb
|
162
205
|
- lib/ezframe/model.rb
|
163
206
|
- lib/ezframe/page_base.rb
|
164
|
-
- lib/ezframe/
|
207
|
+
- lib/ezframe/route.rb
|
165
208
|
- lib/ezframe/server.rb
|
166
209
|
- lib/ezframe/template.rb
|
167
210
|
- lib/ezframe/util.rb
|
data/.rubocop.yml
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
AllCops:
|
2
|
-
TargetRubyVersion: 2.6
|
3
|
-
DisabledByDefault: true
|
4
|
-
Exclude:
|
5
|
-
- '**/vendor/**/*'
|
6
|
-
|
7
|
-
Style/FrozenStringLiteralComment:
|
8
|
-
Enabled: true
|
9
|
-
EnforcedStyle: always
|
10
|
-
|
11
|
-
# Use Ruby >= 1.9 syntax for hashes. Prefer { a: :b } over { :a => :b }.
|
12
|
-
Style/HashSyntax:
|
13
|
-
Enabled: true
|
14
|
-
|
15
|
-
Layout/EmptyLineAfterMagicComment:
|
16
|
-
Enabled: true
|
17
|
-
|
18
|
-
Layout/LeadingCommentSpace:
|
19
|
-
Enabled: true
|
20
|
-
|
21
|
-
Layout/SpaceAfterColon:
|
22
|
-
Enabled: true
|
23
|
-
|
24
|
-
Layout/SpaceAfterComma:
|
25
|
-
Enabled: true
|
26
|
-
|
27
|
-
Layout/SpaceAroundEqualsInParameterDefault:
|
28
|
-
Enabled: true
|
29
|
-
|
30
|
-
Layout/SpaceAroundKeyword:
|
31
|
-
Enabled: true
|
32
|
-
|
33
|
-
Layout/SpaceAroundOperators:
|
34
|
-
Enabled: true
|
35
|
-
|
36
|
-
Layout/SpaceBeforeComma:
|
37
|
-
Enabled: true
|
38
|
-
|
39
|
-
Layout/SpaceBeforeFirstArg:
|
40
|
-
Enabled: true
|
41
|
-
|
42
|
-
# Use `{ a: 1 }` not `{a:1}`.
|
43
|
-
Layout/SpaceInsideHashLiteralBraces:
|
44
|
-
Enabled: true
|
data/app_template/config.ru
DELETED
data/app_template/pages/basic.rb
DELETED
data/exe/setup.rb
DELETED
data/lib/ezframe/page_kit.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Ezframe
|
4
|
-
module PageKit
|
5
|
-
class IndexTable
|
6
|
-
def initialize(attr = {})
|
7
|
-
@attribute = attr
|
8
|
-
end
|
9
|
-
|
10
|
-
def make_table(row_a)
|
11
|
-
column_set = @attribute[:column_set]
|
12
|
-
table_a = row_a.map do |row_h|
|
13
|
-
column_set.values = row_h
|
14
|
-
id = column_set[:id].value
|
15
|
-
value_a = (@attribute[:column_header]||[]).map do |key|
|
16
|
-
col = column_set[key]
|
17
|
-
unless col
|
18
|
-
mylog "undefined key: #{key}"
|
19
|
-
next
|
20
|
-
end
|
21
|
-
checkbox_key = @attribute[:add_checkbox]
|
22
|
-
if checkbox_key && key == checkbox_key
|
23
|
-
text = add_checkbox(col)
|
24
|
-
else
|
25
|
-
text = col.view
|
26
|
-
end
|
27
|
-
deco = @attribute[:decorate_column]
|
28
|
-
if deco
|
29
|
-
text = deco.call(key, id, text)
|
30
|
-
# mylog "deco: #{text}"
|
31
|
-
end
|
32
|
-
Ht.td(child: text)
|
33
|
-
end
|
34
|
-
tr = Ht.tr(child: value_a)
|
35
|
-
if @attribute[:onclick_rows]
|
36
|
-
tr[:id] = elem_id = "tr_#{id}"
|
37
|
-
end
|
38
|
-
tr
|
39
|
-
end
|
40
|
-
Ht.table(child: [make_header, table_a])
|
41
|
-
end
|
42
|
-
|
43
|
-
def add_checkbox(col)
|
44
|
-
Ht.checkbox(name: "checkbox_#{col.key}_#{col.value}", value: col.value, label: col.view)
|
45
|
-
end
|
46
|
-
|
47
|
-
def make_header
|
48
|
-
column_set = @attribute[:column_set]
|
49
|
-
th_a = (@attribute[:column_header]||[]).map do |key|
|
50
|
-
col = column_set[key]
|
51
|
-
if col
|
52
|
-
Ht.th(child: col.label)
|
53
|
-
else
|
54
|
-
nil
|
55
|
-
end
|
56
|
-
end
|
57
|
-
if @attribute[:add_checkbox]
|
58
|
-
end
|
59
|
-
Ht.tr(child: th_a)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|