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.
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