ezframe 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/asset/css/materialize.min.css +13 -0
  4. data/asset/css/style.css +3 -0
  5. data/{app_template/asset/image/favicon.ico → asset/image/c_e.ico} +0 -0
  6. data/{app_template/asset → asset}/js/ezframe.js +29 -59
  7. data/asset/js/materialize.min.js +6 -0
  8. data/asset/js/mymaterialize.js +38 -0
  9. data/exe/console +2 -2
  10. data/exe/{create_table.rb → create_table} +0 -0
  11. data/exe/dbmigrate +67 -0
  12. data/ezframe.gemspec +3 -0
  13. data/lib/ezframe/auth.rb +7 -2
  14. data/lib/ezframe/column_set.rb +30 -14
  15. data/lib/ezframe/column_type.rb +207 -67
  16. data/lib/ezframe/config.rb +5 -1
  17. data/lib/ezframe/controller.rb +34 -34
  18. data/lib/ezframe/database.rb +2 -2
  19. data/lib/ezframe/editor.rb +41 -41
  20. data/lib/ezframe/email.rb +34 -0
  21. data/lib/ezframe/ht.rb +20 -0
  22. data/lib/ezframe/html.rb +22 -14
  23. data/lib/ezframe/japanese_utils.rb +5 -0
  24. data/lib/ezframe/loader.rb +2 -2
  25. data/lib/ezframe/materialize.rb +3 -4
  26. data/lib/ezframe/message.rb +46 -0
  27. data/lib/ezframe/model.rb +0 -1
  28. data/lib/ezframe/page_base.rb +53 -67
  29. data/lib/ezframe/route.rb +122 -0
  30. data/lib/ezframe/server.rb +1 -1
  31. data/lib/ezframe/template.rb +3 -2
  32. data/lib/ezframe/util.rb +36 -16
  33. data/lib/ezframe/version.rb +1 -1
  34. data/lib/ezframe.rb +2 -1
  35. metadata +57 -14
  36. data/.rubocop.yml +0 -44
  37. data/app_template/config/generic.yml +0 -3
  38. data/app_template/config/materialize.yml +0 -5
  39. data/app_template/config.ru +0 -10
  40. data/app_template/pages/basic.rb +0 -5
  41. data/exe/setup.rb +0 -15
  42. 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
@@ -5,7 +5,7 @@ module Ezframe
5
5
  def self.call(env)
6
6
  req = Rack::Request.new(env)
7
7
  res = Rack::Response.new
8
- Boot.exec(req, res)
8
+ Controller.exec(req, res)
9
9
  if res.body.empty?
10
10
  raise "no body in response"
11
11
  end
@@ -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(/\#\{(.*)\}/) do
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 Util
2
- def self.add_comma(value)
3
- value.to_s.reverse.gsub(/(\d{3})/) { "#{$1}," }.reverse
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 klass.is_a?(Array)
41
- klass.each {|k| add_class(k) }
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
- def multi_div(class_a, child)
79
- class_a.reverse.each do |klass|
80
- child = { tag: "div", class: klass, child: child }
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.open("log/mylog.log", "a"){|f| f.puts "#{Time.now}:[#{$$}]:#{msg}" }
108
+ if File.exist?("log")
109
+ File.open("log/mylog.log", "a"){|f| f.puts "#{Time.now}:[#{$$}]:#{msg}" }
110
+ end
91
111
  end
@@ -1,3 +1,3 @@
1
1
  module Ezframe
2
- VERSION = "0.0.4"
2
+ VERSION = "0.1.0"
3
3
  end
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
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-01-24 00:00:00.000000000 Z
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.rb
131
- - setup.rb
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
- - app_template/asset/image/favicon.ico
140
- - app_template/asset/js/ezframe.js
141
- - app_template/config.ru
142
- - app_template/config/generic.yml
143
- - app_template/config/materialize.yml
144
- - app_template/pages/basic.rb
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.rb
147
- - exe/setup.rb
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/page_kit.rb
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
@@ -1,3 +0,0 @@
1
- default_page_class: BasicPages
2
- template_file: base.html
3
- favicon: /image/favicon.ico
@@ -1,5 +0,0 @@
1
- extra_js_list:
2
- - https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js
3
- extra_css_list:
4
- - https://fonts.googleapis.com/icon?family=Material+Icons
5
- - https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "logger"
4
- require "rack"
5
- require "ezframe"
6
-
7
- use Rack::Session::Pool
8
- use Rack::Static, urls: ["/image", "/js", "/css"], root: "asset"
9
- use Rack::ShowExceptions
10
- run Ezframe::Server
@@ -1,5 +0,0 @@
1
- class BasicPages < Ezframe::PageBase
2
- def public_default_page
3
- return "<H1>Ezframe is working.</H1>"
4
- end
5
- end
data/exe/setup.rb DELETED
@@ -1,15 +0,0 @@
1
- #!/usr/bin/env ruby
2
- #coding: utf-8
3
- =begin
4
-
5
- アプリケーションテンプレートの生成
6
-
7
- =end
8
- require "fileutils"
9
-
10
- target_dir = ARGV[0]
11
-
12
- unless File.exist?(target_dir)
13
- Dir.mkdir(target_dir)
14
- end
15
- FileUtils.cp_r("app_template", target_dir)
@@ -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