rhail 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.
- 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: []
|