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