lux-fw 0.2.3 → 0.5.32
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 +4 -4
- data/.version +1 -1
- data/bin/README.md +33 -0
- data/bin/build_gem +76 -0
- data/bin/cli/config.rb +44 -0
- data/bin/cli/console.rb +61 -0
- data/bin/cli/dbconsole.rb +8 -0
- data/bin/cli/eval.rb +32 -0
- data/bin/cli/generate.rb +88 -0
- data/bin/cli/get.rb +12 -0
- data/bin/cli/new.rb +22 -0
- data/bin/cli/routes.rb +90 -0
- data/bin/cli/secrets.rb +40 -0
- data/bin/cli/server.rb +24 -0
- data/bin/cli/stats.rb +133 -0
- data/bin/lux +24 -65
- data/lib/common/class_attributes.rb +40 -64
- data/lib/common/class_callbacks.rb +34 -51
- data/lib/common/crypt.rb +10 -8
- data/lib/common/free_struct.rb +42 -0
- data/lib/common/hash_with_indifferent_access.rb +1 -1
- data/lib/common/html_tag_builder.rb +26 -2
- data/lib/common/url.rb +58 -40
- data/lib/lux/application/application.rb +290 -117
- data/lib/lux/application/lib/nav.rb +64 -38
- data/lib/lux/application/lib/render.rb +2 -1
- data/lib/lux/cache/cache.rb +87 -62
- data/lib/lux/cache/lib/{ram.rb → memory.rb} +5 -7
- data/lib/lux/cache/lib/null.rb +6 -8
- data/lib/lux/config/config.rb +109 -52
- data/lib/lux/config/lib/plugin.rb +65 -0
- data/lib/lux/config/lib/secrets.rb +48 -0
- data/lib/lux/controller/controller.rb +241 -0
- data/lib/lux/current/current.rb +33 -47
- data/lib/lux/current/lib/session.rb +72 -0
- data/lib/lux/delayed_job/delayed_job.rb +14 -7
- data/lib/lux/delayed_job/lib/memory.rb +7 -5
- data/lib/lux/delayed_job/lib/redis.rb +1 -1
- data/lib/lux/error/error.rb +164 -62
- data/lib/lux/event_bus/event_bus.rb +27 -0
- data/lib/lux/lux.rb +103 -66
- data/lib/lux/mailer/mailer.rb +23 -25
- data/lib/lux/response/lib/file.rb +81 -0
- data/lib/lux/response/lib/header.rb +14 -1
- data/lib/lux/response/response.rb +64 -56
- data/lib/lux/view/cell.rb +102 -0
- data/lib/lux/{helper → view}/helper.rb +39 -23
- data/lib/lux/view/lib/cell_helpers.rb +29 -0
- data/lib/lux/{helper/helpers/mailer_helper.rb → view/lib/helper_modules.rb} +7 -1
- data/lib/lux/{template/template.rb → view/view.rb} +21 -24
- data/lib/lux-fw.rb +4 -2
- data/lib/overload/array.rb +12 -6
- data/lib/overload/blank.rb +0 -1
- data/lib/overload/dir.rb +18 -0
- data/lib/overload/file.rb +1 -6
- data/lib/overload/hash.rb +56 -13
- data/lib/overload/integer.rb +2 -2
- data/lib/overload/it.rb +4 -4
- data/lib/overload/object.rb +37 -8
- data/lib/overload/{r.rb → raise_variants.rb} +23 -4
- data/lib/overload/string.rb +22 -6
- data/misc/demo/app/cells/demo_cell.rb +12 -0
- data/misc/demo/app/controllers/application_controller.rb +7 -0
- data/misc/demo/app/controllers/main/root_controller.rb +9 -0
- data/misc/demo/app/routes.rb +5 -0
- data/misc/demo/config/application.rb +14 -0
- data/misc/demo/config/assets.rb +6 -0
- data/misc/demo/config/environment.rb +7 -0
- data/misc/puma_auto_tune.rb +43 -0
- data/misc/unicorn.rb +37 -0
- data/{lib/lux → plugins}/api/api.rb +46 -29
- data/plugins/api/lib/attr.rb +31 -0
- data/{lib/lux → plugins}/api/lib/dsl.rb +3 -6
- data/{lib/lux → plugins}/api/lib/error.rb +0 -0
- data/{lib/lux → plugins}/api/lib/model_api.rb +51 -12
- data/{lib/lux → plugins}/api/lib/response.rb +31 -17
- data/{bin/cli/am → plugins/db/auto_migrate/auto_migrate.rb} +18 -35
- data/plugins/db/helpers/array_search.rb +27 -0
- data/plugins/db/helpers/before_save_filters.rb +32 -0
- data/plugins/db/helpers/composite_primary_keys.rb +36 -0
- data/plugins/db/helpers/core.rb +94 -0
- data/plugins/db/helpers/dataset_methods.rb +138 -0
- data/plugins/db/helpers/enums_plugin.rb +52 -0
- data/plugins/db/helpers/find_precache.rb +31 -0
- data/plugins/db/helpers/link_objects.rb +84 -0
- data/plugins/db/helpers/schema_checks.rb +83 -0
- data/plugins/db/helpers/typero_adapter.rb +71 -0
- data/plugins/db/logger/config.rb +22 -0
- data/plugins/db/logger/lux_response_adapter.rb +10 -0
- data/plugins/db/paginate/helper.rb +32 -0
- data/plugins/db/paginate/sequel_adapter.rb +23 -0
- data/plugins/exceptions/simple_exception.rb +64 -0
- data/plugins/favicon/favicon.rb +10 -0
- data/plugins/html/html_form.rb +118 -0
- data/plugins/html/html_input.rb +98 -0
- data/plugins/html/html_menu.rb +79 -0
- data/plugins/html/input_types.rb +346 -0
- data/plugins/js_widgets/js_widgets.rb +15 -0
- data/plugins/oauth/lib/facebook.rb +35 -0
- data/plugins/oauth/lib/github.rb +38 -0
- data/plugins/oauth/lib/google.rb +41 -0
- data/plugins/oauth/lib/linkedin.rb +41 -0
- data/plugins/oauth/lib/stackexchange.rb +41 -0
- data/plugins/oauth/lib/twitter.rb +38 -0
- data/plugins/oauth/oauth.rb +42 -0
- data/{lib/common → plugins/policy}/policy.rb +6 -7
- data/tasks/loader.rb +49 -0
- metadata +151 -49
- data/bin/cli/assets +0 -41
- data/bin/cli/console +0 -51
- data/bin/cli/dev +0 -1
- data/bin/cli/eval +0 -24
- data/bin/cli/exceptions +0 -62
- data/bin/cli/generate +0 -86
- data/bin/cli/get +0 -5
- data/bin/cli/nginx +0 -34
- data/bin/cli/production +0 -1
- data/bin/cli/render +0 -18
- data/bin/cli/routes +0 -14
- data/bin/cli/server +0 -4
- data/bin/cli/stat +0 -1
- data/bin/cli/systemd +0 -36
- data/bin/txt/nginx.conf +0 -46
- data/bin/txt/siege-and-puma.txt +0 -3
- data/lib/common/base32.rb +0 -47
- data/lib/common/dynamic_class.rb +0 -28
- data/lib/common/folder_model.rb +0 -50
- data/lib/common/generic_model.rb +0 -62
- data/lib/lux/application/lib/plugs.rb +0 -10
- data/lib/lux/application/lib/route_test.rb +0 -64
- data/lib/lux/cache/lib/memcached.rb +0 -3
- data/lib/lux/cell/cell.rb +0 -261
- data/lib/lux/current/lib/static_file.rb +0 -103
- data/lib/lux/helper/helpers/application_helper.rb +0 -3
- data/lib/lux/helper/helpers/html_helper.rb +0 -3
- data/lib/overload/auto_loader.rb +0 -27
- data/lib/overload/module.rb +0 -10
- data/lib/overload/string_inflections.rb +0 -8
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 809c29122351db4ad4bd4de489f14f54c263b8911cc6d41b91d411beeaffe959
|
|
4
|
+
data.tar.gz: f4912bd49fbe63229dbccab2582c13cdf308299e4194a001c150e5e54765e7ae
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d919b51494836f5e12af3fe372689ed721607205d92bc2668dc075f795b65cb867bd0b642b228bf98cdca30e071acaf4fbaf10c68dc5057a2ddfc43ef88ea660
|
|
7
|
+
data.tar.gz: 2e514b0713c9d3dd9ad2e7c4ff91386a30fc839335a60ffa7c10d504eea8a2b1b8f76785c2568d2bd0ecc8f697d6ba5c6d674bf59fe45c502cf3b510b90490c4
|
data/.version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.5.32
|
data/bin/README.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Lux command line helper
|
|
2
|
+
|
|
3
|
+
If you run command `lux` in your app home folder, you will see something like this.
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
[master] $ lux
|
|
7
|
+
Lux (/Users/dux/dev/apps/my/gems/lux-fw, v0.5.20)
|
|
8
|
+
Commands:
|
|
9
|
+
lux config # Show server config
|
|
10
|
+
lux console # Start console
|
|
11
|
+
lux dbconsole # Get PSQL console for current database
|
|
12
|
+
lux evaluate # Eval ruby string in context of Lux::Application
|
|
13
|
+
lux generate # Genrate models, cells, ...
|
|
14
|
+
lux get # Get single page by path "lux get /login"
|
|
15
|
+
lux help [COMMAND] # Describe available commands or one specific command
|
|
16
|
+
lux routes # Print routes
|
|
17
|
+
lux secrets # Edit, show and compile secrets
|
|
18
|
+
lux server # Start web server
|
|
19
|
+
lux stats # Print project stats
|
|
20
|
+
|
|
21
|
+
Or use one of rake tasks
|
|
22
|
+
rake assets:clear # Clear all assets
|
|
23
|
+
rake assets:compile # Compile assets to public/assets and generate mainifest.json
|
|
24
|
+
rake assets:install # Install all needed packages via yarn
|
|
25
|
+
rake assets:monitor # Monitor for file changes
|
|
26
|
+
rake assets:s3_upload # Upload assets to S3
|
|
27
|
+
rake assets:show # Show all files/data in manifest
|
|
28
|
+
rake db:am # Automigrate schema
|
|
29
|
+
rake exceptions # Show exceptions
|
|
30
|
+
rake exceptions:clear # Clear all excpetions
|
|
31
|
+
rake nginx:edit # Edit nginx config
|
|
32
|
+
rake nginx:generate # Generate sample config
|
|
33
|
+
```
|
data/bin/build_gem
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'pathname'
|
|
4
|
+
require 'awesome_print'
|
|
5
|
+
|
|
6
|
+
class Doc
|
|
7
|
+
|
|
8
|
+
attr_reader :data
|
|
9
|
+
|
|
10
|
+
def initialize file
|
|
11
|
+
@file = Pathname.new file
|
|
12
|
+
@data = {}
|
|
13
|
+
read
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
|
|
18
|
+
def read
|
|
19
|
+
comments = []
|
|
20
|
+
last_line = ''
|
|
21
|
+
|
|
22
|
+
for line in @file.read.split($/)
|
|
23
|
+
line = line.sub /^\s+/, ''
|
|
24
|
+
|
|
25
|
+
if line[0,1] == '#'
|
|
26
|
+
line = '# ```ruby' if line == '# ```' && !comments.include?('```ruby')
|
|
27
|
+
comments.push line.sub('# ', '')
|
|
28
|
+
elsif line.include?('def ') && last_line[0,1] == '#' && comments[0]
|
|
29
|
+
m = line.split(/\s+/)
|
|
30
|
+
@data[m[1]] = comments
|
|
31
|
+
comments = []
|
|
32
|
+
else
|
|
33
|
+
comments = []
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
last_line = line
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
components = ['application', 'controller', 'view', 'current', 'mailer', 'config', 'cache', 'error', 'response']
|
|
42
|
+
|
|
43
|
+
data = []
|
|
44
|
+
|
|
45
|
+
for c, desc in components
|
|
46
|
+
klass = 'Lux::%s' % c.capitalize
|
|
47
|
+
readme = Pathname.new 'lib/lux/%s/README.md' % c
|
|
48
|
+
code = Pathname.new 'lib/lux/%s/%s.rb' % [c, c]
|
|
49
|
+
|
|
50
|
+
data << ''
|
|
51
|
+
data << readme.read.sub(/\s+$/, '')
|
|
52
|
+
|
|
53
|
+
blocks = Doc.new(code.to_s).data
|
|
54
|
+
|
|
55
|
+
if blocks.first
|
|
56
|
+
data << ''
|
|
57
|
+
data << '### %s methods' % klass
|
|
58
|
+
|
|
59
|
+
for name, parts in blocks
|
|
60
|
+
data << ''
|
|
61
|
+
data << '#### %s' % name
|
|
62
|
+
data << ''
|
|
63
|
+
data << parts.join($/)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
out = File.read('lib/README.md')
|
|
69
|
+
out += data.join $/
|
|
70
|
+
|
|
71
|
+
File.write './README.md', out
|
|
72
|
+
|
|
73
|
+
`rm -rf misc/demo/public/assets`
|
|
74
|
+
`rm -rf misc/demo/node_modules`
|
|
75
|
+
`rm -rf misc/demo/Gemfile.lock`
|
|
76
|
+
`rm -rf misc/demo/package.json`
|
data/bin/cli/config.rb
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
LuxCli.class_eval do
|
|
2
|
+
desc :config, 'Show server config'
|
|
3
|
+
method_option :mode, aliases: '-m', default: 'production', desc: 'One of the server modes(dev, log, production)'
|
|
4
|
+
def config
|
|
5
|
+
ENV['LUX_MODE'] = options[:mode]
|
|
6
|
+
|
|
7
|
+
require './config/application.rb'
|
|
8
|
+
|
|
9
|
+
puts 'LUX_MODE=%s (-m flag)' % ENV['LUX_MODE'].green
|
|
10
|
+
puts
|
|
11
|
+
puts 'config:'
|
|
12
|
+
Lux.config.sort.each do |key , value|
|
|
13
|
+
value = case value
|
|
14
|
+
when TrueClass
|
|
15
|
+
'true'.green
|
|
16
|
+
when FalseClass
|
|
17
|
+
'false'.red
|
|
18
|
+
when String
|
|
19
|
+
"#{value.white}"
|
|
20
|
+
when Proc
|
|
21
|
+
'proc { ... }'
|
|
22
|
+
else
|
|
23
|
+
value
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
name = ' Lux.config.%s' % key.white
|
|
27
|
+
print name.ljust(47)
|
|
28
|
+
puts '= %s' % value
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
puts
|
|
32
|
+
puts 'servers:'
|
|
33
|
+
puts ' Lux.delay.server = %s' % Lux.delay.server
|
|
34
|
+
puts ' Lux.cache.server = %s' % Lux.cache.server
|
|
35
|
+
|
|
36
|
+
puts
|
|
37
|
+
puts 'plugins:'
|
|
38
|
+
Lux.plugin.keys.each do |key|
|
|
39
|
+
puts ' Lux.plugin.%s - %s' % [key.ljust(22).white, Lux.plugin.get(key).folder]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
Object.class_callback :info, Lux::Application
|
|
43
|
+
end
|
|
44
|
+
end
|
data/bin/cli/console.rb
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'pry'
|
|
2
|
+
|
|
3
|
+
class Object
|
|
4
|
+
def cp data
|
|
5
|
+
data = JSON.pretty_generate(data.to_hash) if data.respond_to?(:to_hash)
|
|
6
|
+
Clipboard.copy data
|
|
7
|
+
'copied'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# show method info
|
|
11
|
+
# show User, :secure_hash
|
|
12
|
+
def show klass, m
|
|
13
|
+
klass = klass.class unless klass.respond_to?(:new)
|
|
14
|
+
el = klass.instance_method(m)
|
|
15
|
+
puts el.source_location.or([]).join(':').yellow
|
|
16
|
+
puts '-'
|
|
17
|
+
puts el.source
|
|
18
|
+
nil
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
ARGV[0] = 'console' if ARGV[0] == 'c'
|
|
24
|
+
|
|
25
|
+
LuxCli.class_eval do
|
|
26
|
+
desc :console, 'Start console'
|
|
27
|
+
def console
|
|
28
|
+
$lux_start_time = Time.now
|
|
29
|
+
|
|
30
|
+
require 'awesome_print'
|
|
31
|
+
require 'clipboard'
|
|
32
|
+
require './config/application'
|
|
33
|
+
|
|
34
|
+
Lux.config.dump_errors = true
|
|
35
|
+
Lux.config.log_to_stdout = true
|
|
36
|
+
|
|
37
|
+
if File.exist?('./config/console.rb')
|
|
38
|
+
puts '* loading ./config/console.rb'
|
|
39
|
+
require './config/console'
|
|
40
|
+
else
|
|
41
|
+
puts '* ./config/console.rb not found'
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# AwesomePrint.pry!
|
|
45
|
+
# nice object dump in console
|
|
46
|
+
Pry.print = proc { |output, data|
|
|
47
|
+
out = if data.is_a?(Hash)
|
|
48
|
+
data.class.to_s+"\n"+JSON.pretty_generate(data).gsub(/"(\w+)":/) { '"%s":' % $1.yellow }
|
|
49
|
+
else
|
|
50
|
+
data.ai
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
output.puts out
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
# create mock session
|
|
57
|
+
Lux::Current.new '/'
|
|
58
|
+
|
|
59
|
+
Pry.start
|
|
60
|
+
end
|
|
61
|
+
end
|
data/bin/cli/eval.rb
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
LuxCli.class_eval do
|
|
2
|
+
desc :evaluate, 'Eval ruby string in context of Lux::Application'
|
|
3
|
+
def evaluate *args
|
|
4
|
+
require './config/application'
|
|
5
|
+
|
|
6
|
+
Lux.start
|
|
7
|
+
|
|
8
|
+
if File.exist?('./config/console.rb')
|
|
9
|
+
puts '* loading ./config/console.rb'
|
|
10
|
+
load './config/console.rb'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
command = ARGV.drop(1).join('; ')
|
|
14
|
+
|
|
15
|
+
puts 'Command : %s' % command.light_blue
|
|
16
|
+
|
|
17
|
+
data = eval command
|
|
18
|
+
|
|
19
|
+
puts '-'
|
|
20
|
+
puts 'Class : %s' % data.class
|
|
21
|
+
puts '-'
|
|
22
|
+
|
|
23
|
+
if data.is_a?(String) && data.include?('</body>')
|
|
24
|
+
require 'nokogiri'
|
|
25
|
+
puts Nokogiri::XML(data, &:noblanks)
|
|
26
|
+
else
|
|
27
|
+
ap data
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
exit
|
|
31
|
+
end
|
|
32
|
+
end
|
data/bin/cli/generate.rb
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
require 'sequel'
|
|
3
|
+
require 'pp'
|
|
4
|
+
|
|
5
|
+
Sequel.extension :inflector
|
|
6
|
+
|
|
7
|
+
module LuxGenerate
|
|
8
|
+
extend self
|
|
9
|
+
|
|
10
|
+
def generate object=nil, objects=nil
|
|
11
|
+
unless object
|
|
12
|
+
puts "./generate [object singular]".red
|
|
13
|
+
exit
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
template_dir = 'config/templates'
|
|
17
|
+
exit puts "Lux::View dir #{template_dir} is not accessible" unless Dir.exists?(template_dir)
|
|
18
|
+
|
|
19
|
+
tpl_desc = {
|
|
20
|
+
p:'api',
|
|
21
|
+
m:'model',
|
|
22
|
+
a:'admin',
|
|
23
|
+
c:'cell',
|
|
24
|
+
v:'view'
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@object = object
|
|
28
|
+
@objects = objects || @object.pluralize
|
|
29
|
+
|
|
30
|
+
puts "Singular : #{@object.yellow}"
|
|
31
|
+
puts "Plural : #{@objects.yellow}"
|
|
32
|
+
|
|
33
|
+
def parse_vars(data)
|
|
34
|
+
object = @object
|
|
35
|
+
objects = @objects
|
|
36
|
+
klass = @object.classify
|
|
37
|
+
|
|
38
|
+
data.gsub(/\{\{([^\}]+)\}\}/) { eval $1 }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# get all files
|
|
42
|
+
templates = {}
|
|
43
|
+
for el in Dir["./#{template_dir}/*.*"].map{ |file| file.split('/').last }
|
|
44
|
+
begin
|
|
45
|
+
data = parse_vars(File.read("#{template_dir}/#{el}"))
|
|
46
|
+
rescue
|
|
47
|
+
puts '-'
|
|
48
|
+
puts "File error: #{el.red}: #{$!.message}"
|
|
49
|
+
exit
|
|
50
|
+
end
|
|
51
|
+
type = el[0,1]
|
|
52
|
+
|
|
53
|
+
path = el.split('|', 2)[1]
|
|
54
|
+
path = parse_vars(path).gsub('#','/')
|
|
55
|
+
|
|
56
|
+
templates[type] ||= []
|
|
57
|
+
templates[type].push [path, data]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# # puts "Lux::Views : #{templates.keys.sort.map{ |el| tpl_desc[el.to_sym] ? tpl_desc[el.to_sym].sub(el, el.upcase.yellow) : el.yellow }.join(', ')}"
|
|
61
|
+
puts "Lux::Views : #{templates.keys.map{ |el| "#{tpl_desc[el.to_sym]}(#{el.yellow})" }.join(', ')}"
|
|
62
|
+
print "Execute : "
|
|
63
|
+
|
|
64
|
+
parse_templates = STDIN.gets.chomp
|
|
65
|
+
|
|
66
|
+
for type in templates.keys
|
|
67
|
+
next unless parse_templates.index(type)
|
|
68
|
+
for el in templates[type]
|
|
69
|
+
file, data = *el
|
|
70
|
+
if File.exists?(file)
|
|
71
|
+
print 'exists'.yellow.rjust(20)
|
|
72
|
+
else
|
|
73
|
+
FileUtils.mkdir_p(file.sub(/\/[^\/]+$/,'')) rescue false
|
|
74
|
+
File.open(file, 'w') { |f| f.write(data) }
|
|
75
|
+
print 'created'.green.rjust(20)
|
|
76
|
+
end
|
|
77
|
+
puts ": #{file}"
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
LuxCli.class_eval do
|
|
84
|
+
desc :generate, 'Genrate models, cells, ...'
|
|
85
|
+
def generate object, objects=nil
|
|
86
|
+
LuxGenerate.generate object, objects
|
|
87
|
+
end
|
|
88
|
+
end
|
data/bin/cli/get.rb
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
LuxCli.class_eval do
|
|
2
|
+
desc :get, 'Get single page by path "lux get /login"'
|
|
3
|
+
method_option :hide, desc: 'Hide body', type: :boolean, aliases: "-h", default: false
|
|
4
|
+
def get path
|
|
5
|
+
require './config/application'
|
|
6
|
+
|
|
7
|
+
data = Lux.app.render(path)
|
|
8
|
+
data[:body] = 'BODY lenght: %s kB' % (data[:body].length.to_f/1024).round(1) if options[:hide]
|
|
9
|
+
ap data
|
|
10
|
+
puts '-h true if you want to hide body' unless options[:hide]
|
|
11
|
+
end
|
|
12
|
+
end
|
data/bin/cli/new.rb
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
LuxCli.class_eval do
|
|
2
|
+
desc 'new APP_NAME', 'Creates new lux application'
|
|
3
|
+
def new app_folder
|
|
4
|
+
Cli.die 'Folder allready exists' if Dir.exist?(app_folder)
|
|
5
|
+
|
|
6
|
+
Dir.mkdir(app_folder)
|
|
7
|
+
|
|
8
|
+
demo_path = Pathname.new(__dir__).join('../../misc/demo').to_s
|
|
9
|
+
|
|
10
|
+
Cli.run "rsync -a -v --ignore-existing '#{demo_path}/' ./#{app_folder}"
|
|
11
|
+
|
|
12
|
+
Dir.chdir(app_folder) do
|
|
13
|
+
Cli.run "bundle install"
|
|
14
|
+
Cli.run "bundle exec lux_assets install"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
puts
|
|
18
|
+
puts 'Success! now:'.green
|
|
19
|
+
puts 'cd %s' % app_folder
|
|
20
|
+
puts 'lux s'
|
|
21
|
+
end
|
|
22
|
+
end
|
data/bin/cli/routes.rb
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
LuxCli.class_eval do
|
|
2
|
+
desc :routes, 'Print routes'
|
|
3
|
+
def routes
|
|
4
|
+
require './config/application'
|
|
5
|
+
|
|
6
|
+
# overload route methods to print routes
|
|
7
|
+
::Lux::Application.class_eval do
|
|
8
|
+
def error *args
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def indent value=nil
|
|
12
|
+
@indent ||= 0
|
|
13
|
+
@indent += value if value
|
|
14
|
+
' ' * @indent
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def show_route route, target
|
|
18
|
+
route = route.keys.first if route.is_a?(Hash)
|
|
19
|
+
|
|
20
|
+
controller = nil
|
|
21
|
+
|
|
22
|
+
if route.is_a?(Array)
|
|
23
|
+
for rut in route
|
|
24
|
+
rut = rut.to_s
|
|
25
|
+
rut = [@prefix, rut].join('/') if @prefix
|
|
26
|
+
print "#{indent}/#{rut}".ljust(50)
|
|
27
|
+
puts ["#{target}_controller".classify, rut].join ' # '
|
|
28
|
+
end
|
|
29
|
+
return
|
|
30
|
+
elsif target.is_a?(String)
|
|
31
|
+
target = target.split('#')
|
|
32
|
+
target[0] += '_controller'
|
|
33
|
+
target[0] = target[0].classify
|
|
34
|
+
controller = target[0].constantize rescue nil
|
|
35
|
+
target = target.join(' # ')
|
|
36
|
+
else
|
|
37
|
+
controller = target
|
|
38
|
+
target = target
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
route = route.to_s
|
|
42
|
+
route = [@prefix, route].join('/') if @prefix
|
|
43
|
+
route = '/%s' % route unless route.include?('/')
|
|
44
|
+
route += '/*' unless target.include?('#')
|
|
45
|
+
route = "#{@prefix}/*" if route .include?('#')
|
|
46
|
+
print "#{indent}#{route}".ljust(50)
|
|
47
|
+
print target.ljust(50)
|
|
48
|
+
|
|
49
|
+
if controller && !target.include?('#')
|
|
50
|
+
puts
|
|
51
|
+
for el in controller.instance_methods(false)
|
|
52
|
+
print " #{route.to_s.sub('/*', '/')}#{el}".ljust(50)
|
|
53
|
+
puts [target, el].join(' # ')
|
|
54
|
+
end
|
|
55
|
+
else
|
|
56
|
+
puts
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def map obj, &block
|
|
61
|
+
if @target
|
|
62
|
+
target = @target.is_a?(String) && !@target.include?('#') ? @target + "##{obj}" : @target
|
|
63
|
+
show_route obj, target
|
|
64
|
+
elsif obj.is_a?(Hash)
|
|
65
|
+
show_route obj.keys.first, obj.values.first
|
|
66
|
+
elsif block_given?
|
|
67
|
+
@target = obj
|
|
68
|
+
yield
|
|
69
|
+
@target = nil
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def namespace name
|
|
74
|
+
name = ':%s' % name if name.is_a?(Symbol)
|
|
75
|
+
@prefix = '%s/%s' % [@prefix, name]
|
|
76
|
+
puts '%s (namespace)' % name.yellow
|
|
77
|
+
indent 1
|
|
78
|
+
yield
|
|
79
|
+
indent -1
|
|
80
|
+
@prefix = nil
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
begin
|
|
85
|
+
Lux::Application.render '/route-mock'
|
|
86
|
+
rescue => e
|
|
87
|
+
"#{e.class} - #{e.message}"
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
data/bin/cli/secrets.rb
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
LuxCli.class_eval do
|
|
2
|
+
desc :secrets, 'Edit, show and compile secrets'
|
|
3
|
+
def secrets
|
|
4
|
+
require 'lux-fw'
|
|
5
|
+
|
|
6
|
+
@secrets = Lux::Config::Secrets.new
|
|
7
|
+
|
|
8
|
+
# create secret from template (config/secrets.enc)
|
|
9
|
+
# or read file (tmp/secrets.yaml) if one exist
|
|
10
|
+
unless @secrets.read_file.exist?
|
|
11
|
+
if @secrets.secret_file.exist?
|
|
12
|
+
@secrets.read_file.write @secrets.encoded_data
|
|
13
|
+
Cli.info 'CREATED read file %s from secrets file' % @secrets.read_file
|
|
14
|
+
# encoded = JWT.encode @secrets.read_file.read, @secrets.secret, @secrets.strength
|
|
15
|
+
# @secrets.secret_file.write encoded
|
|
16
|
+
# Cli.info 'Written secret file %s' % @secrets.secret_file
|
|
17
|
+
else
|
|
18
|
+
data = "version: 1\n\n"
|
|
19
|
+
data += %w[shared production development].map{ |it| "%s:\n key: value" % it }.join("\n\n")
|
|
20
|
+
@secrets.read_file.write data
|
|
21
|
+
Cli.info '@Secrets file "%s" created from template.' % @secrets.read_file
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# edit ecrets file
|
|
26
|
+
vim = `which vim`.chomp.or('vi')
|
|
27
|
+
system '%s %s' % [vim, @secrets.read_file]
|
|
28
|
+
|
|
29
|
+
# write secrets file if needed
|
|
30
|
+
if !@secrets.secret_file.exist? || (@secrets.secret_file.ctime < @secrets.read_file.ctime)
|
|
31
|
+
@secrets.write
|
|
32
|
+
Cli.info 'Written secret file %s' % @secrets.secret_file
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# show secret for easier debuging and dump secrets
|
|
36
|
+
Cli.info 'secret: "%s"' % @secrets.secret
|
|
37
|
+
Cli.info 'dump for ENV %s' % Lux.env
|
|
38
|
+
puts @secrets.to_h.pretty_generate
|
|
39
|
+
end
|
|
40
|
+
end
|
data/bin/cli/server.rb
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
if ARGV[0] == 's'
|
|
2
|
+
ARGV[0] = 'server'
|
|
3
|
+
elsif ARGV[0] == 'ss'
|
|
4
|
+
# production mode with logging
|
|
5
|
+
ARGV = %w{server -m log }
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
LuxCli.class_eval do
|
|
9
|
+
desc :server, 'Start web server'
|
|
10
|
+
method_option :port, aliases: '-p', default: 3000, desc: 'Port to run app on', type: :numeric
|
|
11
|
+
method_option :mode, aliases: '-m', default: 'dev', desc: 'One of the server modes(dev, log, production)'
|
|
12
|
+
method_option :env, aliases: '-e', default: 'd', desc: 'Environemnt, only first chart counts'
|
|
13
|
+
method_option :rerun, aliases: '-r', default: false, desc: 'rerun app on every file chenge', type: :boolean
|
|
14
|
+
def server
|
|
15
|
+
mode = 'LUX_MODE=%s' % options[:mode]
|
|
16
|
+
env = options[:env][0,1] == 'p' ? 'production' : 'development'
|
|
17
|
+
|
|
18
|
+
if options[:rerun]
|
|
19
|
+
Cli.run "#{mode} rerun -p '**/*.{rb,ru}' -d . -d #{LUX_ROOT} 'lux s -p #{options[:port]}'"
|
|
20
|
+
else
|
|
21
|
+
Cli.run "#{mode} puma -e #{env} -p #{options[:port]}"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
data/bin/cli/stats.rb
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
class LuxStat
|
|
2
|
+
def call name, title=nil
|
|
3
|
+
puts (title || name.to_s.capitalize).yellow
|
|
4
|
+
send name
|
|
5
|
+
puts
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def controllers
|
|
9
|
+
list_method_classes Lux::Controller
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def cells
|
|
13
|
+
list_method_classes ViewCell
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def models
|
|
17
|
+
list = ObjectSpace
|
|
18
|
+
.each_object(Class)
|
|
19
|
+
.select{ |it| it.ancestors.include?(ApplicationModel) }
|
|
20
|
+
.map(&:to_s)
|
|
21
|
+
.sort
|
|
22
|
+
.drop(1)
|
|
23
|
+
.map(&:constantize)
|
|
24
|
+
|
|
25
|
+
desc = list.length.pluralize(:models)
|
|
26
|
+
mcnt = list.inject(0){ |t, m| t + m.instance_methods(false).length }
|
|
27
|
+
|
|
28
|
+
list = list.map(&:to_s)
|
|
29
|
+
|
|
30
|
+
while data = get_line(list, 100)
|
|
31
|
+
puts ' ' + data
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
puts " #{desc} and #{mcnt.pluralize(:method)}".blue
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def views
|
|
38
|
+
view_dirs = Dir
|
|
39
|
+
.entries('./app/views')
|
|
40
|
+
.drop(2)
|
|
41
|
+
.select { |it| File.directory?('./app/views/%s' % it) }
|
|
42
|
+
|
|
43
|
+
for dir in view_dirs
|
|
44
|
+
files = `find app/views/#{dir}/ -type f`.count($/)
|
|
45
|
+
puts " #{files.pluralize(:file).rjust(9).white} in #{dir.blue}"
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def total
|
|
51
|
+
dirs = Dir
|
|
52
|
+
.entries('./app')
|
|
53
|
+
.drop(2)
|
|
54
|
+
.select { |it| File.directory?('./app/%s' % it) }
|
|
55
|
+
|
|
56
|
+
max_len = dirs.max_by(&:length).length + 1
|
|
57
|
+
|
|
58
|
+
for el in dirs
|
|
59
|
+
files = `find ./app/#{el}/ -type f`.count($/)
|
|
60
|
+
lines = `find ./app/#{el}/ -type f | xargs wc -l`.split($/).last.to_i
|
|
61
|
+
puts " #{files.pluralize(:files).rjust(9).white} and #{lines.pluralize(:lines).rjust(12).white} in #{el.blue}"
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def total_ext
|
|
66
|
+
for ext in [:js, :coffee, :scss, :css, :rb, :haml, :html]
|
|
67
|
+
lines = `find ./app -type f -name '*.#{ext}' | xargs wc -l`.split($/)
|
|
68
|
+
cnt = lines.pop.to_i
|
|
69
|
+
puts "#{ext.to_s.rjust(8).white} #{cnt.pluralize(:line).rjust(14)} in #{lines.length.pluralize(:files)}"
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def get_line list, len
|
|
77
|
+
data = list.shift || return
|
|
78
|
+
|
|
79
|
+
while data.length < len
|
|
80
|
+
el = list.shift
|
|
81
|
+
return data unless el
|
|
82
|
+
data += ', %s' % el
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
data
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def list_method_classes name
|
|
89
|
+
classes = ObjectSpace
|
|
90
|
+
.each_object(Class)
|
|
91
|
+
.select{ |it| it.ancestors.include?(name) }
|
|
92
|
+
.reject{ |it| it == name }
|
|
93
|
+
.map(&:to_s)
|
|
94
|
+
.reject{ |it| it[0,1]=='#' }
|
|
95
|
+
.sort
|
|
96
|
+
.map(&:constantize)
|
|
97
|
+
|
|
98
|
+
max = classes.inject(0) { |t, it| t = it.to_s.length if it.to_s.length > t; t }
|
|
99
|
+
n_methods = 0
|
|
100
|
+
|
|
101
|
+
for klass in classes
|
|
102
|
+
list = klass.instance_methods(false).map(&:to_s)
|
|
103
|
+
next unless list.first
|
|
104
|
+
|
|
105
|
+
n_methods += list.length
|
|
106
|
+
|
|
107
|
+
prefix = ' ' + klass.to_s.ljust(max + 2).white
|
|
108
|
+
|
|
109
|
+
while data = get_line(list, 100 - max)
|
|
110
|
+
print prefix
|
|
111
|
+
puts data
|
|
112
|
+
prefix = ' ' * max + ' '
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
puts " #{n_methods.pluralize('method')} in #{classes.length.pluralize('classes')}".blue
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
LuxCli.class_eval do
|
|
121
|
+
desc :stats, 'Print project stats'
|
|
122
|
+
def stats
|
|
123
|
+
require './config/application'
|
|
124
|
+
|
|
125
|
+
stat = LuxStat.new
|
|
126
|
+
stat.call :controllers
|
|
127
|
+
stat.call :cells if defined?(ViewCell)
|
|
128
|
+
stat.call :models
|
|
129
|
+
stat.call :views
|
|
130
|
+
stat.call :total, 'Totals per folder in ./app'
|
|
131
|
+
stat.call :total_ext, 'Totals per file type in ./app'
|
|
132
|
+
end
|
|
133
|
+
end
|