keight 0.0.1

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 (46) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +263 -0
  4. data/Rakefile +92 -0
  5. data/bench/bench.rb +278 -0
  6. data/bench/benchmarker.rb +502 -0
  7. data/bin/k8rb +496 -0
  8. data/keight.gemspec +36 -0
  9. data/lib/keight/skeleton/.gitignore +10 -0
  10. data/lib/keight/skeleton/app/action.rb +98 -0
  11. data/lib/keight/skeleton/app/api/hello.rb +39 -0
  12. data/lib/keight/skeleton/app/form/.keep +0 -0
  13. data/lib/keight/skeleton/app/helper/.keep +0 -0
  14. data/lib/keight/skeleton/app/model/.keep +0 -0
  15. data/lib/keight/skeleton/app/model.rb +144 -0
  16. data/lib/keight/skeleton/app/page/welcome.rb +17 -0
  17. data/lib/keight/skeleton/app/template/_layout.html.eruby +56 -0
  18. data/lib/keight/skeleton/app/template/welcome.html.eruby +6 -0
  19. data/lib/keight/skeleton/app/usecase/.keep +0 -0
  20. data/lib/keight/skeleton/config/app.rb +29 -0
  21. data/lib/keight/skeleton/config/app_dev.private +11 -0
  22. data/lib/keight/skeleton/config/app_dev.rb +8 -0
  23. data/lib/keight/skeleton/config/app_prod.rb +7 -0
  24. data/lib/keight/skeleton/config/app_stg.rb +5 -0
  25. data/lib/keight/skeleton/config/app_test.private +11 -0
  26. data/lib/keight/skeleton/config/app_test.rb +8 -0
  27. data/lib/keight/skeleton/config/server_puma.rb +22 -0
  28. data/lib/keight/skeleton/config/server_unicorn.rb +21 -0
  29. data/lib/keight/skeleton/config/urlpath_mapping.rb +16 -0
  30. data/lib/keight/skeleton/config.rb +44 -0
  31. data/lib/keight/skeleton/config.ru +21 -0
  32. data/lib/keight/skeleton/index.txt +38 -0
  33. data/lib/keight/skeleton/static/lib/jquery/1.11.3/jquery.min.js +6 -0
  34. data/lib/keight/skeleton/static/lib/jquery/1.11.3/jquery.min.js.gz +0 -0
  35. data/lib/keight/skeleton/static/lib/modernizr/2.8.3/modernizr.min.js +4 -0
  36. data/lib/keight/skeleton/static/lib/modernizr/2.8.3/modernizr.min.js.gz +0 -0
  37. data/lib/keight/skeleton/tmp/upload/.keep +0 -0
  38. data/lib/keight.rb +2017 -0
  39. data/test/data/example1.jpg +0 -0
  40. data/test/data/example1.png +0 -0
  41. data/test/data/multipart.form +0 -0
  42. data/test/data/wabisabi.js +77 -0
  43. data/test/data/wabisabi.js.gz +0 -0
  44. data/test/keight_test.rb +3161 -0
  45. data/test/oktest.rb +1537 -0
  46. metadata +114 -0
@@ -0,0 +1,144 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ##
4
+ ## Define base classes of models here.
5
+ ##
6
+
7
+ ## ***********************************************
8
+ ## The followings are just examples.
9
+ ## Remove them and define your own classes.
10
+ ## ***********************************************
11
+
12
+ class Entity
13
+ end
14
+
15
+ ## ex: Customer, Department, Company, Product, ...
16
+ class ResourceEntity < Entity # or NounEntity
17
+ end
18
+
19
+ ## ex: SalesOrder, Shipping, Requisition, Approval, ...
20
+ class EventEntity < Entity # or VerbEntity
21
+ end
22
+
23
+ ## ex: Client, Supplier, Position, ...
24
+ class RoleEntity < Entity
25
+ end
26
+
27
+ ## ex: Belonging, Writing, BOM, ...
28
+ class MappingEntity < Entity
29
+ end
30
+
31
+
32
+ ## Define event class as exception in order to be
33
+ ## caught in My::Action class.
34
+ class Event < Exception
35
+ end
36
+
37
+ class NotExist < Event
38
+ end
39
+
40
+ class NotPermitted < Event
41
+ end
42
+
43
+ class NotCorrect < Event
44
+ end
45
+
46
+
47
+ ## Form class
48
+ class Form
49
+
50
+ def initialize(params={})
51
+ @params = params
52
+ end
53
+
54
+ attr_reader :params, :errors
55
+
56
+ def self.new_from(model)
57
+ params = {
58
+ #'val' => model.val,
59
+ }
60
+ self.new(params)
61
+ end
62
+
63
+ def validate
64
+ @errors = errors = {}
65
+ #
66
+ #k = 'val'
67
+ #v = @params[k].to_s.strip
68
+ #if v.empty?
69
+ # errors[k] = "Required"
70
+ #elsif v !~ /\A\d+\z/
71
+ # errors[k] = "Integer expected"
72
+ #end
73
+ #@params[k] = v
74
+ #
75
+ return errors
76
+ end
77
+
78
+ def error(name)
79
+ @errors[name]
80
+ end
81
+
82
+ def populate_into(model)
83
+ #model.val = @params['val'].to_i
84
+ return model
85
+ end
86
+
87
+ end
88
+
89
+
90
+ ## Operation class (aka Service class)
91
+ class Operation
92
+
93
+ def initialize(db, login_user=nil)
94
+ @db = db
95
+ @login_user = login_user
96
+ end
97
+
98
+ end
99
+
100
+
101
+ ## Usecase class in order to separate business logics from framework.
102
+ class UseCase
103
+
104
+ def initialize(db, login_user=nil)
105
+ @db = db
106
+ @login_user = login_user
107
+ end
108
+
109
+ def run(params, *urlpath_params)
110
+ errors = validate(params)
111
+ return nil, errors if errors
112
+ args = accommodate(params, *urlpath_params)
113
+ model, error = execute(*args)
114
+ return nil, error if error
115
+ content = represent(model)
116
+ return content, nil
117
+ end
118
+
119
+ private
120
+
121
+ ## validate params and return errors as Hash object.
122
+ def validate(params)
123
+ errors = {}
124
+ return errors
125
+ end
126
+
127
+ ## convert params and urlpath params into args of execute()
128
+ def accommodate(params, *urlpath_params)
129
+ args = urlpath_params + [params]
130
+ return args
131
+ end
132
+
133
+ ## execute business logic
134
+ def execute(*args)
135
+ model = nil
136
+ return model
137
+ end
138
+
139
+ ## convert model object into JSON or HTML
140
+ def represent(model)
141
+ return {}
142
+ end
143
+
144
+ end
@@ -0,0 +1,17 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'keight'
4
+
5
+ require_relative '../action'
6
+
7
+
8
+ class WelcomePage < My::Action
9
+
10
+ mapping '' , :GET=>:do_index
11
+
12
+ def do_index
13
+ #"<h1>Welcome!</h1>"
14
+ render_html :welcome
15
+ end
16
+
17
+ end
@@ -0,0 +1,56 @@
1
+ <% # -*- coding: utf-8 -*-
2
+
3
+ @page_title ||= "Example"
4
+
5
+ #cdn_baseurl = 'https://ajax.googleapis.com/ajax/libs' # Google
6
+ cdn_baseurl = 'https://cdnjs.cloudflare.com/ajax/libs' # CDNJS
7
+
8
+ ga_code = $config.google_analytics_code
9
+
10
+ if $config.app_env == 'dev'
11
+ cdn_baseurl = '/static/lib'
12
+ ga_code = nil
13
+ end
14
+
15
+ %>
16
+ <!doctype html>
17
+ <html class="no-js" lang="">
18
+ <head>
19
+ <meta charset="utf-8" />
20
+ <meta http-equiv="x-ua-compatible" content="ie=edge" />
21
+ <title><%= @page_title %></title>
22
+ <meta name="description" content="" />
23
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
24
+ <!--link rel="stylesheet" href="/static/css/normalize.css" /-->
25
+ <!--link rel="stylesheet" href="/static/css/main.css" /-->
26
+ <script src="<%= cdn_baseurl %>/modernizr/2.8.3/modernizr.min.js"></script>
27
+ </head>
28
+ <body>
29
+
30
+ <header>
31
+ </header>
32
+ <div id="main" class="main">
33
+ <%== @_content %>
34
+ </div>
35
+ <footer>
36
+ </footer>
37
+
38
+ <script src="<%= cdn_baseurl %>/jquery/1.11.3/jquery.min.js"></script>
39
+ <script>window.jQuery || document.write('<script src="/static/lib/jquery/1.11.3/jquery.min.js"><\/script>')</script>
40
+
41
+ <% ### load site-specific files ### %>
42
+ <!--script src="/static/js/site.js"></script-->
43
+
44
+ <% ### Google Analytics ### %>
45
+ <% if ga_code %>
46
+ <script>
47
+ (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=
48
+ function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;
49
+ e=o.createElement(i);r=o.getElementsByTagName(i)[0];
50
+ e.src='https://www.google-analytics.com/analytics.js';
51
+ r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));
52
+ ga('create','<%= ga_code %>','auto');ga('send','pageview');
53
+ </script>
54
+ <% end %>
55
+ </body>
56
+ </html>
@@ -0,0 +1,6 @@
1
+ <% # -*- coding: utf-8 -*-
2
+ %>
3
+ <section>
4
+ <h1>Welcome!</h1>
5
+ <p>This is an example content.</p>
6
+ </section>
File without changes
@@ -0,0 +1,29 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class Config
4
+
5
+ add :app_env , ENV['APP_ENV'] , "environment name"
6
+
7
+ ## database
8
+ add :db_host , 'localhost' , "DB host name"
9
+ add :db_port , 5432 , "DB port number"
10
+ add :db_name , 'xxxx' , "DB database"
11
+ add :db_user , 'xxxx' , "DB user name"
12
+ add :db_pass , SECRET , "DB password"
13
+
14
+ ## Rack::Session::Cookie
15
+ add :session_key , 'rack.session' , "cookie name"
16
+ add :session_domain , nil , "cookie domain"
17
+ add :session_path , '/' , "cookie path"
18
+ add :session_expire_after , 24 * 60 * 60 , "cookie expires"
19
+ add :session_secret , SECRET , "secret key"
20
+ add :session_old_secret , SECRET , "old secret key"
21
+
22
+ ## Keight
23
+ add :k8_upload_dir , './tmp/upload' , "for uploaded files"
24
+ add :k8_rackapp_urlpath_cache_size , 0 , "0: cache disabled"
25
+
26
+ ## add your own configs here
27
+ add :google_analytics_code , nil , "ex: 'UA-XXXXX-X'"
28
+
29
+ end
@@ -0,0 +1,11 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ## NOTE: don't add this file into Git repository!
4
+
5
+ class Config
6
+
7
+ set :db_pass , ""
8
+ set :session_secret , "{%= K8::Util.randstr_b64() %}"
9
+ set :session_old_secret , ""
10
+
11
+ end
@@ -0,0 +1,8 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class Config
4
+
5
+ set :db_user , ENV['USER']
6
+ set :db_pass , ''
7
+
8
+ end
@@ -0,0 +1,7 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class Config
4
+
5
+ #set :google_analytics_code , 'UA-XXXXX-X'
6
+
7
+ end
@@ -0,0 +1,5 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class Config
4
+
5
+ end
@@ -0,0 +1,11 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ## NOTE: don't add this file into Git repository!
4
+
5
+ class Config
6
+
7
+ set :db_pass , ""
8
+ set :session_secret , "{%= K8::Util.randstr_b64() %}"
9
+ set :session_old_secret , ""
10
+
11
+ end
@@ -0,0 +1,8 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class Config
4
+
5
+ set :db_user , ENV['USER']
6
+ set :db_pass , ''
7
+
8
+ end
@@ -0,0 +1,22 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ## usage: puma -C config/server_puma.rb
4
+ ## ref: https://github.com/puma/puma
5
+
6
+ environment 'production'
7
+ port 9292
8
+ daemonize false
9
+ threads 8,32
10
+ workers 3
11
+ preload_app!
12
+
13
+ on_worker_boot do
14
+ ##
15
+ ## configuration here
16
+ ##
17
+
18
+ #ActiveSupport.on_load(:active_record) do
19
+ # ActiveRecord::Base.establish_connection
20
+ #end
21
+
22
+ end
@@ -0,0 +1,21 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ## usage: unicorn -p 9292 -E production -c ./config/server_unicorn.rb
4
+ ## ref: https://devcenter.heroku.com/articles/rails-unicorn
5
+
6
+ worker_processes Integer(ENV["WEB_CONCURRENCY"] || 4)
7
+ timeout 10
8
+ preload_app true
9
+
10
+ before_fork do |server, worker|
11
+ Signal.trap 'TERM' do
12
+ puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
13
+ Process.kill 'QUIT', Process.pid
14
+ end
15
+ end
16
+
17
+ after_fork do |server, worker|
18
+ Signal.trap 'TERM' do
19
+ puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ $urlpath_mapping = [
4
+ ['/' , "./app/page/welcome:WelcomePage"],
5
+ ['/api', [
6
+ ['/hello' , "./app/api/hello:HelloAPI"],
7
+ #['/books' , "./app/api/books:BooksAPI"],
8
+ #['/books/{book_id}/comments' , "./app/api/books:BookCommentsAPI"],
9
+ #['/orders' , "./app/api/orders:OrdersAPI"],
10
+ ]],
11
+ ['/admin', [
12
+ #['/books' , "./app/admin/books:AdminBooksPage"],
13
+ #['/orders' , "./app/admin/orders:AdminOrdersPage"],
14
+ ]],
15
+ ['/static' , "./app/action:My::StaticPage"],
16
+ ]
@@ -0,0 +1,44 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ app_env = ENV['APP_ENV'] # 'dev', 'prod', 'stg', 'test'
4
+ if app_env.nil? || app_env.empty?
5
+ $stderr.write '
6
+ **
7
+ ** ERROR: Set $APP_ENV environment variable at first.
8
+ **
9
+ ** Example (MacOSX, UNIX):
10
+ ** $ export APP_ENV=dev # development mode
11
+ ** $ export APP_ENV=prod # production mode
12
+ ** $ export APP_ENV=stg # staging mode
13
+ **
14
+ '
15
+ exit 1
16
+ end
17
+
18
+ if defined?(Config) # Ruby < 2.2 has obsoleted 'Config' object
19
+ Object.class_eval do
20
+ remove_const :Config
21
+ end
22
+ end
23
+
24
+
25
+ require 'keight'
26
+
27
+ class Config < K8::BaseConfig
28
+ end
29
+
30
+ require_relative "config/app"
31
+ require_relative "config/app_#{app_env}"
32
+ fpath = File.join(File.dirname(__FILE__), "config", "app_#{app_env}.private")
33
+ load fpath if File.file?(fpath)
34
+
35
+ errmsg = Config.validate_values()
36
+ if errmsg
37
+ $stderr.write(errmsg)
38
+ exit 1
39
+ end
40
+
41
+ ## directory to place uploaded files
42
+ ENV['K8_UPLOAD_DIR'] = $config.k8_upload_dir if $config.k8_upload_dir
43
+
44
+ $config = Config.new()
@@ -0,0 +1,21 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'keight'
4
+
5
+ ## create $config object
6
+ require_relative 'config'
7
+
8
+ ## get $urlpath_mapping
9
+ require_relative 'config/urlpath_mapping'
10
+
11
+ ## create application object
12
+ opts = $config.get_all(:k8_rackapp_) # ex: {urlpath_cache_size: 1000}
13
+ app = K8::RackApplication.new($urlpath_mapping, opts)
14
+ $urlpath_mapping = nil
15
+
16
+ ## cookie store session
17
+ require 'rack/session/cookie'
18
+ use Rack::Session::Cookie, $config.get_all(:session_)
19
+
20
+ ## start application
21
+ run app
@@ -0,0 +1,38 @@
1
+ # -*- coding: utf-8 -*-
2
+ config.ru for 'rackup' command
3
+ config.rb define $config object
4
+ config/ configurations
5
+ config/app.rb common config
6
+ config/app_dev.rb for development
7
+ config/app_dev.private (private configs)
8
+ config/app_prod.rb for production
9
+ config/app_stg.rb for staging
10
+ config/app_test.rb for test
11
+ config/app_test.private (private configs)
12
+ config/server_unicorn.rb for unicorn server
13
+ config/server_puma.rb for puma server
14
+ config/urlpath_mapping.rb urlpath mapping
15
+ app/ application code
16
+ app/action.rb base action class
17
+ app/api/ for API
18
+ app/api/hello.rb example API
19
+ app/page/ for HTML
20
+ app/page/welcome.rb example HTML page
21
+ app/model.rb base classes of models
22
+ app/model/ model classes
23
+ app/usecase/ usecase classes
24
+ app/form/ HTML form
25
+ app/helper/ helper modules
26
+ app/template/ template files
27
+ app/template/_layout.html.eruby default layout template
28
+ app/template/welcome.html.eruby welcome page template
29
+ static/ static files
30
+ static/lib/ library such as jquery
31
+ static/lib/jquery/
32
+ static/lib/jquery/1.11.3
33
+ static/lib/modernizr/
34
+ static/lib/modernizr/2.8.3
35
+ tmp/ temporary directory
36
+ tmp/upload/ for uploaded files
37
+ .gitignore for Git
38
+