spiderfw 0.6.16 → 0.6.17

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 (61) hide show
  1. data/CHANGELOG +9 -0
  2. data/Rakefile +8 -5
  3. data/VERSION +1 -1
  4. data/apps/core/auth/data/locale/it/LC_MESSAGES/spider_auth.mo +0 -0
  5. data/apps/core/auth/po/it/spider_auth.po +3 -3
  6. data/apps/core/auth/po/spider_auth.pot +3 -3
  7. data/apps/core/components/data/locale/it/LC_MESSAGES/spider_components.mo +0 -0
  8. data/apps/core/components/po/it/spider_components.po +7 -7
  9. data/apps/core/components/po/spider_components.pot +7 -7
  10. data/apps/core/components/public/js/spider.js +4 -2
  11. data/apps/core/forms/data/locale/it/LC_MESSAGES/spider_forms.mo +0 -0
  12. data/apps/core/forms/po/it/spider_forms.po +2 -2
  13. data/apps/core/forms/po/spider_forms.pot +2 -2
  14. data/apps/core/forms/widgets/form/form.rb +20 -6
  15. data/apps/master/_init.rb +0 -1
  16. data/apps/master/data/locale/it/LC_MESSAGES/master.mo +0 -0
  17. data/apps/master/master.rb +4 -0
  18. data/apps/master/po/it/master.po +62 -25
  19. data/apps/master/po/master.pot +45 -20
  20. data/apps/messenger/_init.rb +2 -21
  21. data/apps/messenger/backends/sms/test.rb +25 -0
  22. data/apps/messenger/config/test.config.yml +6 -1
  23. data/apps/messenger/controllers/mixins/messenger_helper.rb +30 -5
  24. data/apps/messenger/data/locale/it/LC_MESSAGES/spider_messenger.mo +0 -0
  25. data/apps/messenger/messenger.rb +40 -2
  26. data/apps/servant/lib/commands_processor.rb +1 -1
  27. data/apps/worker/worker.rb +15 -10
  28. data/data/locale/it/LC_MESSAGES/spider.mo +0 -0
  29. data/lib/spiderfw/app.rb +3 -3
  30. data/lib/spiderfw/cache/template_cache.rb +4 -0
  31. data/lib/spiderfw/cmd/cmd.rb +0 -2
  32. data/lib/spiderfw/cmd/commands/app.rb +89 -6
  33. data/lib/spiderfw/cmd/commands/setup.rb +13 -40
  34. data/lib/spiderfw/config/configuration.rb +1 -0
  35. data/lib/spiderfw/config/options/spider.rb +9 -8
  36. data/lib/spiderfw/controller/mixins/http_mixin.rb +9 -0
  37. data/lib/spiderfw/env.rb +3 -1
  38. data/lib/spiderfw/i18n/cldr.rb +39 -13
  39. data/lib/spiderfw/i18n/i18n.rb +9 -0
  40. data/lib/spiderfw/i18n/javascript_parser.rb +1 -1
  41. data/lib/spiderfw/i18n/shtml_parser.rb +1 -1
  42. data/lib/spiderfw/model/base_model.rb +1 -1
  43. data/lib/spiderfw/model/inline_model.rb +13 -1
  44. data/lib/spiderfw/model/mappers/db_mapper.rb +5 -0
  45. data/lib/spiderfw/model/mappers/mapper.rb +9 -4
  46. data/lib/spiderfw/model/migrations/drop_element.rb +26 -0
  47. data/lib/spiderfw/model/migrations/irreversible_migration.rb +9 -0
  48. data/lib/spiderfw/model/migrations/migration.rb +7 -0
  49. data/lib/spiderfw/model/migrations/replace.rb +32 -0
  50. data/lib/spiderfw/model/migrations.rb +21 -0
  51. data/lib/spiderfw/model/model.rb +4 -1
  52. data/lib/spiderfw/model/storage/db/db_storage.rb +1 -1
  53. data/lib/spiderfw/setup/app_manager.rb +281 -200
  54. data/lib/spiderfw/setup/setup_task.rb +80 -35
  55. data/lib/spiderfw/spider.rb +28 -13
  56. data/lib/spiderfw/templates/layout.rb +40 -8
  57. data/lib/spiderfw/templates/resources/sass.rb +21 -0
  58. data/lib/spiderfw/test.rb +1 -1
  59. data/lib/spiderfw/utils/events/event_source.rb +1 -2
  60. data/lib/spiderfw/utils/gems.rb +5 -1
  61. metadata +11 -4
@@ -1,8 +1,10 @@
1
+ require 'spiderfw/model/migrations'
2
+
1
3
  module Spider
2
4
 
3
5
  class SetupTask
4
6
  attr_reader :path, :version
5
- attr_accessor :up, :down, :app
7
+ attr_accessor :before, :up, :down, :cleanup, :sync_models, :app
6
8
 
7
9
  class <<self
8
10
  def tasks
@@ -18,8 +20,11 @@ module Spider
18
20
  Thread.critical = true unless crit
19
21
  Kernel.load(path)
20
22
  obj = self.new(path)
23
+ obj.before = Setup.before
21
24
  obj.up = Setup.up
22
25
  obj.down = Setup.down
26
+ obj.cleanup = Setup.cleanup
27
+ obj.sync_models = Setup.sync_models
23
28
  #obj = @last_class.new(path)
24
29
  # Kernel.send(:remove_const, @last_class.name)
25
30
  #@last_class = nil
@@ -44,52 +49,87 @@ module Spider
44
49
  end
45
50
 
46
51
  def do_up
47
- intance_eval(&@up)
48
- sync_schema unless @no_sync || @sync_done
52
+ Spider::Model::Managed.no_set_dates = true
53
+ instance_eval(&@up)
54
+ #sync_schema unless @no_sync || @sync_done
55
+ Spider::Model::Managed.no_set_dates = false
49
56
  end
50
57
 
51
58
  def do_down
52
- instance_eval(&@down)
59
+ Spider::Model::Managed.no_set_dates = true
60
+ instance_eval(&@down) if @down
61
+ Spider::Model::Managed.no_set_dates = false
53
62
  end
54
-
55
- def no_sync_schema
56
- @no_sync = true
63
+
64
+ def do_cleanup
65
+ instance_eval(&@cleanup) if @cleanup
57
66
  end
58
-
59
- def sync_schema(*models)
60
- if models[-1].is_a?(Hash)
61
- options = models.pop
62
- else
63
- options = {}
64
- end
65
- if models.empty?
66
- models = @app.models.reject{ |m| !(m < Spider::Model::Managed) }
67
+
68
+ def do_sync
69
+ return unless @sync_models
70
+ options = {
71
+ :no_foreign_key_constraints => true
72
+ }
73
+ @sync_models.each do |m|
74
+ m.mapper.sync_schema(false, options)
67
75
  end
68
- Spider::Model.sync_schema(
69
- model, options[:force],
70
- :drop_fields => options[:drop_fields],
71
- :update_sequences => options[:update_sequences],
72
- :no_foreign_key_constraints => options[:no_foreign_key_constraints]
73
- )
74
- @sync_done = true
75
76
  end
76
77
 
77
- def sync_schema!(*models)
78
- if models[-1].is_a?(Hash)
79
- options = models.pop
80
- else
81
- options = {}
82
- end
83
- options[:force] = true
84
- args = models + [options]
85
- sync_schema(*args)
86
- end
78
+ # def no_sync_schema
79
+ # @no_sync = true
80
+ # end
81
+
82
+ # def sync_schema(*models)
83
+ # if models[-1].is_a?(Hash)
84
+ # options = models.pop
85
+ # else
86
+ # options = {}
87
+ # end
88
+ # if models.empty?
89
+ # models = @app.models.reject{ |m| !(m < Spider::Model::Managed) }
90
+ # end
91
+ # Spider::Model.sync_schema(
92
+ # model, options[:force],
93
+ # :drop_fields => options[:drop_fields],
94
+ # :update_sequences => options[:update_sequences],
95
+ # :no_foreign_key_constraints => options[:no_foreign_key_constraints]
96
+ # )
97
+ # @sync_done = true
98
+ # end
99
+
100
+ # def sync_schema!(*models)
101
+ # if models[-1].is_a?(Hash)
102
+ # options = models.pop
103
+ # else
104
+ # options = {}
105
+ # end
106
+ # options[:force] = true
107
+ # args = models + [options]
108
+ # sync_schema(*args)
109
+ # end
87
110
 
88
111
 
89
112
  end
90
113
 
91
114
  module Setup
92
-
115
+
116
+ def self.task(&proc)
117
+ self.instance_eval(&proc)
118
+ end
119
+
120
+ # TODO: pass options
121
+ def self.sync_schema(*models)
122
+ @sync_models = models
123
+ end
124
+
125
+ def self.sync_models
126
+ @sync_models
127
+ end
128
+
129
+ def self.before(&proc)
130
+ @before = proc if proc
131
+ @before
132
+ end
93
133
 
94
134
  def self.up(&proc)
95
135
  @up = proc if proc
@@ -100,7 +140,12 @@ module Spider
100
140
  @down = proc if proc
101
141
  @down
102
142
  end
143
+
144
+ def self.cleanup(&proc)
145
+ @cleanup = proc if proc
146
+ @cleanup
147
+ end
103
148
 
104
149
  end
105
150
 
106
- end
151
+ end
@@ -245,6 +245,11 @@ module Spider
245
245
  @main_process_shutdown_blocks << block
246
246
  end
247
247
 
248
+
249
+ def restart!
250
+ FileUtils.touch(@paths[:restart_file])
251
+ end
252
+
248
253
  def current
249
254
  Spider::Request.current
250
255
  end
@@ -313,7 +318,7 @@ module Spider
313
318
  def setup_paths(root)
314
319
  @paths[:root] = root
315
320
  @paths[:apps] = File.join(root, 'apps')
316
- @paths[:core_apps] = File.join($SPIDER_PATH, 'apps')
321
+ @paths[:core_apps] = $SPIDER_PATHS[:core_apps]
317
322
  @paths[:config] = File.join(root, 'config')
318
323
  @paths[:layouts] = File.join(root, 'layouts')
319
324
  @paths[:var] = File.join(root, 'var')
@@ -326,11 +331,17 @@ module Spider
326
331
  @paths[k] = File.expand_path(File.readlink(path)) if File.symlink?(path)
327
332
  end
328
333
  end
334
+
335
+ def app_paths
336
+ paths = [$SPIDER_PATHS[:core_apps]]
337
+ paths.unshift(@paths[:apps]) if @paths[:apps]
338
+ paths
339
+ end
329
340
 
330
341
  # Finds an app by name, looking in paths[:apps] and paths[:core_apps]. Returns the found path.
331
342
  def find_app(name)
332
343
  path = nil
333
- [@paths[:apps], @paths[:core_apps]].each do |base|
344
+ app_paths.each do |base|
334
345
  test = File.join(base, name)
335
346
  if File.exist?(File.join(test, '_init.rb'))
336
347
  path = test
@@ -341,7 +352,7 @@ module Spider
341
352
  end
342
353
 
343
354
  def find_apps(name)
344
- [@paths[:apps], @paths[:core_apps]].each do |base|
355
+ app_paths.each do |base|
345
356
  test = File.join(base, name)
346
357
  if File.exist?(test)
347
358
  return find_apps_in_folder(test)
@@ -359,7 +370,7 @@ module Spider
359
370
  def load_app_at_path(path)
360
371
  return if @loaded_apps[path]
361
372
  relative_path = path
362
- if path.index(Spider.paths[:root])
373
+ if Spider.paths[:root] && path.index(Spider.paths[:root])
363
374
  home = Pathname.new(Spider.paths[:root])
364
375
  pname = Pathname.new(path)
365
376
  relative_path = pname.relative_path_from(home).to_s
@@ -387,7 +398,8 @@ module Spider
387
398
  end
388
399
 
389
400
  def find_all_apps(paths=nil)
390
- paths ||= [@paths[:core_apps], @paths[:apps]]
401
+ paths ||= self.app_paths
402
+
391
403
  app_paths = []
392
404
  Find.find(*paths) do |path|
393
405
  if (File.basename(path) == '_init.rb')
@@ -456,7 +468,7 @@ module Spider
456
468
  Spider.config.loaded_files.each do |f|
457
469
  editor.load(f)
458
470
  end
459
- c_apps = Spider.config.get('apps')
471
+ c_apps = Spider.config.get('apps') || []
460
472
  c_apps = (c_apps + apps).uniq
461
473
  editor.set('apps', Spider.apps_load_order(c_apps, specs))
462
474
  editor.save
@@ -600,7 +612,7 @@ module Spider
600
612
  end
601
613
  end
602
614
  app = path_app
603
- elsif owner_class <= Spider::App
615
+ elsif owner_class <= Spider::App || owner_class == Spider
604
616
  app = owner_class
605
617
  else
606
618
  app = owner_class.app if (owner_class && owner_class.app)
@@ -777,16 +789,14 @@ module Spider
777
789
  end
778
790
 
779
791
  def locale
780
- unless Thread.current[:current_languages] # Locale sets this
781
- c_l = Spider.conf.get('locale')
782
- return c_l if c_l
783
- end
784
792
  begin
785
793
  @current_locale = Locale.current[0]
786
794
  rescue
787
795
  # There are problems with subsequent requests on Windows,
788
796
  # so use cached locale if Locale.current fails
789
- @current_locale || Locale::Tag.parse('en')
797
+ l = @current_locale
798
+ l ||= Locale::Tag.parse(Spider.conf.get('locale')) if Spider.conf.get('locale')
799
+ l ||= Locale::Tag.parse('en')
790
800
  end
791
801
  end
792
802
 
@@ -811,9 +821,14 @@ module Spider
811
821
  mod.test_teardown if mod.respond_to?(:test_teardown)
812
822
  end
813
823
  end
824
+
825
+ def interactive?
826
+ !!$SPIDER_INTERACTIVE
827
+ end
814
828
 
815
829
  def output(str, level=:INFO)
816
- if @logger_started
830
+ use_log = !Spider.interactive? && @logger_started
831
+ if use_log
817
832
  @logger.log(level, str)
818
833
  else
819
834
  str = "#{level}: #{str}" if level == :ERROR
@@ -45,6 +45,9 @@ module Spider
45
45
  next if seen[seen_check]
46
46
  seen[seen_check] = true
47
47
  type = ass[:type].to_sym
48
+
49
+ ass = compile_asset(ass)
50
+
48
51
  compress_config = case type
49
52
  when :js
50
53
  'javascript.compress'
@@ -62,16 +65,16 @@ module Spider
62
65
  end
63
66
  else
64
67
  unless pub_dest
65
- pub_dest = Spider::HomeController.pub_path+'/'+COMPILED_FOLDER
68
+ pub_dest = self.class.compiled_folder_path
66
69
  FileUtils.mkdir_p(pub_dest)
67
70
  end
68
- if comp = ass[:compressed_path]
71
+ if comp = ass[:compressed_path] # Already compressed assets
69
72
  name = File.basename(comp)
70
- if ass[:compressed_rel_path]
73
+ if ass[:compressed_rel_path] # Keeps the compressed files in a subdir
71
74
  dir = File.dirname(ass[:compressed_rel_path])
72
- if ass[:copy_dir]
75
+ if ass[:copy_dir] # Copies the source dir (which may contain resources used by the assets)
73
76
  start = dir
74
- if ass[:copy_dir].is_a?(Fixnum)
77
+ if ass[:copy_dir].is_a?(Fixnum) # How many levels to go up
75
78
  ass[:copy_dir].downto(0) do |i|
76
79
  start = File.dirname(start)
77
80
  end
@@ -96,7 +99,7 @@ module Spider
96
99
  end
97
100
  ass[:src] = Spider::HomeController.pub_url+'/'+COMPILED_FOLDER+'/'+src
98
101
  assets[type] << ass
99
- else
102
+ else # needs compression
100
103
  name = ass[:compress] || cname
101
104
  unless compress_assets[type][name]
102
105
  cpr = {:name => name, :assets => [], :cpr => true}
@@ -175,6 +178,10 @@ module Spider
175
178
  end
176
179
 
177
180
  COMPILED_FOLDER = '_c'
181
+
182
+ def self.compiled_folder_path
183
+ File.join(Spider::HomeController.pub_path, COMPILED_FOLDER)
184
+ end
178
185
 
179
186
  def asset_gettext_messages_file(path)
180
187
  dir = File.dirname(path)
@@ -182,10 +189,31 @@ module Spider
182
189
  File.join(dir, "#{name}.i18n.json")
183
190
  end
184
191
 
192
+ def compile_asset(ass)
193
+ return ass unless ass[:src]
194
+ if ass[:type] == :css
195
+ ext = File.extname(ass[:path])
196
+ if ['.scss', '.sass'].include?(ext)
197
+ dir = File.dirname(ass[:path])
198
+ base = File.basename(ass[:path], ext)
199
+ newname = "#{base}.css"
200
+ tmpdestdir = File.join(dir, 'stylesheets')
201
+
202
+ dest = File.join(tmpdestdir, newname)
203
+ require 'spiderfw/templates/resources/sass'
204
+
205
+ Spider::SassCompiler.compile(ass[:path], dest)
206
+ ass[:path] = dest
207
+ ass[:src] = File.join(File.dirname(ass[:src]), newname)
208
+ end
209
+ end
210
+ return ass
211
+ end
212
+
185
213
  def compress_javascript(cpr)
186
214
  require 'yui/compressor'
187
215
 
188
- pub_dest = Spider::HomeController.pub_path+'/'+COMPILED_FOLDER
216
+ pub_dest = self.class.compiled_folder_path
189
217
  name = cpr[:name]
190
218
 
191
219
  already_compressed = Dir.glob(pub_dest+'/'+name+'.*.js')
@@ -232,7 +260,7 @@ module Spider
232
260
  def compress_css(cpr)
233
261
  require 'yui/compressor'
234
262
 
235
- pub_dest = Spider::HomeController.pub_path+'/'+COMPILED_FOLDER
263
+ pub_dest = self.class.compiled_folder_path
236
264
  name = cpr[:name]
237
265
 
238
266
  already_compressed = Dir.glob(pub_dest+'/'+name+'.*.css')
@@ -340,6 +368,10 @@ module Spider
340
368
  end
341
369
  return compiled_name
342
370
  end
371
+
372
+ def self.clear_compiled_folder!
373
+ FileUtils.rm_rf(Dir.glob(File.join(self.compiled_folder_path, '*')))
374
+ end
343
375
 
344
376
  end
345
377
 
@@ -0,0 +1,21 @@
1
+ require 'sass'
2
+ require 'sass/plugin'
3
+
4
+ Sass::Plugin.options[:cache_location] = File.join(Spider.paths[:tmp], 'sass-cache')
5
+
6
+ module Spider
7
+
8
+ module SassCompiler
9
+
10
+ def self.compile(src, dest)
11
+ engine = Sass::Engine.for_file(src, {})
12
+ output = engine.render
13
+ File.open(dest, 'w') do |f|
14
+ f.write "/* This file is autogenerated; do not edit directly (edit #{src} instead) */\n\n"
15
+ f.write output
16
+ end
17
+ end
18
+
19
+ end
20
+
21
+ end
data/lib/spiderfw/test.rb CHANGED
@@ -52,7 +52,7 @@ module Spider; module Test
52
52
  rescue
53
53
  end
54
54
  Spider.apps.each do |name, mod|
55
- mod.before_test if mod.respond_to?(:after_test)
55
+ mod.after_test if mod.respond_to?(:after_test)
56
56
  end
57
57
  end
58
58
 
@@ -34,10 +34,9 @@ module Spider
34
34
 
35
35
  end
36
36
 
37
- def on(event_name, *params)
37
+ def on(event_name, *params, &proc)
38
38
  @event_handlers ||= {}
39
39
  @event_handlers[event_name] ||= []
40
- debugger unless proc
41
40
  @event_handlers[event_name] << proc
42
41
  end
43
42
 
@@ -3,7 +3,11 @@ module Spider
3
3
  # TODO: remove when old RubyGems versions are not a problem anymore
4
4
  def self.gem_available?(name, *requirements)
5
5
  if Gem::Specification.respond_to?(:find_by_name)
6
- Gem::Specification.find_by_name(name, *requirements)
6
+ begin
7
+ Gem::Specification.find_by_name(name, *requirements)
8
+ rescue Gem::LoadError
9
+ return false
10
+ end
7
11
  else
8
12
  Gem.available?(name, requirements.first)
9
13
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spiderfw
3
3
  version: !ruby/object:Gem::Version
4
- hash: 39
4
+ hash: 37
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 6
9
- - 16
10
- version: 0.6.16
9
+ - 17
10
+ version: 0.6.17
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ivan Pirlik
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-08-22 00:00:00 +02:00
18
+ date: 2011-09-13 00:00:00 +02:00
19
19
  default_executable: spider
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -899,6 +899,7 @@ files:
899
899
  - apps/messenger/backends/email/smtp.rb
900
900
  - apps/messenger/backends/email/test.rb
901
901
  - apps/messenger/backends/sms/smstools.rb
902
+ - apps/messenger/backends/sms/test.rb
902
903
  - apps/messenger/config/options.rb
903
904
  - apps/messenger/config/test.config.yml
904
905
  - apps/messenger/config/worker/queue.rb
@@ -1093,6 +1094,11 @@ files:
1093
1094
  - lib/spiderfw/model/mappers/mappers.rb
1094
1095
  - lib/spiderfw/model/mappers/proxy_mapper.rb
1095
1096
  - lib/spiderfw/model/mappers/vfs/flat_file.rb
1097
+ - lib/spiderfw/model/migrations/drop_element.rb
1098
+ - lib/spiderfw/model/migrations/irreversible_migration.rb
1099
+ - lib/spiderfw/model/migrations/migration.rb
1100
+ - lib/spiderfw/model/migrations/replace.rb
1101
+ - lib/spiderfw/model/migrations.rb
1096
1102
  - lib/spiderfw/model/mixins/converted.rb
1097
1103
  - lib/spiderfw/model/mixins/list.rb
1098
1104
  - lib/spiderfw/model/mixins/mixins.rb
@@ -1164,6 +1170,7 @@ files:
1164
1170
  - lib/spiderfw/templates/blocks/yield.rb
1165
1171
  - lib/spiderfw/templates/layout.rb
1166
1172
  - lib/spiderfw/templates/resources/less.rb
1173
+ - lib/spiderfw/templates/resources/sass.rb
1167
1174
  - lib/spiderfw/templates/template.rb
1168
1175
  - lib/spiderfw/templates/template_blocks.rb
1169
1176
  - lib/spiderfw/test/capybara.rb