rhail 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +77 -0
- data/bin/rhail +78 -0
- data/generator_folders/.DS_Store +0 -0
- data/generator_folders/json/.DS_Store +0 -0
- data/generator_folders/json/.ruby-version +1 -0
- data/generator_folders/json/Gemfile +6 -0
- data/generator_folders/json/Gemfile.lock +17 -0
- data/generator_folders/json/config.ru +61 -0
- data/generator_folders/json/db/database.sqlite3 +0 -0
- data/generator_folders/json/db/seed.rb +31 -0
- data/generator_folders/json/public/.DS_Store +0 -0
- data/generator_folders/json/public/img/.DS_Store +0 -0
- data/generator_folders/json/public/img/favicon.png +0 -0
- data/generator_folders/json/settings.yml +1 -0
- data/generator_folders/plain/.DS_Store +0 -0
- data/generator_folders/plain/.ruby-version +1 -0
- data/generator_folders/plain/Gemfile +6 -0
- data/generator_folders/plain/Gemfile.lock +17 -0
- data/generator_folders/plain/config.ru +59 -0
- data/generator_folders/plain/db/database.sqlite3 +0 -0
- data/generator_folders/plain/db/seed.rb +31 -0
- data/generator_folders/plain/public/.DS_Store +0 -0
- data/generator_folders/plain/public/css/styles.css +123 -0
- data/generator_folders/plain/public/html/example_one.html +35 -0
- data/generator_folders/plain/public/html/example_three.html +75 -0
- data/generator_folders/plain/public/html/example_two.html +50 -0
- data/generator_folders/plain/public/html/foot.html +22 -0
- data/generator_folders/plain/public/html/head.html +51 -0
- data/generator_folders/plain/public/html/home.html +29 -0
- data/generator_folders/plain/public/img/favicon.png +0 -0
- data/generator_folders/plain/public/img/jumbotron.jpg +0 -0
- data/generator_folders/spa/.DS_Store +0 -0
- data/generator_folders/spa/.ruby-version +1 -0
- data/generator_folders/spa/Gemfile +6 -0
- data/generator_folders/spa/Gemfile.lock +17 -0
- data/generator_folders/spa/config.ru +49 -0
- data/generator_folders/spa/db/database.sqlite3 +0 -0
- data/generator_folders/spa/db/seed.rb +31 -0
- data/generator_folders/spa/public/.DS_Store +0 -0
- data/generator_folders/spa/public/css/styles.css +123 -0
- data/generator_folders/spa/public/html/index.html +186 -0
- data/generator_folders/spa/public/img/favicon.png +0 -0
- data/generator_folders/spa/public/img/jumbotron.jpg +0 -0
- data/generator_folders/spa/public/js/another-component.js +72 -0
- data/generator_folders/spa/public/js/app.js +16 -0
- data/lib/rhail.rb +13 -0
- data/lib/rhail/generator.rb +46 -0
- data/lib/rhail/helper.rb +117 -0
- data/lib/rhail/main.rb +8 -0
- data/rhail.gemspec +46 -0
- metadata +123 -0
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Rhail
|
4
|
+
class Generator # :nodoc:
|
5
|
+
attr_reader :folder, :type
|
6
|
+
|
7
|
+
def initialize(type: 'plain', folder: './', rvm_ruby: '2.3.3', rvm_gemset: nil)
|
8
|
+
@type = type
|
9
|
+
folder = (folder == nil || folder.size == 0) ? './' : folder
|
10
|
+
@folder = File.expand_path(folder)
|
11
|
+
@rvm_ruby = rvm_ruby
|
12
|
+
@rvm_gemset = rvm_gemset || "ruby-hail-generated-#{@type}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_folder_with_app
|
16
|
+
unless Dir.exists? @folder
|
17
|
+
FileUtils.mkdir_p @folder
|
18
|
+
end
|
19
|
+
|
20
|
+
FileUtils.cp_r File.expand_path("../../../generator_folders/#{@type}", __FILE__), @folder
|
21
|
+
|
22
|
+
if @rvm_ruby
|
23
|
+
File.open("#{@folder}/#{@type}/.ruby-version", 'w+') do |f|
|
24
|
+
f.write "#{@rvm_ruby}@#{@rvm_gemset}\n"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def install_dependencies
|
30
|
+
rvm_cmd = `which rvm`.chomp
|
31
|
+
rvm_full_cmd = ''
|
32
|
+
if rvm_cmd.length > 0
|
33
|
+
rvm_full_cmd = "#{rvm_cmd} #{@rvm_ruby}@#{@rvm_gemset} do"
|
34
|
+
end
|
35
|
+
|
36
|
+
install_bundler_cmd = "cd #{@folder}/#{@type} && #{rvm_full_cmd} gem install bundler"
|
37
|
+
puts install_bundler_cmd
|
38
|
+
system(install_bundler_cmd)
|
39
|
+
|
40
|
+
bundle_install_cmd = "cd #{@folder}/#{@type} && #{rvm_full_cmd} bundle install"
|
41
|
+
puts bundle_install_cmd
|
42
|
+
system(bundle_install_cmd)
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
data/lib/rhail/helper.rb
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Rhail
|
4
|
+
|
5
|
+
##
|
6
|
+
#
|
7
|
+
# Helper for all http response related needs.
|
8
|
+
#
|
9
|
+
class Helper
|
10
|
+
##
|
11
|
+
#
|
12
|
+
# Exception for the case when Rhail::Helper.token_auth doesn't receive right parameters.
|
13
|
+
#
|
14
|
+
class FailedTokenAuth < Exception; end
|
15
|
+
|
16
|
+
##
|
17
|
+
#
|
18
|
+
# Renders html.
|
19
|
+
# It concatenates files specified in +files+ parameter.
|
20
|
+
# If +local_vars+ specified it also make Ruby string evaluation so var value will appera in html.
|
21
|
+
# If +headers+ provided also adds them, good for caching headers.
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
#
|
25
|
+
# Rhail::Helper.render_html files: %w(head home foot), local_vars: {page: 'home'}
|
26
|
+
#
|
27
|
+
def self.render_html(files: ['index'], local_vars: nil, headers: {})
|
28
|
+
|
29
|
+
res = Rack::Response.new
|
30
|
+
|
31
|
+
html = ''
|
32
|
+
if local_vars
|
33
|
+
files.each {|fn| html += eval('%Q(' + File.read("public/html/#{fn}.html") + ')') }
|
34
|
+
else
|
35
|
+
files.each {|fn| html += File.read("public/html/#{fn}.html") }
|
36
|
+
end
|
37
|
+
|
38
|
+
res['Content-Type'] = 'text/html'
|
39
|
+
headers.each do |k, v|
|
40
|
+
res[k] = v
|
41
|
+
end if headers
|
42
|
+
res.write html
|
43
|
+
|
44
|
+
res.finish
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
##
|
49
|
+
#
|
50
|
+
# Renders json form hash in +response_structure+.
|
51
|
+
# If +status+ provided overwrites 200.
|
52
|
+
# If +headers+ provided adds them to response. Good for caching headers.
|
53
|
+
#
|
54
|
+
# Example:
|
55
|
+
#
|
56
|
+
# Rhail::Helper.render_json(response_structure: some_hash)
|
57
|
+
#
|
58
|
+
def self.render_json(response_structure: {}, status: 200, headers: {})
|
59
|
+
|
60
|
+
|
61
|
+
res = Rack::Response.new([], status, {})
|
62
|
+
|
63
|
+
res['Content-Type'] = 'application/json'
|
64
|
+
headers.each do |k, v|
|
65
|
+
res[k] = v
|
66
|
+
end if headers
|
67
|
+
res.write response_structure.to_json
|
68
|
+
|
69
|
+
res.finish
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
##
|
74
|
+
#
|
75
|
+
# When JSON request is expected converts it to Hash.
|
76
|
+
#
|
77
|
+
# Example:
|
78
|
+
#
|
79
|
+
# req = Rack::Request.new(env)
|
80
|
+
# params = Rhail::Helper.params_from_json_request(req)
|
81
|
+
#
|
82
|
+
def self.params_from_json_request(req)
|
83
|
+
JSON.parse(req.body.read)
|
84
|
+
end
|
85
|
+
|
86
|
+
##
|
87
|
+
# Authenticates request based on token.
|
88
|
+
# +valid_token+ source is up to developer, in generators it's just in a config file.
|
89
|
+
# In real life you can use database or key-value storage and get it from there.
|
90
|
+
# If token is not valid renders 401 with error in json.
|
91
|
+
#
|
92
|
+
# Example:
|
93
|
+
#
|
94
|
+
# Rhail::Helper.token_auth(env['HTTP_AUTHORIZATION'], valid_token) do |t|
|
95
|
+
# Rhail::Helper.render_json(response_structure: some_hash)
|
96
|
+
# end
|
97
|
+
#
|
98
|
+
def self.token_auth(http_auth_header, valid_token)
|
99
|
+
|
100
|
+
|
101
|
+
raise FailedTokenAuth unless http_auth_header
|
102
|
+
type, token = http_auth_header.split(' ')
|
103
|
+
|
104
|
+
raise FailedTokenAuth if type != 'Token'
|
105
|
+
token_value = token.sub('token="', '').chop rescue raise(FailedTokenAuth)
|
106
|
+
raise FailedTokenAuth if token_value != valid_token
|
107
|
+
|
108
|
+
puts "Access granted"
|
109
|
+
yield token_value
|
110
|
+
|
111
|
+
rescue FailedTokenAuth, ::StandardError => e
|
112
|
+
puts e.message
|
113
|
+
render_json(response_structure: {status: '401', code: 'Unauthorized', detail: 'Access denied'}, status: 401)
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
end
|
data/lib/rhail/main.rb
ADDED
data/rhail.gemspec
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
$LOAD_PATH.push File.expand_path("../lib", __FILE__)
|
2
|
+
require 'rhail'
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'rhail'
|
6
|
+
s.version = '0.0.1'
|
7
|
+
s.date = '2017-02-12'
|
8
|
+
s.summary = "Bunch of generators and functions to make you up and running fast in Rack web-app."
|
9
|
+
|
10
|
+
s.description = <<-EOF
|
11
|
+
|
12
|
+
|````\\ | ||
|
13
|
+
|____// |____||
|
14
|
+
| \\ | ||
|
15
|
+
| \\uby | ||ail
|
16
|
+
|
17
|
+
Ruby Hail is fast-by-design Rack-based nano-framework.
|
18
|
+
It provides generator and helper to quickly create Rack-based web-apps.
|
19
|
+
|
20
|
+
You have options to make plain html-based app with basic templates. You can chain htmls and utilize ruby string interpolation.
|
21
|
+
|
22
|
+
You can generate simple json API with authentication.
|
23
|
+
|
24
|
+
Or you can go with SPA (single-page app). It uses Vue.js for UI because it shares
|
25
|
+
fast-by-design philosophy and very similar to AngularJS 1.
|
26
|
+
|
27
|
+
In all cases you have database (sqlite by default) available out of the box.
|
28
|
+
|
29
|
+
EOF
|
30
|
+
|
31
|
+
s.authors = ["Maksim Sundukov"]
|
32
|
+
s.email = 'max.sundukov@gmail.com'
|
33
|
+
s.files = Dir['{bin/*.*,lib/**/*.*,generator_folders/**/*,generator_folders/**/.*,generator_folders/**/*.*}'] + %w(LICENSE rhail.gemspec README.md) # simplify for generator_folders
|
34
|
+
s.bindir = 'bin'
|
35
|
+
s.executables << 'rhail'
|
36
|
+
s.homepage = 'https://github.com/E-Xor/rhail'
|
37
|
+
s.license = 'MIT'
|
38
|
+
|
39
|
+
s.extra_rdoc_files = []
|
40
|
+
s.rdoc_options += ['-m', 'README.md', '-x', '/generator_folders/.*|rhail.gemspec', '--title', 'Ruby Hail']
|
41
|
+
|
42
|
+
s.post_install_message = Rhail::USAGE
|
43
|
+
|
44
|
+
s.required_ruby_version = '~> 2.0' # Generated code was written and testend in ruby 2.3.0, however there's nothing specific to this ruby versions.
|
45
|
+
s.add_dependency 'rack', '~> 2.0'
|
46
|
+
end
|
metadata
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rhail
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Maksim Sundukov
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-02-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rack
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
description: "\n|````\\ | ||\n|____// |____||\n| \\ | ||\n| \\uby
|
28
|
+
| ||ail\n\nRuby Hail is fast-by-design Rack-based nano-framework.\nIt provides
|
29
|
+
generator and helper to quickly create Rack-based web-apps.\n\nYou have options
|
30
|
+
to make plain html-based app with basic templates. You can chain htmls and utilize
|
31
|
+
ruby string interpolation.\n\nYou can generate simple json API with authentication.\n\nOr
|
32
|
+
you can go with SPA (single-page app). It uses Vue.js for UI because it shares \nfast-by-design
|
33
|
+
philosophy and very similar to AngularJS 1.\n\nIn all cases you have database (sqlite
|
34
|
+
by default) available out of the box.\n\n"
|
35
|
+
email: max.sundukov@gmail.com
|
36
|
+
executables:
|
37
|
+
- rhail
|
38
|
+
extensions: []
|
39
|
+
extra_rdoc_files: []
|
40
|
+
files:
|
41
|
+
- LICENSE
|
42
|
+
- README.md
|
43
|
+
- bin/rhail
|
44
|
+
- generator_folders/.DS_Store
|
45
|
+
- generator_folders/json/.DS_Store
|
46
|
+
- generator_folders/json/.ruby-version
|
47
|
+
- generator_folders/json/Gemfile
|
48
|
+
- generator_folders/json/Gemfile.lock
|
49
|
+
- generator_folders/json/config.ru
|
50
|
+
- generator_folders/json/db/database.sqlite3
|
51
|
+
- generator_folders/json/db/seed.rb
|
52
|
+
- generator_folders/json/public/.DS_Store
|
53
|
+
- generator_folders/json/public/img/.DS_Store
|
54
|
+
- generator_folders/json/public/img/favicon.png
|
55
|
+
- generator_folders/json/settings.yml
|
56
|
+
- generator_folders/plain/.DS_Store
|
57
|
+
- generator_folders/plain/.ruby-version
|
58
|
+
- generator_folders/plain/Gemfile
|
59
|
+
- generator_folders/plain/Gemfile.lock
|
60
|
+
- generator_folders/plain/config.ru
|
61
|
+
- generator_folders/plain/db/database.sqlite3
|
62
|
+
- generator_folders/plain/db/seed.rb
|
63
|
+
- generator_folders/plain/public/.DS_Store
|
64
|
+
- generator_folders/plain/public/css/styles.css
|
65
|
+
- generator_folders/plain/public/html/example_one.html
|
66
|
+
- generator_folders/plain/public/html/example_three.html
|
67
|
+
- generator_folders/plain/public/html/example_two.html
|
68
|
+
- generator_folders/plain/public/html/foot.html
|
69
|
+
- generator_folders/plain/public/html/head.html
|
70
|
+
- generator_folders/plain/public/html/home.html
|
71
|
+
- generator_folders/plain/public/img/favicon.png
|
72
|
+
- generator_folders/plain/public/img/jumbotron.jpg
|
73
|
+
- generator_folders/spa/.DS_Store
|
74
|
+
- generator_folders/spa/.ruby-version
|
75
|
+
- generator_folders/spa/Gemfile
|
76
|
+
- generator_folders/spa/Gemfile.lock
|
77
|
+
- generator_folders/spa/config.ru
|
78
|
+
- generator_folders/spa/db/database.sqlite3
|
79
|
+
- generator_folders/spa/db/seed.rb
|
80
|
+
- generator_folders/spa/public/.DS_Store
|
81
|
+
- generator_folders/spa/public/css/styles.css
|
82
|
+
- generator_folders/spa/public/html/index.html
|
83
|
+
- generator_folders/spa/public/img/favicon.png
|
84
|
+
- generator_folders/spa/public/img/jumbotron.jpg
|
85
|
+
- generator_folders/spa/public/js/another-component.js
|
86
|
+
- generator_folders/spa/public/js/app.js
|
87
|
+
- lib/rhail.rb
|
88
|
+
- lib/rhail/generator.rb
|
89
|
+
- lib/rhail/helper.rb
|
90
|
+
- lib/rhail/main.rb
|
91
|
+
- rhail.gemspec
|
92
|
+
homepage: https://github.com/E-Xor/rhail
|
93
|
+
licenses:
|
94
|
+
- MIT
|
95
|
+
metadata: {}
|
96
|
+
post_install_message: "\n \e[32mUSAGE: rhail generate <plain|json|spa> [folder]\e[0m\n\n"
|
97
|
+
rdoc_options:
|
98
|
+
- "-m"
|
99
|
+
- README.md
|
100
|
+
- "-x"
|
101
|
+
- "/generator_folders/.*|rhail.gemspec"
|
102
|
+
- "--title"
|
103
|
+
- Ruby Hail
|
104
|
+
require_paths:
|
105
|
+
- lib
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '2.0'
|
111
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0'
|
116
|
+
requirements: []
|
117
|
+
rubyforge_project:
|
118
|
+
rubygems_version: 2.6.10
|
119
|
+
signing_key:
|
120
|
+
specification_version: 4
|
121
|
+
summary: Bunch of generators and functions to make you up and running fast in Rack
|
122
|
+
web-app.
|
123
|
+
test_files: []
|