keight 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
+