ezframe 0.0.1 → 0.0.3

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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/README.md +11 -4
  4. data/app_template/asset/image/favicon.ico +0 -0
  5. data/app_template/asset/js/ezframe.js +288 -0
  6. data/app_template/config/generic.yml +3 -0
  7. data/app_template/config/materialize.yml +5 -0
  8. data/{example/chat → app_template}/config.ru +2 -10
  9. data/app_template/pages/basic.rb +5 -0
  10. data/exe/create_table.rb +1 -0
  11. data/exe/setup.rb +15 -0
  12. data/ezframe.gemspec +3 -4
  13. data/lib/ezframe/auth.rb +15 -12
  14. data/lib/ezframe/column_set.rb +68 -28
  15. data/lib/ezframe/column_type.rb +231 -68
  16. data/lib/ezframe/config.rb +4 -0
  17. data/lib/ezframe/controller.rb +20 -10
  18. data/lib/ezframe/database.rb +10 -3
  19. data/lib/ezframe/ht.rb +167 -0
  20. data/lib/ezframe/html.rb +28 -4
  21. data/lib/ezframe/japanese_utils.rb +40 -0
  22. data/lib/ezframe/{pages.rb → loader.rb} +3 -0
  23. data/lib/ezframe/materialize.rb +55 -20
  24. data/lib/ezframe/model.rb +0 -2
  25. data/lib/ezframe/page_base.rb +18 -12
  26. data/lib/ezframe/page_kit.rb +12 -33
  27. data/lib/ezframe/template.rb +20 -15
  28. data/lib/ezframe/util.rb +5 -0
  29. data/lib/ezframe/version.rb +1 -1
  30. data/lib/ezframe.rb +5 -4
  31. metadata +27 -70
  32. data/example/auth/Gemfile +0 -8
  33. data/example/auth/asset/css/materialize.min.css +0 -13
  34. data/example/auth/asset/js/common.js +0 -200
  35. data/example/auth/asset/js/htmlgen.js +0 -79
  36. data/example/auth/columns/user.yml +0 -12
  37. data/example/auth/config/view_conf.yml +0 -3
  38. data/example/auth/config.ru +0 -26
  39. data/example/auth/pages/app.rb +0 -61
  40. data/example/auth/template/base.html +0 -12
  41. data/example/chat/Gemfile +0 -9
  42. data/example/chat/asset/css/materialize.min.css +0 -13
  43. data/example/chat/asset/js/common.js +0 -200
  44. data/example/chat/asset/js/htmlgen.js +0 -79
  45. data/example/chat/columns/belong.yml +0 -6
  46. data/example/chat/columns/channel.yml +0 -3
  47. data/example/chat/columns/talk.yml +0 -6
  48. data/example/chat/columns/user.yml +0 -12
  49. data/example/chat/config/view_conf.yml +0 -3
  50. data/example/chat/pages/app.rb +0 -59
  51. data/example/chat/template/base.html +0 -12
  52. data/example/todo/Gemfile +0 -8
  53. data/example/todo/asset/css/datatable.css +0 -54
  54. data/example/todo/asset/css/materialize.min.css +0 -13
  55. data/example/todo/asset/js/common.js +0 -135
  56. data/example/todo/asset/js/datatable.js +0 -1814
  57. data/example/todo/asset/js/htmlgen.js +0 -79
  58. data/example/todo/asset/js/init.js +0 -3
  59. data/example/todo/asset/js/materialize.min.js +0 -6
  60. data/example/todo/asset/js/mydatatable.js +0 -9
  61. data/example/todo/asset/js/mymaterialize.js +0 -22
  62. data/example/todo/columns/todo.yml +0 -9
  63. data/example/todo/config/view_conf.yml +0 -3
  64. data/example/todo/config.ru +0 -15
  65. data/example/todo/pages/app.rb +0 -93
  66. data/example/todo/template/base.html +0 -12
  67. data/exe/myrackup +0 -5
  68. data/lib/ezframe/hthash.rb +0 -116
data/lib/ezframe/html.rb CHANGED
@@ -11,16 +11,18 @@ module Ezframe
11
11
 
12
12
  tag = ht_h[:tag]
13
13
  case tag
14
+ when "input"
15
+ input(ht_h)
14
16
  when "select"
15
17
  return select(ht_h) if ht_h[:items]
16
18
  when "icon"
17
19
  tag = "i"
18
20
  end
19
21
  opt_s, child_s = join_attributes(ht_h)
20
- if child_s.length.positive?
21
- return "<#{tag} #{opt_s}>\n#{child_s}\n</#{tag}>\n"
22
+ if child_s.length >= 0
23
+ return "<#{ht_h[:tag]} #{opt_s}>\n#{child_s}\n</#{ht_h[:tag]}>\n"
22
24
  end
23
- "<#{tag} #{opt_s}/>"
25
+ "<#{ht_h[:tag]} #{opt_s}/>"
24
26
  end
25
27
 
26
28
  def join_attributes(attrs)
@@ -48,9 +50,24 @@ module Ezframe
48
50
  [opt_a.compact.join(" "), child_s]
49
51
  end
50
52
 
53
+ def input(ht_h)
54
+ size = ht_h[:size]
55
+ # puts "input: size=#{size.inspect}"
56
+ if size && (size.index("x") || size.index("*"))
57
+ if /(\d+)\s*[x\*]\s*(\d+)/ =~ size
58
+ ht_h[:cols], ht_h[:rows] = $1, $2
59
+ end
60
+ ht_h[:tag] = "textarea"
61
+ ht_h[:child] = ht_h[:value]
62
+ ht_h.delete(:value)
63
+ p ht_h
64
+ end
65
+ end
66
+
51
67
  def select(ht_h = {})
52
68
  attr = ht_h.clone
53
69
  items = attr[:items]
70
+ # puts "Html.select: #{items}"
54
71
  if items.is_a?(Hash)
55
72
  option_a = ht_h[:items].map do |k, v|
56
73
  h = { tag: "option", value: k }
@@ -59,6 +76,9 @@ module Ezframe
59
76
  h[:selected] = "selected" if selected
60
77
  end
61
78
  h[:child] = v
79
+ if ht_h[:default] && ht_h[:default] == v
80
+ h[:selected] = "selected"
81
+ end
62
82
  h
63
83
  end
64
84
  elsif items.is_a?(Array)
@@ -67,6 +87,10 @@ module Ezframe
67
87
  if %w[selected default].include?(v[2])
68
88
  h[:selected] = "selected"
69
89
  end
90
+ if ht_h[:default] && ht_h[:default] == v
91
+ h[:selected] = "selected"
92
+ end
93
+ # puts h.inspect
70
94
  h
71
95
  end
72
96
  else
@@ -74,7 +98,7 @@ module Ezframe
74
98
  end
75
99
  attr[:tag] = "select"
76
100
  attr[:child] = option_a
77
- attr[:name] = attr[:key]
101
+ attr[:name] ||= attr[:key]
78
102
  attr[:final] = true
79
103
  attr.delete(:items)
80
104
  Html.convert(attr)
@@ -0,0 +1,40 @@
1
+ class Japanese
2
+ class << self
3
+ def convert_wareki(year)
4
+ [
5
+ ["令和", 2019],
6
+ ["平成", 1989],
7
+ ["昭和", 1926],
8
+ ["大正", 1912],
9
+ ["明治", 1868],
10
+ ].each do |a|
11
+ gengo, start_at = a
12
+ wareki = year - start_at + 1
13
+ if wareki > 0
14
+ wareki = "元" if wareki == 1
15
+ return "#{gengo}#{wareki}"
16
+ end
17
+ end
18
+ end
19
+
20
+ def is_katakana?(str)
21
+ return nil if !str || str.empty?
22
+ return /^[ァ-ン\-ー―−]+$/ =~ str
23
+ end
24
+
25
+ def is_hiragana?(str)
26
+ return nil if !str || str.empty?
27
+ return /^[ぁ-ん\-ー―−]+$/ =~ str
28
+ end
29
+
30
+ def to_hiragana(str)
31
+ return nil if !str
32
+ return str.tr("ァ-ン\-ー―−", "ぁ-ん\-ー―−")
33
+ end
34
+
35
+ def to_katakana(str)
36
+ return nil if !str
37
+ return str.tr("ぁ-ん\-ー―−", "ァ-ン\-ー―−")
38
+ end
39
+ end
40
+ end
@@ -3,6 +3,9 @@
3
3
  if File.exist?("pages/common.rb")
4
4
  require "#{Dir.pwd}/pages/common.rb"
5
5
  end
6
+ Dir["models/*.rb"].each do |file|
7
+ require "#{Dir.pwd}/#{file}"
8
+ end
6
9
  Dir["pages/*.rb"].each do |file|
7
10
  require "#{Dir.pwd}/#{file}"
8
11
  end
@@ -4,32 +4,25 @@ module Ezframe
4
4
  class Materialize
5
5
  class << self
6
6
  def into_html_header
7
- str =<<~EOHEAD2
8
- <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
9
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
10
- <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
11
- EOHEAD2
7
+
8
+ css_a = Config[:extra_css_list].map {|file| "<link href=\"#{file}\" rel=\"stylesheet\">\n" }
9
+ js_a = Config[:extra_js_list].map {|file| "<script src=\"#{file}\"></script>\n" }
12
10
 
13
11
  css_files = Dir["./asset/css/*.css"]||[]
14
- css_a = css_files.map do |file|
12
+ css_a += css_files.map do |file|
15
13
  file.gsub!("./asset", "")
16
14
  "<link href=\"#{file}\" rel=\"stylesheet\">\n"
17
15
  end
18
16
  js_files = Dir["./asset/js/*.js"]||[]
19
- js_a = js_files.map do |file|
17
+ js_a += js_files.map do |file|
20
18
  file.gsub!("./asset", "")
21
19
  "<script src=\"#{file}\"></script>\n"
22
20
  end
23
- str+(css_a+js_a).join
21
+ (css_a+js_a).join
24
22
  end
25
23
 
26
24
  def into_bottom_of_body
27
25
  ""
28
- # Dir["./asset/js"].each do ||
29
- # <<~EOBOT
30
- # <script src="/js/htmlgen.js"></script>
31
- # <script src="/js/common.js"></script>
32
- # EOBOT
33
26
  end
34
27
 
35
28
  def convert(ht_h)
@@ -39,10 +32,14 @@ module Ezframe
39
32
  if ht_h.kind_of?(Array)
40
33
  new_h = ht_h.map { |v| convert(v) }
41
34
  elsif ht_h.kind_of?(Hash)
35
+ unless ht_h[:tag]
36
+ mylog("convert: no tag: #{ht_h.inspect}")
37
+ return nil
38
+ end
42
39
  case ht_h[:tag].to_sym
43
- when :input, :select
44
- new_h = input(ht_h) if "hidden" != ht_h[:type]
45
- return new_h
40
+ # when :input, :select
41
+ # new_h = input(ht_h) if "hidden" != ht_h[:type]
42
+ # return new_h
46
43
  when :checkbox
47
44
  return checkbox(ht_h)
48
45
  when :radio
@@ -75,10 +72,10 @@ module Ezframe
75
72
  end
76
73
 
77
74
  def input(ht_h)
78
- ht_h[:name] ||= ht_h[:key]
75
+ ht_h[:tag] = "input"
79
76
  width_s = "s#{ht_h[:width_s] || 12}"
80
77
  ht_h.delete(:witdth_s)
81
- label = Ht.label(for: ht_h[:key], child: ht_h[:label], final: true )
78
+ label = Ht.label(class: %w[active], for: ht_h[:name], child: ht_h[:label], final: true )
82
79
  cls = ["input-field", "col", width_s]
83
80
  new_h = Ht.div(class: cls, child: [ht_h, label])
84
81
  new_h = Ht.div(child: new_h, class: "row")
@@ -88,13 +85,13 @@ module Ezframe
88
85
  def checkbox(ht_h)
89
86
  ht_h[:tag] = "input"
90
87
  ht_h[:type] = "checkbox"
91
- Ht.label(child: [ht_h, { tag: "span", child: ht_h[:value] }])
88
+ return Ht.label(child: [ht_h, { tag: "span", child: ht_h[:value] }])
92
89
  end
93
90
 
94
91
  def radio(ht_h)
95
92
  ht_h[:tag] = "input"
96
93
  ht_h[:type] = "radio"
97
- Ht.label(child: [ht_h, { tag: "span", child: ht_h[:label] }])
94
+ return Ht.label(child: [ht_h, { tag: "span", child: ht_h[:label] }])
98
95
  end
99
96
 
100
97
  def add_sibling(dest, elem)
@@ -104,6 +101,44 @@ module Ezframe
104
101
  [dest, elem]
105
102
  end
106
103
  end
104
+
105
+ def loading
106
+ Ht.div(class: %w[preloader-wrapper big active], child:
107
+ Ht.div(class: %w[spinner-layer spinner-green], child: [
108
+ Ht.multi_div([%w[circle-clipper left], %w[circle]], ""),
109
+ Ht.multi_div([%w[gap-patch], %w[circle]], ""),
110
+ Ht.multi_div([%w[circle-clipper right], %w[circle]], "")
111
+ ]))
112
+ end
113
+ end
114
+
115
+ class Collection < Array
116
+ def to_h
117
+ list = self.map do |line|
118
+ Ht.li(class: %w[collection-item], child: line)
119
+ end
120
+ return Ht.ul(class: %w[collection], child: list)
121
+ end
122
+ end
123
+
124
+ class Tab
125
+ def self.base_layout(link_list)
126
+ size = 12 / link_list.length
127
+ tabs = link_list.map do |link|
128
+ Ht.li(class: ["tab", "s#{size}"], child: link)
129
+ end
130
+ Ht.multi_div([%w[row], %w[col s12]], Ht.ul(class: %w[tabs], child: tabs))
131
+ end
132
+ end
133
+
134
+ class Card
135
+ def self.base_layout(title: "", content: "")
136
+ Ht.multi_div([%w[row], %w[col s12], %w[card blue-grey darken-1], %w[card-content white-text]],
137
+ [
138
+ Ht.span(class: %w[card-title], child: title),
139
+ Ht.p(child: content),
140
+ ])
141
+ end
107
142
  end
108
143
  end
109
144
  end
data/lib/ezframe/model.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "singleton"
4
-
5
3
  module Ezframe
6
4
  class Model
7
5
  class << self
@@ -8,15 +8,6 @@ require_relative "util"
8
8
  module Ezframe
9
9
  class PageBase
10
10
  class << self
11
- def get_class(keys)
12
- keys = [keys] if keys.is_a?(String)
13
- klass = (%w[Ezframe] + keys.map { |k| k.to_camel }).join("::")
14
- if Object.const_defined?(klass)
15
- return Object.const_get(klass)
16
- end
17
- return nil
18
- end
19
-
20
11
  def decide_route(path_info)
21
12
  default_class = Config[:default_page_class]||"App"
22
13
  default_method = Config[:default_page_method]||"default"
@@ -25,11 +16,15 @@ module Ezframe
25
16
  when 0
26
17
  [get_class(default_class), default_method]
27
18
  when 1
19
+ filename = path_parts[0]
20
+ if filename.index(".")
21
+ return nil
22
+ end
28
23
  klass = get_class(path_parts)
29
24
  if klass
30
25
  return [klass, default_method]
31
26
  else
32
- return [get_class(default_class), parth_parts[0]]
27
+ return [get_class(default_class), path_parts[0]]
33
28
  end
34
29
  else
35
30
  klass = get_class(path_parts)
@@ -42,6 +37,16 @@ module Ezframe
42
37
  end
43
38
  end
44
39
  end
40
+
41
+ def get_class(keys)
42
+ keys = [keys] if keys.is_a?(String)
43
+ klass = (%w[Ezframe] + keys.map { |k| k.to_camel }).join("::")
44
+ mylog "get_class: #{klass}"
45
+ if Object.const_defined?(klass)
46
+ return Object.const_get(klass)
47
+ end
48
+ return nil
49
+ end
45
50
  end
46
51
 
47
52
  attr_accessor :auth
@@ -55,7 +60,8 @@ module Ezframe
55
60
  mylog "params=#{@params.inspect}" if @params.length > 0
56
61
  @id, @key = @params[:id], @params[:key]
57
62
  @env = @request.env
58
- @session = @env["rack.x-session"]
63
+ @session = @env["rack.session"]
64
+ mylog "session = #{@session.inspect}"
59
65
  if request.post?
60
66
  parse_json_body
61
67
  mylog "json=#{@json.inspect}"
@@ -78,7 +84,7 @@ module Ezframe
78
84
  into_html_header: Materialize.into_html_header,
79
85
  into_bottom_of_body: Materialize.into_bottom_of_body,
80
86
  }
81
- EzView::Template.fill_template("template/base.html", args)
87
+ Template.fill("template/base.html", args)
82
88
  end
83
89
 
84
90
  def parse_json_body
@@ -12,8 +12,12 @@ module Ezframe
12
12
  table_a = row_a.map do |row_h|
13
13
  column_set.values = row_h
14
14
  id = column_set[:id].value
15
- value_a = @attribute[:column_header].map do |key|
15
+ value_a = (@attribute[:column_header]||[]).map do |key|
16
16
  col = column_set[key]
17
+ unless col
18
+ mylog "undefined key: #{key}"
19
+ next
20
+ end
17
21
  checkbox_key = @attribute[:add_checkbox]
18
22
  if checkbox_key && key == checkbox_key
19
23
  text = add_checkbox(col)
@@ -25,59 +29,34 @@ module Ezframe
25
29
  text = deco.call(key, id, text)
26
30
  # mylog "deco: #{text}"
27
31
  end
28
- td = { tag: "td", child: text }
29
- # td.update(@attribute[:onclick_rows].call(id, text)) if @attribute[:onclick_rows]
30
- td
32
+ Ht.td(child: text)
31
33
  end
32
- tr = { tag: "tr", child: value_a }
34
+ tr = Ht.tr(child: value_a)
33
35
  if @attribute[:onclick_rows]
34
36
  tr[:id] = elem_id = "tr_#{id}"
35
- # tr.update(@attribute[:onclick_rows].call(id))
36
37
  end
37
38
  tr
38
39
  end
39
- { tag: "table", child: [make_header, table_a] }
40
+ Ht.table(child: [make_header, table_a])
40
41
  end
41
42
 
42
43
  def add_checkbox(col)
43
- { tag: "checkbox", name: "checkbox_#{col.key}_#{col.value}", value: col.value, label: col.view }
44
+ Ht.checkbox(name: "checkbox_#{col.key}_#{col.value}", value: col.value, label: col.view)
44
45
  end
45
46
 
46
47
  def make_header
47
48
  column_set = @attribute[:column_set]
48
- th_a = @attribute[:column_header].map do |key|
49
+ th_a = (@attribute[:column_header]||[]).map do |key|
49
50
  col = column_set[key]
50
51
  if col
51
- { tag: "th", child: col.label }
52
+ Ht.th(child: col.label)
52
53
  else
53
54
  nil
54
55
  end
55
56
  end
56
57
  if @attribute[:add_checkbox]
57
58
  end
58
- { tag: "tr", child: th_a }
59
- end
60
- end
61
-
62
- class Tab
63
- def self.base_hthash(link_list)
64
- size = 12 / link_list.length
65
- tabs = link_list.map do |link|
66
- { tag: "li", class: ["tab", "s#{size}"], child: link }
67
- end
68
- ul = { tag: "ul", class: %w[tabs], child: tabs }
69
- div = { tag: "div", class: %w[row s12], child: ul }
70
- { tag: "div", class: %w[row], child: div }
71
- end
72
- end
73
-
74
- class Card
75
- def self.base_hthash(title: "", content: "")
76
- multi_div([%w[row], %w[col s12], %w[card blue-grey darken-1], %w[card-content white-text]],
77
- [
78
- { tag: "span", class: %w[card-tite], child: title },
79
- { tag: "p", child: content },
80
- ])
59
+ Ht.tr(child: th_a)
81
60
  end
82
61
  end
83
62
  end
@@ -1,25 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module EzView
3
+ module Ezframe
4
4
  class Template
5
- def self.embed_words(keyword, dir, opts)
6
- return opts[keyword.to_sym] if opts[keyword.to_sym]
5
+ class << self
6
+ def fill(filename, opts = {})
7
+ dir = File.dirname(filename)
8
+ unless File.exist?(filename)
9
+ raise "fill_template: file does not exist: #{filename}"
10
+ end
7
11
 
8
- temp = "#{dir}/#{keyword}.html"
9
- return File.open(temp, &:read) if File.exist?(temp)
10
- end
11
-
12
- def self.fill_template(filename, opts = {})
13
- dir = File.dirname(filename)
14
- unless File.exist?(filename)
15
- raise "fill_template: file does not exist: #{filename}"
12
+ instr = File.open(filename, &:read)
13
+ return fill_in_text(instr, opts)
16
14
  end
17
15
 
18
- instr = File.open(filename, &:read)
19
- outstr = instr.gsub(/\#\{(.*)\}/) do
20
- embed_words(Regexp.last_match(1), dir, opts)
16
+ def fill_in_text(text, opts = {})
17
+ outstr = text.gsub(/\#\{(.*)\}/) do
18
+ keyword = $1
19
+ if opts[keyword.to_sym]
20
+ opts[keyword.to_sym]
21
+ else
22
+ mylog "[WARN] no value for keyword: #{keyword}"
23
+ nil
24
+ end
25
+ end
26
+ return outstr
21
27
  end
22
- outstr
23
28
  end
24
29
  end
25
30
  end
data/lib/ezframe/util.rb CHANGED
@@ -29,6 +29,7 @@ class Hash
29
29
  end
30
30
 
31
31
  def add_class(klass)
32
+ return unless klass
32
33
  c = self[:class]
33
34
  if !c
34
35
  self[:class] = c = []
@@ -81,6 +82,10 @@ def multi_div(class_a, child)
81
82
  return child
82
83
  end
83
84
 
85
+
86
+
87
+
88
+
84
89
  def mylog(msg)
85
90
  File.open("log/mylog.log", "a"){|f| f.puts "#{Time.now}:[#{$$}]:#{msg}" }
86
91
  end
@@ -1,3 +1,3 @@
1
1
  module Ezframe
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/ezframe.rb CHANGED
@@ -1,27 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'yaml'
4
- require 'htmlbeautifier'
5
4
  require "sequel"
6
5
  require "json"
7
- require "yaml"
6
+ require "nkf"
8
7
 
8
+ require_relative 'ezframe/version'
9
9
  require_relative 'ezframe/util'
10
10
  require_relative 'ezframe/config'
11
11
  require_relative 'ezframe/controller'
12
+ require_relative 'ezframe/japanese_utils'
12
13
  require_relative 'ezframe/column_set'
13
14
  require_relative 'ezframe/column_type'
14
15
  require_relative 'ezframe/database'
15
- require_relative 'ezframe/hthash'
16
+ require_relative 'ezframe/ht'
16
17
  require_relative 'ezframe/html'
17
18
  require_relative 'ezframe/materialize'
18
19
  require_relative 'ezframe/model'
19
20
  require_relative 'ezframe/page_kit'
20
21
  require_relative 'ezframe/page_base'
21
22
  require_relative 'ezframe/template'
22
- require_relative 'ezframe/pages'
23
23
  require_relative 'ezframe/server'
24
24
  require_relative 'ezframe/auth.rb'
25
+ require_relative 'ezframe/loader'
25
26
 
26
27
 
27
28