ezframe 0.1.1 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ba49d27d45a195d4b177c3d95eccdca2f01a3e9f20cd072ccc56acee5265b59
4
- data.tar.gz: a3d7589ff5d0d3c81e405a950c9c57f6ca0110cc9748f6dc5bc254e276d27bb7
3
+ metadata.gz: 4ee9abffabef18607104a790bf9c044fd18022c1bb9c325d0b49c3919504da0e
4
+ data.tar.gz: 7c624b8735e2d081a73c8c5b771abdb3ca0a531a66d1e80ac953c4063dd237ba
5
5
  SHA512:
6
- metadata.gz: 7ca38e91d91c1e1e30b9175efd9da518da54e6860d8f510173ddfbc2d23e553e52e3189137ef4c807c491740724349991921c58ad8d2749579716a873a8db744
7
- data.tar.gz: 847a914cf8c68690be28b40a07903c3d0c47dd8e86dba9d6cbe6e05053cfa454fd0ead717b2267cacab570f96a3583093570cc21647b21c6c00a1bcd7b69f11c
6
+ metadata.gz: abf17a71fad66bdb9776346a155913664b78ebc9dfe4bc2fc94526340238423c7adf593650ed82e5e15ae052ecaa25e38a3a3803a68efa831d5cdf3d46478951
7
+ data.tar.gz: 4235b2a4e945845797e3cb41f27b675775598b8996952087701ca5ce678ef08abb28b44fb5f9b475a6281e16dd9845d77522824486b23f818ef773ea617e77ef
@@ -0,0 +1 @@
1
+ ezframe asset test
@@ -1,4 +1,3 @@
1
- // version. 2020?01?31?(?)
2
1
  function add_event(obj) {
3
2
  var elems = obj.querySelectorAll('[event]')
4
3
  if (elems) {
@@ -49,9 +48,6 @@ function parse_event(event) {
49
48
  }
50
49
  }
51
50
  }
52
- /*if (!ev.url) {
53
- ev.url = location.pathname
54
- }*/
55
51
  return ev
56
52
  }
57
53
 
@@ -68,10 +64,9 @@ function execute_event(obj) {
68
64
  }
69
65
  return
70
66
  case "set_global":
71
- if (!window.ezframe) { window.ezframe = {} }
72
67
  for(key in event) {
73
- if ([ "command", "branch", "on", "url" ].indexOf(key) >= 0) { continue }
74
- window.ezframe[key] = event[key]
68
+ if ([ "command", "on", "url" ].indexOf(key) >= 0) { continue }
69
+ window.ez_global[key] = event[key]
75
70
  }
76
71
  // console.log("set_global:" + JSON.stringify(window.ezframe))
77
72
  return
@@ -79,11 +74,45 @@ function execute_event(obj) {
79
74
  console.log("redirect:" + event.url)
80
75
  location.href = event.url
81
76
  return
77
+ case "enable_datatable":
78
+ enable_datatable(event)
79
+ return
82
80
  }
83
81
  with_attr(event, obj)
84
82
  post_values(event, obj)
85
83
  }
86
84
 
85
+ function enable_datatable(event) {
86
+ // $("#enable_datatable").DataTable();
87
+ console.log("enable_datatable: target="+event.target)
88
+ // console.log($(tevent.arget))
89
+ var list_size = event.size || 5
90
+ $(event.target).DataTable({
91
+ lengthChange: false,
92
+ displayLength: parseInt(list_size),
93
+ columnDefs: [{ targets: '_all', className: 'ellipsis' }],
94
+ language: {
95
+ "decimal": ".",
96
+ "thousands": ",",
97
+ "sProcessing": "処理中...",
98
+ "sLengthMenu": "_MENU_ 件表示",
99
+ "sZeroRecords": "データはありません。",
100
+ "sInfo": " _TOTAL_ 件中 _START_ から _END_ まで表示",
101
+ "sInfoEmpty": " 0 件中 0 から 0 まで表示",
102
+ "sInfoFiltered": "(全 _MAX_ 件より抽出)",
103
+ "sInfoPostFix": "",
104
+ "sSearch": "検索:",
105
+ "sUrl": "",
106
+ "oPaginate": {
107
+ "sFirst": "<< 先頭",
108
+ "sPrevious": "< 前",
109
+ "sNext": "次 > ",
110
+ "sLast": "最終 >>"
111
+ }
112
+ }
113
+ })
114
+ }
115
+
87
116
  function with_attr(event, obj) {
88
117
  if (!event.with) {
89
118
  return null
@@ -120,9 +149,8 @@ function post_values(event, obj) {
120
149
 
121
150
  function manage_response(res, event, obj) {
122
151
  var elem
123
- /* console.log("manage_response: res="+JSON.stringify(res)+", event=" + JSON.stringify(event) +
152
+ console.log("manage_response: res="+JSON.stringify(res)+", event=" + JSON.stringify(event) +
124
153
  ", obj=" + JSON.stringify(obj))
125
- */
126
154
  if (!res) { return }
127
155
  if (Array.isArray(res)) {
128
156
  for(var i = 0; i < res.length; i++) {
@@ -138,11 +166,7 @@ function exec_one_response(res) {
138
166
  console.log("inject: " + res.inject)
139
167
  elem = document.querySelector(res.inject)
140
168
  if (elem) {
141
- if (res.is_html) {
142
- elem.innerHTML = res.body
143
- } else {
144
- elem.innerHTML = htmlgen(res.body)
145
- }
169
+ elem.innerHTML = res.body.replace(/<br>/g, "\n")
146
170
  add_event(elem)
147
171
  } else {
148
172
  console.log("no such element: "+res.inject)
@@ -175,12 +199,13 @@ function collect_form_values(obj) {
175
199
  for (var i = 0; i < inputs.length; i++) {
176
200
  var elem = inputs[i]
177
201
  if (!elem.name) { continue }
178
- console.log("name,value="+elem.name+","+elem.value)
202
+ // console.log("name,value="+elem.name+","+elem.value)
179
203
  if ((elem.type == "checkbox" || elem.type == "radio") && !elem.checked) {
180
204
  continue
181
205
  }
182
206
  var cur_value = res[elem.name]
183
- var elem_value = normalize(elem.value)
207
+ var elem_value = elem.value
208
+ elem_value = elem_value.replace(/\n/g, '<br>')
184
209
  if (cur_value) {
185
210
  if (Array.isArray(cur_value)) {
186
211
  cur_value.push(elem_value)
@@ -194,10 +219,6 @@ function collect_form_values(obj) {
194
219
  return res
195
220
  }
196
221
 
197
- function normalize(str) {
198
- return str.replace(/^[\s| ]+|[\s| ]+$/g, '').trim()
199
- }
200
-
201
222
  function switch_hide(button) {
202
223
  console.log("switch_hide")
203
224
  var node = button
@@ -253,6 +274,14 @@ function register_hover_button(obj) {
253
274
  }
254
275
  }
255
276
 
277
+
256
278
  document.addEventListener('DOMContentLoaded', function () {
279
+ if (!window.ez_global) { window.ez_global = {} }
280
+ add_event(document)
281
+ })
282
+
283
+ /*
284
+ $(document).ready(function () {
257
285
  add_event(document)
258
286
  })
287
+ */
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env ruby
2
+ #codnig: utf-8
3
+
4
+ =begin
5
+
6
+ column/*.ymlのチェックをする。
7
+
8
+ =end
9
+ require "ezframe"
10
+
11
+ # https://stackoverflow.com/questions/4911105/in-ruby-how-to-be-warned-of-duplicate-keys-in-hashes-when-loading-a-yaml-docume
12
+ def duplicate_keys(file_or_content)
13
+ yaml = file_or_content.is_a?(File) ? file_or_content.read : file_or_content
14
+ duplicate_keys = []
15
+
16
+ validator = ->(node, parent_path) do
17
+ if node.is_a?(Psych::Nodes::Mapping)
18
+ children = node.children.each_slice(2) # In a Mapping, every other child is the key node, the other is the value node.
19
+ duplicates = children.map { |key_node, _value_node| key_node }.group_by(&:value).select { |_value, nodes| nodes.size > 1 }
20
+
21
+ duplicates.each do |key, nodes|
22
+ duplicate_key = {
23
+ file: (file_or_content.path if file_or_content.is_a?(File)),
24
+ key: parent_path + [key],
25
+ occurrences: nodes.map { |occurrence| "line: #{occurrence.start_line + 1}" },
26
+ }.compact
27
+
28
+ duplicate_keys << duplicate_key
29
+ end
30
+
31
+ children.each { |key_node, value_node| validator.call(value_node, parent_path + [key_node ? key_node.value : nil].compact) }
32
+ else
33
+ node.children.to_a.each { |child| validator.call(child, parent_path) }
34
+ end
35
+ end
36
+
37
+ ast = Psych.parse_stream(yaml)
38
+ validator.call(ast, [])
39
+
40
+ duplicate_keys
41
+ end
42
+
43
+ Ezframe::Config.init
44
+ Dir["column/*.yml"].each do |file|
45
+ instr = File.read(file)
46
+ dup = duplicate_keys(instr)
47
+ if dup && dup.length > 0
48
+ puts "#{file}\n#{dup}"
49
+ end
50
+ yaml = YAML.load_file(file)
51
+ upper = Object.const_get("Ezframe")
52
+ yaml.each do |column|
53
+ type = column["type"]
54
+ unless type
55
+ puts "#{file}: type is not defined: key=#{column['key']}"
56
+ next
57
+ end
58
+ klass = "Ezframe::#{type.to_camel}Type"
59
+ unless upper.const_defined?(klass)
60
+ puts "#{file}: unknown type: key=#{column['key']}, type=#{type}"
61
+ end
62
+ end
63
+ end
64
+
@@ -6,7 +6,10 @@ $:.push("lib")
6
6
  require 'ezframe'
7
7
  require 'sequel'
8
8
 
9
- Ezframe::Config.load_files("config")
10
- Ezframe::Model.init
11
- model = Ezframe::Model.get_clone
12
- model.create_tables
9
+ include Ezframe
10
+
11
+ Config.init
12
+ DB.init
13
+ ColumnSets.init
14
+
15
+ ColumnSets.create_tables
@@ -1,25 +1,68 @@
1
1
  #!/usr/bin/env ruby
2
2
  #coding: utf-8
3
3
  require "ezframe"
4
-
5
4
  include Ezframe
6
- # get column set
7
- Config.load_files("./config")
8
- Model.init
9
- $model = Model.get_clone
10
5
 
11
- def get_db_info(table_name)
12
- dbcol = {}
13
- sql = "SELECT column_name,data_type FROM information_schema.columns WHERE table_name = '#{table_name}'"
14
- $model.db.sequel[sql].each do |row|
15
- dbcol[row[:column_name].to_sym] = normalize_dbtype(row[:data_type])
6
+ class DBInfo
7
+ class << self
8
+ def get_db_info(table_name)
9
+ typ = get_database_type(Config[:database])
10
+ case typ
11
+ when "postgresql"
12
+ return get_info_from_postgres(table_name)
13
+ when "sqlite"
14
+ return get_info_from_sqlite(table_name)
15
+ else
16
+ raise "unknown database"
17
+ end
18
+ return nil
19
+ end
20
+
21
+ def get_info_from_postgres(table_name)
22
+ dbcol = {}
23
+ sql = "SELECT column_name,data_type FROM information_schema.columns WHERE table_name = '#{table_name}'"
24
+ begin
25
+ data_a = DB.sequel[sql].all
26
+ rescue
27
+ return nil
28
+ end
29
+ # puts data_a
30
+ data_a.each do |row|
31
+ dbcol[row[:column_name].to_s.to_sym] = normalize_dbtype(row[:data_type])
32
+ end
33
+ return dbcol
34
+ end
35
+
36
+ def get_info_from_sqlite(table_name)
37
+ sql = "SELECT * from sqlite_master WHERE name = '#{table_name}';"
38
+ data = DB.sequel[sql].first
39
+ return nil unless data
40
+ sql = data[:sql]
41
+ return parse_create_sql(sql)
42
+ end
43
+
44
+ def parse_create_sql(sql)
45
+ sql.gsub(/CREATE TABLE \`\w+\` \(/, "")
46
+ column_a = sql.split(", ")
47
+ dbcol = {}
48
+ column_a.each do |line|
49
+ if line =~ /\`(\w+)\`\s(\w+)/
50
+ colkey, dbtype = $1, $2
51
+ dbcol[colkey.to_sym] = dbtype
52
+ end
53
+ end
54
+ return dbcol
55
+ end
56
+
57
+ def get_database_type(config)
58
+ return config.split("://")[0]
59
+ end
16
60
  end
17
- return dbcol
18
61
  end
19
62
 
20
63
  def exec_sql(sql)
21
64
  begin
22
- $model.db.sequel.run(sql)
65
+ DB.sequel.run(sql)
23
66
  rescue => exception
24
67
  p exception
25
68
  end
@@ -44,7 +87,11 @@ end
44
87
 
45
88
  def check_diff(column_set)
46
89
  table_name = column_set.name
47
- dbcols = get_db_info(table_name)
90
+ dbcols = DBInfo.get_db_info(table_name)
91
+ unless dbcols
92
+ ColumnSets.create_one_table(table_name, ColumnSets.get(table_name.to_sym))
93
+ return
94
+ end
48
95
  column_set.each do |column|
49
96
  next if %w[id updated_at created_at].include?(column.key.to_s)
50
97
  dbtype = dbcols[column.key]
@@ -62,6 +109,10 @@ def check_diff(column_set)
62
109
  end
63
110
  end
64
111
 
65
- $model.column_sets.each do |table_name, column_set|
112
+ Config.init
113
+ DB.init
114
+ ColumnSets.init
115
+
116
+ ColumnSets.each do |table_name, column_set|
66
117
  check_diff(column_set)
67
118
  end
@@ -30,16 +30,15 @@ Gem::Specification.new do |spec|
30
30
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
31
  spec.require_paths = ["lib"]
32
32
 
33
- spec.add_development_dependency "bundler", "~> 1.16"
34
- spec.add_development_dependency "minitest", '~> 5.13.0'
35
- spec.add_development_dependency "nokogiri", '~> 1.10.7'
36
- spec.add_development_dependency "rack-test", '~> 1.1.0'
37
- spec.add_development_dependency "pry", '~> 0.12.2'
38
- spec.add_development_dependency "mailcatcher", '~> 0.7.1'
33
+ spec.add_development_dependency "bundler", '>= 1.16'
34
+ spec.add_development_dependency "minitest", '>= 5.13.0'
35
+ spec.add_development_dependency "nokogiri", '>= 1.10.7'
36
+ spec.add_development_dependency "rack-test", '>= 1.1.0'
37
+ spec.add_development_dependency "pry", '>= 0.12.2'
39
38
 
40
- spec.add_runtime_dependency "rake", "~> 13.0"
41
- spec.add_runtime_dependency 'rack', '~> 2.0.7'
42
- spec.add_runtime_dependency 'sequel', '~> 5.27.0'
43
- spec.add_runtime_dependency 'sqlite3', '~> 1.4.0'
44
- spec.add_runtime_dependency 'oj', '~> 3.10.2'
39
+ spec.add_runtime_dependency "rake", '>= 13.0'
40
+ spec.add_runtime_dependency 'rack', '>= 2.0.6'
41
+ spec.add_runtime_dependency 'sequel', '>= 5.27.0'
42
+ spec.add_runtime_dependency 'sqlite3', '>= 1.4.0'
43
+ spec.add_runtime_dependency 'bcrypt', '>= 3.1.13'
45
44
  end
@@ -4,9 +4,11 @@ require 'yaml'
4
4
  require "sequel"
5
5
  require "json"
6
6
  require "nkf"
7
+ require "date"
7
8
 
8
9
  require_relative 'ezframe/version'
9
10
  require_relative 'ezframe/util'
11
+ require_relative 'ezframe/logger'
10
12
  require_relative 'ezframe/config'
11
13
  require_relative 'ezframe/controller'
12
14
  require_relative 'ezframe/japanese_utils'
@@ -16,7 +18,6 @@ require_relative 'ezframe/database'
16
18
  require_relative 'ezframe/ht'
17
19
  require_relative 'ezframe/html'
18
20
  require_relative 'ezframe/materialize'
19
- require_relative 'ezframe/model'
20
21
  require_relative 'ezframe/page_base'
21
22
  require_relative 'ezframe/template'
22
23
  require_relative 'ezframe/server'
@@ -1,75 +1,80 @@
1
1
  module Ezframe
2
2
  class Auth
3
3
  class << self
4
- attr_accessor :model, :user
4
+ attr_accessor :user
5
5
 
6
- def init_warden
6
+ def init
7
7
  Warden::Manager.serialize_into_session do |auth|
8
- mylog "serialize_into: #{auth.inspect}"
8
+ # Logger.info "serialize_into: #{auth.inspect}"
9
9
  auth.user[:id]
10
10
  end
11
11
  Warden::Manager.serialize_from_session do |account|
12
- mylog "serialize_from: account = #{account}"
13
- inst = Auth.get(env['model'], account)
14
- mylog "inst = #{inst.inspect}"
12
+ # Logger.info "serialize_from: account = #{account}"
13
+ inst = Auth.get(account)
14
+ # Logger.info "inst = #{inst.inspect}"
15
15
  inst
16
16
  end
17
17
  Warden::Strategies.add(:mystrategy) do
18
18
  def valid?
19
- # mylog "valid?"
19
+ # Logger.info "valid?"
20
20
  params["account"] || params["password"]
21
21
  end
22
22
 
23
23
  def authenticate!
24
- mylog "authenticate!: #{params}"
24
+ Logger.info "Auth.authenticate: #{params}"
25
25
  if Auth.authenticate(env, params["account"], params["password"])
26
- success!(Auth.get(env['model'], params["account"]))
26
+ success!(Auth.get(params["account"]))
27
27
  else
28
- env['x-rack.flash'].error = 'ユーザーが登録されていないか、パスワードが違っています。'
29
- fail!("authenticate failure")
28
+ fail!(Message[:login_failure])
30
29
  end
31
30
  end
32
31
  end
33
32
  end
34
33
 
35
- def get(model, account)
36
- new(model, account)
34
+ def get(account)
35
+ new(account)
37
36
  end
38
37
 
39
38
  def authenticate(env, account, pass)
40
- model = env["model"]
41
- raise "model is not initialized" unless model
42
- @user = model.db.dataset(Config[:login_table]).where(Config[:login_account].to_sym => account ).first
39
+ Logger.debug("authenticate: #{env}")
40
+ auth_conf = Config[:auth]
41
+ @user = DB.dataset(auth_conf[:table]).where(auth_conf[:user].to_sym => account ).first
43
42
  if @user
44
- mylog "Auth: authenticate: user=#{@user.inspect}"
43
+ Logger.info "Auth: authenticate"
45
44
  else
46
- mylog "authenticate: this user does not exist: #{account}"
45
+ Logger.info "authenticate: this user does not exist: #{account}"
47
46
  return nil
48
47
  end
49
- mylog "env=#{env.inspect}"
48
+ # Logger.info "env=#{env.inspect}"
50
49
  env['rack.session'][:user] = @user[:id]
51
- password = @user[:password]
50
+ password = @user[auth_conf[:password].to_sym]
51
+ Logger.debug("@user=#{@user}")
52
+ bcrypt = BCrypt::Password.new(password)
52
53
  @user.delete(:password)
53
54
 
54
- return nil if !pass || !password
55
- !!(password == pass)
55
+ return nil if !pass || pass.strip.empty? || !password || password.strip.empty?
56
+ # 生パスワード比較
57
+ # !!(password == pass)
58
+ return bcrypt == pass
56
59
  end
57
60
  end
58
61
 
59
- attr_accessor :account, :password, :model, :user, :id
62
+ attr_accessor :account, :password, :user, :id
60
63
 
61
- def initialize(model, account)
64
+ def initialize(account)
62
65
  self.account = account
63
- dataset = model.db.dataset(Config[:login_table])
66
+ auth_conf = Config[:auth]
67
+ dataset = DB.dataset(auth_conf[:table])
64
68
  if account.is_a?(Integer)
65
69
  @user = dataset.where(id: account).first
66
70
  else
67
- @user = dataset.where(Config[:login_account].to_sym => account).first
71
+ @user = dataset.where(auth_conf[:user].to_sym => account).first
68
72
  end
69
73
  unless @user
70
- mylog "Auth.initialize: This user does not exist: #{account}"
74
+ Logger.error "Auth.initialize: This user does not exist: #{account}"
75
+ return
71
76
  end
72
- self.password = @user[:password]
77
+ self.password = @user[auth_conf[:password].to_sym]
73
78
  @user.delete(:password)
74
79
  end
75
80
  end