lux-fw 0.1.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. checksums.yaml +7 -0
  2. data/.version +1 -0
  3. data/bin/cli/am +250 -0
  4. data/bin/cli/assets +37 -0
  5. data/bin/cli/console +50 -0
  6. data/bin/cli/dev +1 -0
  7. data/bin/cli/eval +15 -0
  8. data/bin/cli/exceptions +62 -0
  9. data/bin/cli/generate +82 -0
  10. data/bin/cli/get +5 -0
  11. data/bin/cli/nginx +28 -0
  12. data/bin/cli/production +1 -0
  13. data/bin/cli/routes +12 -0
  14. data/bin/cli/server +1 -0
  15. data/bin/cli/stat +1 -0
  16. data/bin/forever +65 -0
  17. data/bin/job_que +39 -0
  18. data/bin/lux +87 -0
  19. data/bin/txt/nginx.conf +29 -0
  20. data/bin/txt/siege-and-puma.txt +3 -0
  21. data/lib/common/base32.rb +47 -0
  22. data/lib/common/before_and_after.rb +71 -0
  23. data/lib/common/class_attributes.rb +66 -0
  24. data/lib/common/class_method_params.rb +94 -0
  25. data/lib/common/crypt.rb +66 -0
  26. data/lib/common/folder_model.rb +50 -0
  27. data/lib/common/generic_model.rb +62 -0
  28. data/lib/common/policy.rb +54 -0
  29. data/lib/common/string_base.rb +49 -0
  30. data/lib/common/url.rb +171 -0
  31. data/lib/lux/api/api.rb +150 -0
  32. data/lib/lux/api/lib/application_api.rb +19 -0
  33. data/lib/lux/api/lib/doc_builder.rb +18 -0
  34. data/lib/lux/api/lib/dsl.rb +73 -0
  35. data/lib/lux/api/lib/model_api.rb +145 -0
  36. data/lib/lux/api/lib/rescue.rb +18 -0
  37. data/lib/lux/cache/cache.rb +71 -0
  38. data/lib/lux/cache/lib/memcached.rb +3 -0
  39. data/lib/lux/cache/lib/null.rb +23 -0
  40. data/lib/lux/cache/lib/ram.rb +38 -0
  41. data/lib/lux/cell/cell.rb +260 -0
  42. data/lib/lux/config/config.rb +88 -0
  43. data/lib/lux/controller/controller.rb +185 -0
  44. data/lib/lux/controller/lib/nav.rb +77 -0
  45. data/lib/lux/controller/lib/plugs.rb +10 -0
  46. data/lib/lux/delayed_job/delayed_job.rb +44 -0
  47. data/lib/lux/delayed_job/lib/memory.rb +14 -0
  48. data/lib/lux/delayed_job/lib/nsq.rb +3 -0
  49. data/lib/lux/delayed_job/lib/postgre.rb +6 -0
  50. data/lib/lux/delayed_job/lib/redis.rb +19 -0
  51. data/lib/lux/error/error.rb +75 -0
  52. data/lib/lux/helper/helper.rb +109 -0
  53. data/lib/lux/html/html.rb +3 -0
  54. data/lib/lux/html/lib/form.rb +81 -0
  55. data/lib/lux/html/lib/input.rb +71 -0
  56. data/lib/lux/html/lib/input_types.rb +277 -0
  57. data/lib/lux/lux.rb +164 -0
  58. data/lib/lux/mailer/mailer.rb +73 -0
  59. data/lib/lux/page/lib/encrypt_params.rb +44 -0
  60. data/lib/lux/page/lib/flash.rb +49 -0
  61. data/lib/lux/page/lib/static_file.rb +97 -0
  62. data/lib/lux/page/page.rb +271 -0
  63. data/lib/lux/rescue_from/rescue_from.rb +61 -0
  64. data/lib/lux/template/template.rb +95 -0
  65. data/lib/lux-fw.rb +48 -0
  66. data/lib/overload/array.rb +52 -0
  67. data/lib/overload/blank.rb +62 -0
  68. data/lib/overload/date.rb +58 -0
  69. data/lib/overload/file.rb +14 -0
  70. data/lib/overload/hash.rb +86 -0
  71. data/lib/overload/hash_wia.rb +282 -0
  72. data/lib/overload/inflections.rb +199 -0
  73. data/lib/overload/integer.rb +19 -0
  74. data/lib/overload/module.rb +10 -0
  75. data/lib/overload/nil.rb +8 -0
  76. data/lib/overload/object.rb +77 -0
  77. data/lib/overload/string.rb +89 -0
  78. data/lib/overload/string_inflections.rb +7 -0
  79. data/lib/overload/struct.rb +5 -0
  80. data/lib/plugins/assets/assets_plug.rb +26 -0
  81. data/lib/plugins/assets/helper_module_adapter.rb +49 -0
  82. data/lib/plugins/assets/init.rb +4 -0
  83. data/lib/plugins/db_helpers/array_and_hstore.rb +64 -0
  84. data/lib/plugins/db_helpers/arrays_and_tags.rb +23 -0
  85. data/lib/plugins/db_helpers/before_save.rb +44 -0
  86. data/lib/plugins/db_helpers/cached_find_by.rb +45 -0
  87. data/lib/plugins/db_helpers/class_and_instance.rb +120 -0
  88. data/lib/plugins/db_helpers/dataset_plugin.rb +101 -0
  89. data/lib/plugins/db_helpers/filter_wrappers.rb +21 -0
  90. data/lib/plugins/db_helpers/link_plugin.rb +95 -0
  91. data/lib/plugins/db_helpers/localize_plugin.rb +57 -0
  92. data/lib/plugins/db_helpers/primary_keys.rb +36 -0
  93. data/lib/plugins/db_helpers/typero_attributes.rb +69 -0
  94. data/lib/plugins/db_logger/init.rb +18 -0
  95. data/lib/plugins/db_logger/lux_response_adapter.rb +9 -0
  96. data/lib/plugins/paginate/helper.rb +32 -0
  97. data/lib/plugins/paginate/sequel_adapter.rb +18 -0
  98. data/lib/vendor/mini_assets/mini_asset/base.rb +167 -0
  99. data/lib/vendor/mini_assets/mini_asset/css.rb +38 -0
  100. data/lib/vendor/mini_assets/mini_asset/js.rb +38 -0
  101. data/lib/vendor/mini_assets/mini_asset.rb +31 -0
  102. data/lib/vendor/oauth/lib/facebook.rb +35 -0
  103. data/lib/vendor/oauth/lib/github.rb +37 -0
  104. data/lib/vendor/oauth/lib/google.rb +41 -0
  105. data/lib/vendor/oauth/lib/linkedin.rb +41 -0
  106. data/lib/vendor/oauth/lib/stackexchange.rb +37 -0
  107. data/lib/vendor/oauth/lib/twitter.rb +41 -0
  108. data/lib/vendor/oauth/oauth.rb +46 -0
  109. metadata +334 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5cf39a83b84a57cdc4523101a880a856a274723a
4
+ data.tar.gz: 850600181673ff261e0180dd862993060d153b26
5
+ SHA512:
6
+ metadata.gz: d47ecd1b0aac507cb33613bcdb2b2aaa1d8ff11952a5ae8a2bd40d54c8c60108d3b176a7db79c2108bbcb2cf74e1aaf52bc7b3a54139e15f09c44eab454df864
7
+ data.tar.gz: 5eb42b08476252ea35d45d06f7cc40702f9626e8f26a44b155c815b65417030ca68ddb05b93d493c66ae650208b1ddb2c9a9038fdd81500cd5f2588e3434870d
data/.version ADDED
@@ -0,0 +1 @@
1
+ 0.1.17
data/bin/cli/am ADDED
@@ -0,0 +1,250 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ENV['DB_NAME'] = ARGV[0] if ARGV[0]
4
+
5
+ require './config/application'
6
+
7
+ class AutoMigrate
8
+ attr_accessor :fields
9
+
10
+ class << self
11
+ def table(table_name)
12
+ die "table [#{table_name}] not in plural -> expected [#{table_name.to_s.pluralize}]" unless table_name.to_s.pluralize == table_name.to_s
13
+ klass = table_name.to_s.classify
14
+ unless Object.const_defined?(klass)
15
+ puts "model #{klass} not defiend for table #{table_name}".red
16
+ exit
17
+ end
18
+
19
+ unless DB.table_exists?(table_name.to_s)
20
+ # http://sequel.jeremyevans.net/rdoc/files/doc/schema_modification_rdoc.html
21
+ DB.create_table table_name do
22
+ primary_key :id, Integer
23
+ index :id, :unique=>true
24
+ end
25
+ end
26
+
27
+ t = new(table_name)
28
+ yield(t)
29
+ t.fix_fields
30
+ t.update
31
+ end
32
+
33
+ def migrate(&block)
34
+ instance_eval(&block)
35
+ end
36
+
37
+ def enable_extension(name)
38
+ DB.run "CREATE EXTENSION IF NOT EXISTS #{name};"
39
+ end
40
+
41
+ def transaction_do text
42
+ begin
43
+ DB.run 'BEGIN; %s ;COMMIT;' % text
44
+ rescue
45
+ puts caller[1].red
46
+ puts text.yellow
47
+ raise $!
48
+ end
49
+ end
50
+ end
51
+
52
+ ###
53
+
54
+ def initialize(table_name)
55
+ @table_name = table_name
56
+ @fields = {}
57
+ end
58
+
59
+ def log_run(what)
60
+ puts " #{what.green}"
61
+ self.class.transaction_do what
62
+ end
63
+
64
+ def fix_fields
65
+ for vals in @fields.values
66
+ type = vals[0]
67
+ opts = vals[1]
68
+
69
+ opts[:limit] ||= 255 if type == :string
70
+ opts[:default] ||= false if type == :boolean
71
+
72
+ opts[:null] = true unless opts[:null].class.name == 'FalseClass'
73
+ opts[:array] ||= false
74
+ opts[:unique] ||= false
75
+ opts[:default] = [] if opts[:array]
76
+ end
77
+ end
78
+
79
+ def get_db_column_type(field)
80
+ type, opts = @fields[field]
81
+ db_type = type
82
+ db_type = :varchar if type == :string
83
+ db_type = Time if type == :datetime
84
+ if opts[:array]
85
+ db_type = "#{db_type}(#{opts[:limit]})" if type == :string
86
+ db_type = "#{db_type}[]"
87
+ else
88
+ db_type = "varchar(#{opts[:limit]})" if opts[:limit]
89
+ end
90
+ db_type
91
+ end
92
+
93
+ def update
94
+ begin
95
+ obj = @table_name.to_s.classify.constantize
96
+ o = obj.new
97
+ rescue
98
+ puts "Object #{@table_name.to_s.classify.red} does not exist, yet table #{@table_name.to_s.red} exists!"
99
+ # puts $!.message
100
+ return
101
+ end
102
+
103
+ # remove extra fields
104
+ existing_fields = o.attributes.keys - ['id']
105
+ for field in (existing_fields - @fields.keys.map(&:to_s))
106
+ print "Remove colum #{@table_name}.#{field} (y/N): ".blue
107
+ if STDIN.gets.chomp.downcase.index('y')
108
+ DB.drop_column @table_name, field
109
+ puts " drop_column #{field}".green
110
+ end
111
+ end
112
+
113
+ puts "Table #{@table_name.to_s.yellow}, #{@fields.keys.length} fields"
114
+
115
+ for field, opts_in in @fields
116
+ type = opts_in[0]
117
+ opts = opts_in[1]
118
+
119
+ db_type = get_db_column_type(field)
120
+
121
+ # create missing columns
122
+ unless obj.columns.index(field.to_sym)
123
+ DB.add_column @table_name, field, db_type, opts
124
+
125
+ if opts[:array]
126
+ default = type == :string ? "ARRAY[]::character varying[]" : "ARRAY[]::integer[]"
127
+
128
+ self.class.transaction_do "ALTER TABLE #{@table_name} ALTER COLUMN #{field} SET DEFAULT #{default};"
129
+ end
130
+
131
+ puts " add_column #{field}, #{db_type}, #{opts.to_json}".green
132
+ next
133
+ end
134
+
135
+ if current = obj.db_schema[field.to_sym]
136
+ # limit changed
137
+
138
+ # if we have type set as array and in db it is not array, fix that
139
+ if opts[:array] && !current[:db_type].include?('[]')
140
+
141
+ self.class.transaction_do %[
142
+ alter table #{@table_name} alter #{field} drop default;
143
+ alter table #{@table_name} alter #{field} type #{current[:db_type]}[] using array[#{field}];
144
+ alter table #{@table_name} alter #{field} set default '{}';
145
+ ]
146
+
147
+ puts " Coverted #{@table_name}.#{field} to array type".green
148
+ end
149
+
150
+ # if we have array but scema says no array
151
+ if !opts[:array] && current[:db_type].include?('[]')
152
+ m = current[:type] == :integer ? "#{field}[0]" : "array_to_string(#{field}, ',')"
153
+
154
+ self.class.transaction_do %[
155
+ alter table #{@table_name} alter #{field} drop default;
156
+ alter table #{@table_name} alter #{field} type #{current[:db_type].sub('[]','')} using #{m};
157
+ ]
158
+
159
+ puts " Coverted #{@table_name}.#{field}[] to non array type".red
160
+ end
161
+
162
+ # ap "#{@table_name}, #{field}, #{db_type}, #{current[:max_length]}, #{opts[:limit]}" if field == 'description'
163
+ if type == :string && current[:max_length] != opts[:limit]
164
+ self.class.transaction_do "ALTER TABLE #{@table_name} ALTER COLUMN #{field} TYPE varchar(#{opts[:limit]});"
165
+ puts " #{field} limit, #{current[:max_length]}-> #{opts[:limit]}".green
166
+ end
167
+
168
+ if type == :text && current[:max_length]
169
+ self.class.transaction_do "ALTER TABLE #{@table_name} ALTER COLUMN #{field} SET DATA TYPE text"
170
+ puts " #{field} limit from #{current[:max_length]} to no limit (text type)".green
171
+ end
172
+
173
+ # null true or false
174
+ if current[:allow_null] != opts[:null]
175
+ to_run = " #{field} #{opts[:null] ? 'DROP' : 'SET'} NOT NULL"
176
+ log_run "ALTER TABLE #{@table_name} ALTER COLUMN #{to_run}"
177
+ end
178
+
179
+ # field default changed
180
+ if current[:default].to_s != opts[:default].to_s
181
+ # skip for arrays
182
+ next if opts[:array]
183
+ next if current[:default].to_s.index('{}') and opts[:default] == []
184
+ next if current[:default].to_s.starts_with?("'#{opts[:default]}':")
185
+
186
+ if opts[:default].to_s.blank?
187
+ log_run "ALTER TABLE #{@table_name} ALTER COLUMN #{field} drop default"
188
+ else
189
+ log_run "ALTER TABLE #{@table_name} ALTER COLUMN #{field} SET DEFAULT '#{opts[:default]}'; update #{@table_name} set #{field}='#{opts[:default]}' where #{field} is null;"
190
+ end
191
+ end
192
+
193
+ if opts[:index]
194
+ add_index(field)
195
+ end
196
+ end
197
+ end
198
+
199
+ end
200
+
201
+ def add_index(field)
202
+ type = @table_name.to_s.classify.constantize.new.db_schema[field][:db_type] rescue nil
203
+ # puts "#{field.to_s.yellow} (#{type})"
204
+
205
+ begin
206
+ if type.index('[]')
207
+ DB.run %[CREATE INDEX #{@table_name}_#{field}_gin_index on "#{@table_name}" USING GIN ("#{field}");]
208
+ puts " * added array GIN index on #{field}".green
209
+ else
210
+ DB.add_index(@table_name, field)
211
+ puts " * added index on #{field}".green
212
+ end
213
+ rescue; end
214
+ end
215
+
216
+ def rename(field_old, field_new)
217
+ existing_fields = @table_name.to_s.classify.constantize.new.attributes.keys.map(&:to_sym)
218
+ if existing_fields.index(field_old) && ! existing_fields.index(field_new)
219
+ DB.rename_column(@table_name, field_old, field_new)
220
+ puts " * renamed #{@table_name}.#{field_old} to #{@table_name}.#{field_new}"
221
+ puts ' * please run auto migration again'
222
+ exit
223
+ end
224
+ end
225
+
226
+ def method_missing(type, *args)
227
+ name = args[0]
228
+ opts = args[1] || {}
229
+ if [:string, :integer, :text, :boolean, :datetime, :date, :jsonb].index(type)
230
+ @fields[name] = [type, opts]
231
+ elsif [:decimal].index(type)
232
+ opts[:precision] ||= 8
233
+ opts[:scale] ||= 2
234
+ @fields[name] = [:decimal, opts]
235
+ elsif type == :timestamps
236
+ opts[:null] ||= false
237
+ @fields[:created_at] = [:datetime, opts]
238
+ @fields[:created_by] = [:integer, opts.merge(index: true)]
239
+ @fields[:updated_at] = [:datetime, opts]
240
+ @fields[:updated_by] = [:integer, opts]
241
+ elsif type == :polymorphic
242
+ @fields["#{name}_id".to_sym] = [:integer, opts.merge(index: true) ]
243
+ @fields["#{name}_type".to_sym] = [:string, opts.merge(limit: 100, index: "#{name}_id")]
244
+ else
245
+ puts "Unknown #{type.to_s.red}"
246
+ end
247
+ end
248
+ end
249
+
250
+ require './config/schema.rb'
data/bin/cli/assets ADDED
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ if ARGV[0] == 'help'
4
+ puts 'lux assets rm gzip s3://assets'
5
+ puts ' rm - remove local cached folder for assets'
6
+ puts ' gzip - gzip files (for nginx)'
7
+ puts ' s3://path - copy files to bucket (must be last argument)'
8
+ exit
9
+ end
10
+
11
+ if ARGV.include?('rm')
12
+ system 'rm -rf ./tmp/assets'
13
+ system 'rm -rf ./public/assets'
14
+ end
15
+
16
+ require './config/application'
17
+
18
+ assets = Dir['./app/assets/*/index.*'].map { |el| el.sub('./app/assets/','') }
19
+
20
+ Lux.config.assets_precompile = true
21
+
22
+ speed = Lux.speed do
23
+ # tpool is not showing compile errors
24
+ # tpool(assets) do |file|
25
+ for file in assets
26
+ asset = MiniAsset.create file
27
+ asset.compile ARGV
28
+ puts "Generated #{file.green} -> #{asset.production_file}"
29
+ end
30
+ end
31
+
32
+ puts "Asset precomlile done in #{speed}"
33
+
34
+ if ARGV.last && ARGV.last[0,5] == 's3://'
35
+ puts 'Copy to %s'.green % ARGV.last
36
+ system 'aws s3 sync ./public %s --cache-control "max-age=31536000, no-transform, public"' % ARGV.last
37
+ end
data/bin/cli/console ADDED
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ENV['LUX_VERBOSE'] ||= 'true'
4
+
5
+ load_start = Time.now
6
+
7
+ require 'awesome_print'
8
+ require 'clipboard'
9
+ require './config/application'
10
+
11
+ if File.exist?('./config/console.rb')
12
+ puts '* loading ./config/console.rb'
13
+ require './config/console'
14
+ else
15
+ puts '* ./config/console.rb not found'
16
+ end
17
+
18
+ Lux::Config.live_require_check! if Lux.config(:auto_code_reload)
19
+
20
+ puts Lux::Config.show_load_speed load_start
21
+
22
+ class Object
23
+ def cp data
24
+ data = JSON.pretty_generate(data.to_hash) if data.respond_to?(:to_hash)
25
+ Clipboard.copy data
26
+ 'copied'
27
+ end
28
+ end
29
+
30
+ begin
31
+ require 'pry'
32
+
33
+ # AwesomePrint.pry!
34
+ # nice object dump in console
35
+ Pry.print = proc { |output, data|
36
+ out = if data.is_a?(Hash)
37
+ data.class.to_s+"\n"+JSON.pretty_generate(data).gsub(/"(\w+)":/) { '"%s":' % $1.yellow }
38
+ else
39
+ data.ai
40
+ end
41
+
42
+ output.puts out
43
+ }
44
+
45
+ Pry
46
+ rescue LoadError
47
+ puts 'pry not found, starting irb'.red
48
+ require 'irb'
49
+ IRB
50
+ end.start
data/bin/cli/dev ADDED
@@ -0,0 +1 @@
1
+ LuxCli.run "rerun -p '**/*.{rb,ru}' 'puma -p %s'" % @port
data/bin/cli/eval ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require './config/application'
4
+
5
+ puts '* loading ./config/console.rb' if File.exist?('./config/console.rb')
6
+
7
+ command = ARGV.join('; ')
8
+
9
+ puts 'Command : %s' % command.light_blue
10
+
11
+ data = eval command
12
+ puts '-'
13
+ puts 'Class : %s' % data.class
14
+ puts '-'
15
+ ap data
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'colorize'
4
+
5
+ ERROR_FOLDER = './log/exceptions'
6
+
7
+ case ARGV[0]
8
+ when 'help'
9
+ puts ' lux exceptions - show all exceptions'
10
+ puts ' lux exceptions clear - to clear error folder'
11
+ puts ' lux exceptions NUMBER - to show error on specific number'
12
+ exit
13
+ when 'clear'
14
+ LuxCli.run 'rm -rf "%s"' % ERROR_FOLDER
15
+ puts '%s removed' % ERROR_FOLDER
16
+ exit
17
+ else
18
+ end
19
+
20
+ show = ARGV[0] ? ARGV[0].to_i : nil
21
+
22
+ error_folders = Dir['%s/*' % ERROR_FOLDER].sort_by { |x| File.mtime(x) }
23
+
24
+ if error_folders.length == 0
25
+ puts 'Nothing found in %s'.blue % ERROR_FOLDER
26
+ exit
27
+ end
28
+
29
+ cnt = 0
30
+
31
+ puts 'Add error number as last argument to show full erros'.blue
32
+
33
+ error_folders.each do |error_folder|
34
+ cnt += 1
35
+ next if show && show != cnt
36
+
37
+ print '%s. %s - ' % [cnt.to_s.rjust(2), error_folder.split('/').last.yellow]
38
+ file = Dir['%s/*.txt' % error_folder].sort_by{ |f| File.mtime(f) }.first
39
+ next unless file
40
+
41
+ last_update = (Time.now - File.mtime(file)).to_i
42
+
43
+ if last_update < 60
44
+ print '%s sec ago - ' % last_update.to_s.blue
45
+ elsif last_update < 60*60
46
+ print '%s mins ago - ' % (last_update/60).to_i.to_s.blue
47
+ elsif last_update < 60*60*24
48
+ print '%s hours ago - ' % (last_update/(60*60)).to_i.to_s.blue
49
+ else
50
+ print '%s days ago - ' % (last_update/(60*60*24)).to_i.to_s.blue
51
+ end
52
+
53
+ puts file.split('/').last
54
+
55
+ if show
56
+ puts "\n" + File.read(file)
57
+ exit
58
+ end
59
+
60
+ first_line = File.read(file).split("\n").first
61
+ puts ' %s' % first_line
62
+ end
data/bin/cli/generate ADDED
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # use {{object}} and {{objects}} and {{object.classify}} as template
4
+
5
+ require 'optparse'
6
+ require 'colorize'
7
+ require 'fileutils'
8
+ require 'sequel'
9
+ require 'pp'
10
+
11
+ Sequel.extension :inflector
12
+
13
+ unless ARGV[0]
14
+ puts "./generate [object singular]".red
15
+ exit
16
+ end
17
+
18
+ template_dir = 'config/templates'
19
+ exit puts "Lux::Template dir #{template_dir} is not accessible" unless Dir.exists?(template_dir)
20
+
21
+ tpl_desc = {
22
+ p:'api',
23
+ m:'model',
24
+ a:'admin',
25
+ c:'cell',
26
+ v:'view'
27
+ }
28
+
29
+ @object = ARGV[0]
30
+ @objects = @object.pluralize
31
+
32
+ puts "Singular : #{@object.yellow}"
33
+ puts "Plural : #{@objects.yellow}"
34
+
35
+ def parse_vars(data)
36
+ object = @object
37
+ objects = @objects
38
+ klass = @object.classify
39
+
40
+ data.gsub(/\{\{([^\}]+)\}\}/) { eval $1 }
41
+ end
42
+
43
+ # get all files
44
+ templates = {}
45
+ for el in Dir["./#{template_dir}/*.*"].map{ |file| file.split('/').last }
46
+ begin
47
+ data = parse_vars(File.read("#{template_dir}/#{el}"))
48
+ rescue
49
+ puts '-'
50
+ puts "File error: #{el.red}: #{$!.message}"
51
+ exit
52
+ end
53
+ type = el[0,1]
54
+
55
+ path = el.split('|', 2)[1]
56
+ path = parse_vars(path).gsub('#','/')
57
+
58
+ templates[type] ||= []
59
+ templates[type].push [path, data]
60
+ end
61
+
62
+ # # puts "Lux::Templates : #{templates.keys.sort.map{ |el| tpl_desc[el.to_sym] ? tpl_desc[el.to_sym].sub(el, el.upcase.yellow) : el.yellow }.join(', ')}"
63
+ puts "Lux::Templates : #{templates.keys.map{ |el| "#{tpl_desc[el.to_sym]}(#{el.yellow})" }.join(', ')}"
64
+ print "Execute : "
65
+
66
+ parse_templates = STDIN.gets.chomp
67
+
68
+ for type in templates.keys
69
+ next unless parse_templates.index(type)
70
+ for el in templates[type]
71
+ file, data = *el
72
+ if File.exists?(file)
73
+ print 'exists'.yellow.rjust(20)
74
+ else
75
+ FileUtils.mkdir_p(file.sub(/\/[^\/]+$/,'')) rescue false
76
+ File.open(file, 'w') { |f| f.write(data) }
77
+ print 'created'.green.rjust(20)
78
+ end
79
+ puts ": #{file}"
80
+ end
81
+ end
82
+
data/bin/cli/get ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require './config/application'
4
+
5
+ ap Lux ARGV[0] || '/'
data/bin/cli/nginx ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ command = ARGV[0]
4
+
5
+ @local_conf = './config/nginx.conf'
6
+ @nginx_conf = '/etc/nginx/sites-enabled/%s.conf' % Dir.pwd.split('/').last
7
+
8
+ def build_conf
9
+ conf = File.read(@local_conf) rescue LuxCli.die('Local conf %s not found' % @local_conf)
10
+
11
+ LuxCli.die('$ROOT not found in config') unless conf.include?('$ROOT')
12
+
13
+ conf.gsub('$ROOT', Dir.pwd)
14
+ end
15
+
16
+ case command
17
+ when 'show'
18
+ puts build_conf
19
+ when 'install'
20
+ File.write './tmp/nginx.conf', build_conf
21
+ puts '# run this manualy'
22
+ puts
23
+ puts 'sudo cp ./tmp/nginx.conf %s && sudo nginx -t' % @nginx_conf
24
+ else
25
+ puts ' show # show rendered config'
26
+ puts ' install # install config/nginx.conf to %s' % @nginx_conf
27
+ end
28
+
@@ -0,0 +1 @@
1
+ LuxCli.run "puma -p %s -e production" % @port
data/bin/cli/routes ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ENV['LUX_PRINT_ROUTES'] = 'true'
4
+
5
+ require 'awesome_print'
6
+ require './config/application'
7
+
8
+ path = ARGV[0] || '/print-routes'
9
+
10
+ puts 'Routes for test route %s' % path.green
11
+
12
+ Lux path
data/bin/cli/server ADDED
@@ -0,0 +1 @@
1
+ LuxCli.run "LUX_VERBOSE=true puma -p %s" % @port
data/bin/cli/stat ADDED
@@ -0,0 +1 @@
1
+ LuxCli.run 'goaccess -ca -f /var/log/nginx/access.log -a > public/goaccess.html'
data/bin/forever ADDED
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # better? -> https://github.com/bluepill-rb/bluepill
4
+
5
+ # ~/forever/forever.txt
6
+ # test: /Users/dux/.rvm/rubies/ruby-2.3.1/bin/ruby /Users/dux/dev/lux-fw/raumdog.com/test.rb
7
+ # test2: /Users/dux/.rvm/rubies/ruby-2.3.1/bin/ruby /Users/dux/dev/lux-fw/raumdog.com/test2.rb
8
+
9
+ # creates ~/forever/logs and ~/forever/pids
10
+ # keeps logs in size
11
+
12
+ # 1 1 * * * bash -l -c 'ruby /User/adsad/../forever'
13
+
14
+ require 'colorize'
15
+ require 'fileutils'
16
+
17
+ @root = File.expand_path('~/forever')
18
+ @max_file_size_in_mb = 1
19
+
20
+ def die(data)
21
+ puts data.red
22
+ exit
23
+ end
24
+
25
+ def demonize(id, script)
26
+ size = @max_file_size_in_mb * 1_000_000
27
+
28
+ # rotate big files
29
+ for log_file in ["#{@root}/logs/#{id}.log", "#{@root}/logs/#{id}.err"]
30
+ if File.size?(log_file).to_i > (size * 3)
31
+ puts "truncate #{log_file} to #{size}".yellow
32
+ data = File.read(log_file)
33
+ data = data[data.length - size, size]
34
+ File.open(log_file, 'w') { |f| f.write(data) }
35
+ end
36
+ end
37
+
38
+ pid_file = "#{@root}/pids/#{id}.pid"
39
+ pid = File.read(pid_file).chomp rescue nil
40
+
41
+ env_id = "FOREVER_ID=#{id}_END"
42
+
43
+ if pid && `ps aux | grep #{env_id} | grep #{pid}`.index(script)
44
+ puts "exists #{id.ljust(15)} pid #{pid}".green
45
+ else
46
+ print "starting #{id.ljust(15)} pid ".yellow
47
+ `nohup #{script} #{env_id} >> #{@root}/logs/#{id}.log 2>> #{@root}/logs/#{id}.err < /dev/null & echo $! > #{pid_file}`
48
+ puts File.read(pid_file)
49
+ end
50
+ end
51
+
52
+ file = "#{@root}/forever.txt"
53
+ die "~/forever/forever.txt not present (#{file})" unless File.exist?(file)
54
+
55
+ FileUtils.mkdir_p "#{@root}/logs"
56
+ FileUtils.mkdir_p "#{@root}/pids"
57
+
58
+ apps = File.read(file).to_s.split("\n")
59
+
60
+ for line in apps
61
+ next if line[0,1] == '#'
62
+ id, script = line.split(/\s*:\s*/, 2)
63
+ next unless script
64
+ demonize id, script
65
+ end
data/bin/job_que ADDED
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ check = `ps ax | grep ruby`.split("\n").select{ |line| line.index($0) }
4
+ check.select! { |line| !line.index("#{Process.pid} ") }
5
+
6
+ if check.length > 0
7
+ puts "Lux job_que allready running"
8
+ puts check
9
+ exit
10
+ end
11
+
12
+ eval File.read './lux/loader.rb'
13
+ Lux.delay.run!
14
+
15
+ # require 'pathname'
16
+ # pid_file = Pathname.new("./tmp/job_que.pid")
17
+
18
+ # if pid_file.exist?
19
+ # pid = pid_file.read
20
+ # proc = `ps -p #{pid} -o comm=`
21
+ # if proc.to_s.length > 1
22
+ # puts "Lux job_que allready running, pid: #{pid}"
23
+ # system "ps ax | grep #{pid} | grep ruby"
24
+ # exit
25
+ # end
26
+ # end
27
+
28
+ # pid_file.write(Process.pid)
29
+ # Kernel.at_exit { pid_file.delete }
30
+
31
+
32
+ # Lux.config.redis_server = Redis::Queue.new('__test', 'bp__test', :redis => Redis.new)
33
+ # Lux.delay.server = :memory
34
+ # Lux.delay.server = :redis
35
+ # Lux.delay.push("puts '123 abc > mem'.red")
36
+ # Lux.delay.push("puts '123 abc > redis'.red")
37
+ # Lux.delay.push(Mailer.confirm_email('rejotl@gmail.com'), :deliver)
38
+ # Mailer.confirm_email('rejotl@gmail.com').deliver_later
39
+ # Lux.delay.run!