rhail 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +77 -0
  4. data/bin/rhail +78 -0
  5. data/generator_folders/.DS_Store +0 -0
  6. data/generator_folders/json/.DS_Store +0 -0
  7. data/generator_folders/json/.ruby-version +1 -0
  8. data/generator_folders/json/Gemfile +6 -0
  9. data/generator_folders/json/Gemfile.lock +17 -0
  10. data/generator_folders/json/config.ru +61 -0
  11. data/generator_folders/json/db/database.sqlite3 +0 -0
  12. data/generator_folders/json/db/seed.rb +31 -0
  13. data/generator_folders/json/public/.DS_Store +0 -0
  14. data/generator_folders/json/public/img/.DS_Store +0 -0
  15. data/generator_folders/json/public/img/favicon.png +0 -0
  16. data/generator_folders/json/settings.yml +1 -0
  17. data/generator_folders/plain/.DS_Store +0 -0
  18. data/generator_folders/plain/.ruby-version +1 -0
  19. data/generator_folders/plain/Gemfile +6 -0
  20. data/generator_folders/plain/Gemfile.lock +17 -0
  21. data/generator_folders/plain/config.ru +59 -0
  22. data/generator_folders/plain/db/database.sqlite3 +0 -0
  23. data/generator_folders/plain/db/seed.rb +31 -0
  24. data/generator_folders/plain/public/.DS_Store +0 -0
  25. data/generator_folders/plain/public/css/styles.css +123 -0
  26. data/generator_folders/plain/public/html/example_one.html +35 -0
  27. data/generator_folders/plain/public/html/example_three.html +75 -0
  28. data/generator_folders/plain/public/html/example_two.html +50 -0
  29. data/generator_folders/plain/public/html/foot.html +22 -0
  30. data/generator_folders/plain/public/html/head.html +51 -0
  31. data/generator_folders/plain/public/html/home.html +29 -0
  32. data/generator_folders/plain/public/img/favicon.png +0 -0
  33. data/generator_folders/plain/public/img/jumbotron.jpg +0 -0
  34. data/generator_folders/spa/.DS_Store +0 -0
  35. data/generator_folders/spa/.ruby-version +1 -0
  36. data/generator_folders/spa/Gemfile +6 -0
  37. data/generator_folders/spa/Gemfile.lock +17 -0
  38. data/generator_folders/spa/config.ru +49 -0
  39. data/generator_folders/spa/db/database.sqlite3 +0 -0
  40. data/generator_folders/spa/db/seed.rb +31 -0
  41. data/generator_folders/spa/public/.DS_Store +0 -0
  42. data/generator_folders/spa/public/css/styles.css +123 -0
  43. data/generator_folders/spa/public/html/index.html +186 -0
  44. data/generator_folders/spa/public/img/favicon.png +0 -0
  45. data/generator_folders/spa/public/img/jumbotron.jpg +0 -0
  46. data/generator_folders/spa/public/js/another-component.js +72 -0
  47. data/generator_folders/spa/public/js/app.js +16 -0
  48. data/lib/rhail.rb +13 -0
  49. data/lib/rhail/generator.rb +46 -0
  50. data/lib/rhail/helper.rb +117 -0
  51. data/lib/rhail/main.rb +8 -0
  52. data/rhail.gemspec +46 -0
  53. 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
@@ -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
@@ -0,0 +1,8 @@
1
+ require 'rhail/generator'
2
+ require 'rhail/helper'
3
+
4
+ module Rhail
5
+ class Main # :nodoc:
6
+
7
+ end
8
+ end
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: []