eucalypt 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 63a868422a94bde49b8b30b2e6bc5af7b7dd87099452bbb7d0dd4e64eeb4d155
4
- data.tar.gz: f3acffad61e46e0664131a530a33294ecaf376d1890c0f7a5f48cf45a163b11a
3
+ metadata.gz: f37d0ae31182679a375f2f7187055526fe29b64277f3b7f4c618d11a5382989f
4
+ data.tar.gz: b7ae9fcf4881a3a56fd9e5acaed9152bada8575acd15b7b1e600702f7f211fad
5
5
  SHA512:
6
- metadata.gz: 67a75c326f188a04327302632f5aaa41a0d1c69d4df04d14c5d849d5711fb3a4226c33dd27f2166f16f95d79cae6dc632936d20fa263693012418110d961a9dc
7
- data.tar.gz: 1cb228a0816a3176184804b1466f4b3e3145ace396e55f914e125cb23ed5d275bddb62714a45a07ab4a80d991f7cf123695e53fae34e1344e151b33f73f58809
6
+ metadata.gz: fd69f7f5cedf737faebcc0e2c54452bf521a6f40847cc83f7620d800396dc1a847d3a8d4cbfb846c70717762438f8da094f85c3cf5461dc765583ca5ede04055
7
+ data.tar.gz: 406bc23c4389ac1be9cf8097ae8a3f8f412bb3c0006d880720a7e0d76a14f5b4f3ef00cfac62de25d94442c9b5748934d360e4cf36f210305df516f202ba85f6
data/README.md CHANGED
@@ -32,25 +32,7 @@ $ eucalypt init my-new-app
32
32
 
33
33
  Move into your new application's directory and run the top-level `eucalypt` command to display a list of all available commands:
34
34
 
35
- ```bash
36
- $ eucalypt
37
-
38
- Commands:
39
- eucalypt init [NAME] ·› Sets up your application
40
- eucalypt launch [ENV] ·› Launches your application
41
- eucalypt console ·› Interactive console with all files loaded
42
- eucalypt test ·› Run all application tests
43
- eucalypt version ·› Display installed Eucalypt version
44
- eucalypt rake ·› Run all database migrations
45
- eucalypt blog [COMMAND] ·› Manage static blog environment
46
- eucalypt generate [COMMAND] ·› Generate individual MVC files or scaffolds
47
- eucalypt destroy [COMMAND] ·› Destroy individual MVC files or scaffolds
48
- eucalypt security [COMMAND] ·› Manage authentication and authorization
49
- eucalypt migration [COMMAND] ·› Generate ActiveRecord migrations
50
-
51
- For more information about a specific command, use eucalypt -H.
52
- Example: eucalypt -H generate scaffold
53
- ```
35
+ <p align="center"><img width="70%" src="gfx/cli.png"></p>
54
36
 
55
37
  ## Documentation
56
38
 
data/eucalypt.gemspec CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
13
13
  spec.license = "MIT"
14
14
  spec.files = Dir.glob('lib/**/*', File::FNM_DOTMATCH) + %w[Gemfile LICENSE README.md Rakefile eucalypt.gemspec bin/eucalypt]
15
15
  spec.bindir = "bin"
16
- spec.executables = spec.files.grep(%r{^bin/}) {|f| File.basename(f)}
16
+ spec.executables = "eucalypt"
17
17
  spec.require_paths = ["lib"]
18
18
 
19
19
  spec.required_ruby_version = "~> 2.5"
@@ -27,7 +27,6 @@ Gem::Specification.new do |spec|
27
27
  spec.add_runtime_dependency "string-builder", "~> 2.3"
28
28
  spec.add_runtime_dependency "activesupport", "~> 5.2"
29
29
  spec.add_runtime_dependency "activerecord", "~> 5.2"
30
- spec.add_runtime_dependency "bcrypt", "~> 3.1"
31
30
  spec.add_runtime_dependency "front_matter_parser", "0.2.0"
32
31
  spec.add_runtime_dependency "thor", "~> 0.20"
33
32
  spec.add_runtime_dependency "sinatra", "~> 2.0", ">= 2.0.4"
@@ -31,18 +31,6 @@ module Eucalypt
31
31
  generator.helper
32
32
  generator.controller(route: options[:route])
33
33
  generator.views
34
-
35
- assets_file = File.join(directory, 'config', 'assets.rb')
36
-
37
- File.open(assets_file) do |f|
38
- return if f.read.include? "assets.append_path Eucalypt.path 'app', 'assets', 'blog'"
39
- end
40
-
41
- insert_into_file(
42
- assets_file,
43
- " assets.append_path Eucalypt.path 'app', 'assets', 'blog'\n",
44
- after: "set :assets, Sprockets::Environment.new\n"
45
- )
46
34
  else
47
35
  Eucalypt::Error.wrong_directory
48
36
  end
@@ -1,5 +1,5 @@
1
1
  require 'sinatra'
2
- require 'bcrypt'
2
+ require 'securerandom'
3
3
  class ApplicationController < Sinatra::Base
4
4
  if settings.methods(false).include?(:maintenance)
5
5
  if settings.maintenance
@@ -14,9 +14,9 @@ class ApplicationController < Sinatra::Base
14
14
  unlink '*', &block
15
15
  end
16
16
  else
17
- define_singleton_method(:maintenance) {|&block| get "/#{BCrypt::Password.create(?1)}", &block}
17
+ define_singleton_method(:maintenance) {|&block| get "/#{SecureRandom.random_bytes 16}", &block}
18
18
  end
19
19
  else
20
- define_singleton_method(:maintenance) {|&block| get "/#{BCrypt::Password.create(?1)}", &block}
20
+ define_singleton_method(:maintenance) {|&block| get "/#{SecureRandom.random_bytes 16}", &block}
21
21
  end
22
22
  end
@@ -1,15 +1,49 @@
1
1
  require 'sinatra'
2
- class ApplicationController < Sinatra::Base
3
- def static(uri, *args)
4
- if env['HTTP_VERSION'] == 'HTTP/1.1' and env["REQUEST_METHOD"] != 'GET'
5
- status 303
6
- else
7
- status 302
2
+ module Eucalypt
3
+ class Static::Router
4
+ attr_reader :routes
5
+
6
+ def initialize(public_folder)
7
+ @routes = []
8
+ @public_folder = public_folder
8
9
  end
9
10
 
10
- # According to RFC 2616 section 14.30, "the field value consists of a
11
- # single absolute URI"
12
- response['Location'] = uri(uri.to_s, settings.absolute_redirects?, settings.prefixed_redirects?)
13
- halt(*args)
11
+ def route(file, aliases: [])
12
+ raise ArgumentError.new("Invalid argument #{file} for 'file' - Expected string (file path with preceding /)") unless file.is_a?(String) && file.start_with?('/')
13
+ location = File.join @public_folder, file.sub('/', '')
14
+ raise ArgumentError.new("Invalid argument #{file} for 'file' - File \"#{location}\" doesn't exist") unless File.file? location
15
+ raise ArgumentError.new("Invalid keyword argument #{aliases} for 'aliases' - Expected Array of String") unless aliases.is_a?(Array) && aliases.all?{|a| a.is_a? String}
16
+ raise ArgumentError.new("Invalid keyword argument #{aliases} for 'aliases' - Expected Array of route names (preceded by /)") unless aliases.all?{|a| a.start_with? '/'}
17
+ @routes << {file: file, aliases: aliases}
18
+ end
19
+
20
+ alias_method :<<, :route
21
+ end
22
+ end
23
+
24
+ class ApplicationController < Sinatra::Base
25
+ set :static_router, ->{ Eucalypt::Static::Router.new settings.public_folder }
26
+
27
+ def self.static(file = nil, aliases: [])
28
+ if settings.static_router.is_a? Eucalypt::Static::Router
29
+ if block_given?
30
+ yield settings.static_router
31
+ settings.static_router.routes.each do |route|
32
+ route.values.flatten.each do |path|
33
+ get(path) { send_file File.join(settings.public_folder, route[:file].sub('/','')) }
34
+ end
35
+ end
36
+ else
37
+ if file && aliases
38
+ raise ArgumentError.new("Invalid argument #{file} for 'file' - Expected string (file path with preceding /)") unless file.is_a?(String) && file.start_with?('/')
39
+ location = File.join settings.public_folder, file.sub('/', '')
40
+ raise ArgumentError.new("Invalid argument #{file} for 'file' - File \"#{location}\" doesn't exist") unless File.file? location
41
+ raise ArgumentError.new("Invalid keyword argument #{aliases} for 'aliases' - Expected Array of String") unless aliases.is_a?(Array) && aliases.all?{|a| a.is_a? String}
42
+ raise ArgumentError.new("Invalid keyword argument #{aliases} for 'aliases' - Expected Array of route names (preceded by /)") unless aliases.all?{|a| a.start_with? '/'}
43
+ routes = [file] + aliases
44
+ routes.each {|path| get(path){send_file location} }
45
+ end
46
+ end
47
+ end
14
48
  end
15
49
  end
@@ -7,7 +7,7 @@ gem 'rake', '~> 12.3'
7
7
  gem 'thin', '~> 1.7'
8
8
 
9
9
  # Test environment
10
- group :test, :production do
10
+ group :test do
11
11
  gem 'rack-test', '~> 1.0', require: 'rack/test'
12
12
  gem 'rspec', '~> 3.7'
13
13
  gem 'shoulda-matchers', '~> 3.1'
@@ -1,8 +1,10 @@
1
1
  class ApplicationController < Sinatra::Base
2
2
  helpers ApplicationHelper if defined? ApplicationHelper
3
3
 
4
+ static '/maintenance.html', aliases: %w[/maintenance]
5
+
4
6
  maintenance do
5
- static '/maintenance.html'
7
+ redirect '/maintenance'
6
8
  end
7
9
 
8
10
  get '/' do
@@ -9,11 +9,10 @@ class ApplicationController < Sinatra::Base
9
9
  set :app_file, __FILE__
10
10
 
11
11
  # Set public folder for static files
12
- set :public_folder, Eucalypt.path('app', 'static')
12
+ set :public_folder, Eucalypt.path('app', 'static', 'public')
13
13
 
14
- # Allow static files to be served
15
- set :static, true
16
- ::Static = Eucalypt::Static.new(settings.public_folder, symbolize: true).freeze
14
+ # Set static data accessor
15
+ ::Static = Eucalypt::Static.new(Eucalypt.path('app', 'static'), symbolize: true).freeze
17
16
 
18
17
  # Set views directory
19
18
  set :views, Eucalypt.path('app', 'views')
@@ -21,9 +20,6 @@ class ApplicationController < Sinatra::Base
21
20
  # Set default ERB template
22
21
  set :erb, layout: :'layouts/main'
23
22
 
24
- # Set IP whitelist
25
- set :whitelist, Eucalypt::Whitelist.new(Eucalypt.path 'config', 'whitelist')
26
-
27
23
  # Toggle maintenance mode
28
24
  disable :maintenance
29
25
 
@@ -1,13 +1,13 @@
1
1
  class ApplicationController < Sinatra::Base
2
2
  set :assets, Sprockets::Environment.new
3
- assets.append_path Eucalypt.path 'app', 'assets', 'stylesheets'
4
- assets.append_path Eucalypt.path 'app', 'assets', 'scripts'
5
- assets.append_path Eucalypt.path 'app', 'assets', 'images'
6
- assets.append_path Eucalypt.path 'app', 'assets', 'fonts'
7
3
 
8
4
  assets.css_compressor = :scss
9
5
  assets.js_compressor = :uglify
10
6
 
7
+ Eucalypt.glob 'app', 'assets', '*' do |item|
8
+ assets.append_path item if File.directory? item
9
+ end
10
+
11
11
  get '/assets/*' do
12
12
  env["PATH_INFO"].sub! '/assets', ''
13
13
  settings.assets.call env
@@ -0,0 +1,7 @@
1
+ class ApplicationController < Sinatra::Base
2
+ helpers do
3
+ def guard
4
+ settings.guard
5
+ end
6
+ end
7
+ end
data/lib/eucalypt/load.rb CHANGED
@@ -2,6 +2,7 @@ Eucalypt.require 'config', '*.rb'
2
2
  Eucalypt.require 'config', 'initializers', '*.rb'
3
3
 
4
4
  require 'eucalypt/core/helpers/maintenance'
5
+ require 'eucalypt/core/helpers/static'
5
6
 
6
7
  Eucalypt.require 'app', 'helpers', '{application_helper.rb}'
7
8
  Eucalypt.require 'app', 'controllers', 'application_controller.rb'
@@ -1,3 +1,3 @@
1
1
  module Eucalypt
2
- VERSION = '0.5.1'
2
+ VERSION = '0.5.2'
3
3
  end
data/lib/eucalypt.rb CHANGED
@@ -12,8 +12,6 @@ require 'eucalypt/root'
12
12
  require 'eucalypt/list'
13
13
  require 'eucalypt/core/helpers/manifest'
14
14
  require 'eucalypt/core/helpers/partial'
15
- require 'eucalypt/whitelist'
16
- require 'eucalypt/core/helpers/static'
17
15
 
18
16
  Eucalypt::CLI.extend Eucalypt::List
19
17
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eucalypt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edwin Onuonga
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-30 00:00:00.000000000 Z
11
+ date: 2019-01-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -122,20 +122,6 @@ dependencies:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: '5.2'
125
- - !ruby/object:Gem::Dependency
126
- name: bcrypt
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: '3.1'
132
- type: :runtime
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: '3.1'
139
125
  - !ruby/object:Gem::Dependency
140
126
  name: front_matter_parser
141
127
  requirement: !ruby/object:Gem::Requirement
@@ -267,7 +253,7 @@ files:
267
253
  - lib/eucalypt/core/templates/eucalypt/app/controllers/application_controller.rb
268
254
  - lib/eucalypt/core/templates/eucalypt/app/helpers/application_helper.rb
269
255
  - lib/eucalypt/core/templates/eucalypt/app/models/.empty_directory
270
- - lib/eucalypt/core/templates/eucalypt/app/static/maintenance.html
256
+ - lib/eucalypt/core/templates/eucalypt/app/static/public/maintenance.html
271
257
  - lib/eucalypt/core/templates/eucalypt/app/views/index.erb
272
258
  - lib/eucalypt/core/templates/eucalypt/app/views/layouts/main.erb
273
259
  - lib/eucalypt/core/templates/eucalypt/app/views/partials/.empty_directory
@@ -288,7 +274,6 @@ files:
288
274
  - lib/eucalypt/destroy/namespaces/destroy/cli/destroy-scaffold.rb
289
275
  - lib/eucalypt/destroy/namespaces/destroy/cli/destroy.rb
290
276
  - lib/eucalypt/errors.rb
291
- - lib/eucalypt/exceptions.rb
292
277
  - lib/eucalypt/generate/.gitkeep
293
278
  - lib/eucalypt/generate/namespaces/generate-controller/cli/generate-controller.rb
294
279
  - lib/eucalypt/generate/namespaces/generate-controller/generators/controller.rb
@@ -306,6 +291,7 @@ files:
306
291
  - lib/eucalypt/generate/namespaces/generate-model/templates/model_spec.tt
307
292
  - lib/eucalypt/generate/namespaces/generate/cli/generate-scaffold.rb
308
293
  - lib/eucalypt/generate/namespaces/generate/cli/generate.rb
294
+ - lib/eucalypt/guard.rb
309
295
  - lib/eucalypt/helpers.rb
310
296
  - lib/eucalypt/helpers/colorize.rb
311
297
  - lib/eucalypt/helpers/gemfile.rb
@@ -373,7 +359,6 @@ files:
373
359
  - lib/eucalypt/security/permissions.rb
374
360
  - lib/eucalypt/static.rb
375
361
  - lib/eucalypt/version.rb
376
- - lib/eucalypt/whitelist.rb
377
362
  homepage: https://eucalypt.gitbook.io/eucalypt
378
363
  licenses:
379
364
  - MIT
@@ -1,12 +0,0 @@
1
- module Eucalypt
2
- class NotWhitelistedError < Exception
3
- def initialize(ip)
4
- super "IP address #{ip} not whitelisted"
5
- end
6
- end
7
- class InvalidSettingTypeError < Exception
8
- def initialize(setting, actual, classes)
9
- super "!\nInvalid type for setting :#{setting}, got:\n\t#{actual},\nmust be one of:\n\t#{classes}"
10
- end
11
- end
12
- end
@@ -1,70 +0,0 @@
1
- require 'sinatra'
2
- require 'bcrypt'
3
- require_relative 'exceptions'
4
- module Eucalypt
5
- class Whitelist
6
- def initialize(file)
7
- @file = file
8
- File.new(file, "a").close
9
- add '::1', '127.0.0.1', '0.0.0.0'
10
- end
11
-
12
- def add(*to_add)
13
- to_add.flatten.each do |ip|
14
- next if include? ip
15
- File.open(@file, 'a+') do |f|
16
- lines = File.readlines(@file)
17
- if lines.empty? || lines.all? {|line| line == "\n"}
18
- File.open(@file, 'w') do |f1|
19
- f1.write "#{BCrypt::Password.create(ip)}\n"
20
- end
21
- else
22
- prefix = f.read.last == "\n" ? '' : "\n"
23
- f.puts prefix + BCrypt::Password.create(ip)
24
- end
25
- end
26
- end
27
- end
28
-
29
- def remove(*to_remove)
30
- whitelist = []
31
- hashed = File.readlines(@file).select{|ip| /\$.*/.match ip}.map(&:strip)
32
-
33
- hashed.each do |ip|
34
- if to_remove.flatten.any? {|request| BCrypt::Password.new(ip) == request}
35
- next
36
- else
37
- whitelist << ip unless whitelist.include?(ip)
38
- end
39
- end
40
-
41
- File.open(@file, 'w') {|f| f.write whitelist*("\n")<<"\n"}
42
- end
43
-
44
- def ips()
45
- File.readlines(@file).map(&:strip).
46
- select{|ip| /\$.*/.match ip}.
47
- map {|ip| BCrypt::Password.new ip}
48
- end
49
-
50
- def include?(ip)
51
- ips.any? {|whitelisted| whitelisted == ip}
52
- end
53
- end
54
- end
55
-
56
- class ApplicationController < Sinatra::Base
57
- helpers do
58
- def whitelisted?
59
- case settings.whitelist
60
- when Eucalypt::Whitelist then settings.whitelist.include?(request.ip)
61
- when FalseClass then true
62
- else raise Eucalypt::InvalidSettingTypeError.new(:whitelist, settings.whitelist.class, %w[FalseClass Eucalypt::Whitelist])
63
- end
64
- end
65
-
66
- def ip_check()
67
- raise Eucalypt::NotWhitelistedError.new(request.ip) unless whitelisted?
68
- end
69
- end
70
- end