nitro 0.25.0 → 0.26.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. data/CHANGELOG +531 -1
  2. data/ProjectInfo +29 -5
  3. data/README +1 -1
  4. data/doc/AUTHORS +12 -6
  5. data/doc/RELEASES +114 -0
  6. data/lib/glue/sweeper.rb +71 -0
  7. data/lib/nitro.rb +19 -12
  8. data/lib/nitro/adapter/cgi.rb +4 -0
  9. data/lib/nitro/adapter/webrick.rb +4 -2
  10. data/lib/nitro/caching.rb +1 -0
  11. data/lib/nitro/caching/fragments.rb +7 -1
  12. data/lib/nitro/caching/output.rb +6 -1
  13. data/lib/nitro/caching/stores.rb +13 -1
  14. data/lib/nitro/cgi.rb +9 -1
  15. data/lib/nitro/cgi/request.rb +11 -3
  16. data/lib/nitro/cgi/utils.rb +24 -2
  17. data/lib/nitro/compiler.rb +89 -63
  18. data/lib/nitro/compiler/cleanup.rb +16 -0
  19. data/lib/nitro/compiler/elements.rb +117 -0
  20. data/lib/nitro/compiler/markup.rb +3 -1
  21. data/lib/nitro/compiler/morphing.rb +203 -73
  22. data/lib/nitro/compiler/script_generator.rb +14 -0
  23. data/lib/nitro/compiler/shaders.rb +1 -1
  24. data/lib/nitro/context.rb +5 -6
  25. data/lib/nitro/controller.rb +43 -21
  26. data/lib/nitro/dispatcher.rb +86 -37
  27. data/lib/nitro/element.rb +3 -105
  28. data/lib/nitro/helper/benchmark.rb +3 -0
  29. data/lib/nitro/helper/dojo.rb +0 -0
  30. data/lib/nitro/helper/form.rb +85 -255
  31. data/lib/nitro/helper/form/controls.rb +274 -0
  32. data/lib/nitro/helper/javascript.rb +86 -6
  33. data/lib/nitro/helper/pager.rb +5 -0
  34. data/lib/nitro/helper/prototype.rb +49 -0
  35. data/lib/nitro/helper/scriptaculous.rb +0 -0
  36. data/lib/nitro/helper/xhtml.rb +11 -8
  37. data/lib/nitro/helper/xml.rb +1 -1
  38. data/lib/nitro/routing.rb +8 -1
  39. data/lib/nitro/scaffolding.rb +344 -0
  40. data/lib/nitro/server.rb +5 -1
  41. data/lib/nitro/server/runner.rb +19 -15
  42. data/lib/nitro/session.rb +32 -56
  43. data/lib/nitro/session/drbserver.rb +1 -1
  44. data/lib/nitro/session/file.rb +34 -15
  45. data/lib/nitro/session/memory.rb +13 -4
  46. data/lib/nitro/session/og.rb +56 -0
  47. data/proto/public/js/controls.js +30 -1
  48. data/proto/public/js/dragdrop.js +211 -146
  49. data/proto/public/js/effects.js +261 -399
  50. data/proto/public/js/prototype.js +131 -72
  51. data/proto/public/scaffold/edit.xhtml +10 -3
  52. data/proto/public/scaffold/form.xhtml +1 -7
  53. data/proto/public/scaffold/index.xhtml +20 -0
  54. data/proto/public/scaffold/list.xhtml +15 -8
  55. data/proto/public/scaffold/new.xhtml +10 -3
  56. data/proto/public/scaffold/search.xhtml +28 -0
  57. data/proto/public/scaffold/view.xhtml +8 -0
  58. data/proto/run.rb +93 -1
  59. data/src/part/admin.rb +4 -2
  60. data/src/part/admin/controller.rb +62 -28
  61. data/src/part/admin/skin.rb +8 -8
  62. data/src/part/admin/system.css +135 -0
  63. data/src/part/admin/template/index.xhtml +8 -12
  64. data/test/nitro/caching/tc_stores.rb +17 -0
  65. data/test/nitro/tc_caching.rb +1 -4
  66. data/test/nitro/tc_dispatcher.rb +22 -10
  67. data/test/nitro/tc_element.rb +1 -1
  68. data/test/nitro/tc_session.rb +23 -11
  69. data/test/public/blog/another/very_litle/index.xhtml +1 -0
  70. metadata +29 -15
  71. data/lib/nitro/dispatcher/general.rb +0 -62
  72. data/lib/nitro/dispatcher/nice.rb +0 -57
  73. data/lib/nitro/scaffold.rb +0 -171
  74. data/proto/public/index.xhtml +0 -83
  75. data/proto/public/js/scaffold.js +0 -74
  76. data/proto/public/settings.xhtml +0 -66
@@ -2,14 +2,14 @@
2
2
 
3
3
  TITLE : &title Nitro
4
4
  NAME : &pkg nitro
5
- VERSION : '0.25.0'
5
+ VERSION : '0.26.0'
6
6
  STATUS : beta
7
7
 
8
8
  AUTHOR : George Moschovitis
9
9
  EMAIL : &email gm@navel.gr
10
10
  HOMEPAGE : "http://www.nitrohq.com"
11
11
 
12
- SUMMARY: Everyhting you need to create Web 2.0 applications with Ruby and Javascript
12
+ SUMMARY: Everything you need to create Web 2.0 applications with Ruby and Javascript
13
13
 
14
14
  DESCRIPTION: >
15
15
  Nitro provides everything you need to develop professional Web
@@ -22,19 +22,43 @@ DESCRIPTION: >
22
22
  staying standards compliant.
23
23
 
24
24
  DEPENDENCIES:
25
- - [ og, '= 0.25.0' ]
26
- - [ gen, '= 0.25.0' ]
27
- - [ glue, '= 0.25.0' ]
25
+ - [ og, '= 0.26.0' ]
26
+ - [ gen, '= 0.26.0' ]
27
+ - [ glue, '= 0.26.0' ]
28
28
  - [ RedCloth, '= 3.0.3' ]
29
29
  - [ ruby-breakpoint, '= 0.5' ]
30
30
  - [ daemons, '= 0.4.2' ]
31
31
 
32
+ PACKAGE:
33
+ exclude:
34
+ - dev
35
+
36
+ EXECUTABLES:
37
+ - nitro
38
+ - nitrogen
39
+
32
40
  DISTRIBUTE: [ gem, tgz, zip ]
33
41
 
34
42
  RUBYFORGE:
35
43
  PROJECT: 'nitro'
36
44
  USERNAME: 'gmosx'
37
45
 
46
+ RDOC:
47
+ - dir: web/rdoc
48
+ template: jamis
49
+ options: ['--all', '--inline-source']
50
+ include:
51
+ - 'lib/nitro/**/*'
52
+ - '[A-Z]*'
53
+
54
+ PUBLISH:
55
+ -
56
+ host: rubyforge
57
+ type: web
58
+ username: gmosx
59
+ project: nitro
60
+ dir: 'web'
61
+
38
62
  # Anything to require upfront?
39
63
  #TEST:
40
64
  # fixture: ''
data/README CHANGED
@@ -1,4 +1,4 @@
1
- = Nitro 0.24.0 README
1
+ = Nitro 0.26.0 README
2
2
 
3
3
  Nitro provides everything you need to develop professional Web
4
4
  applications using Ruby and Javascript.
@@ -10,6 +10,9 @@ IDEAS, ADDITIONAL CODING, SUPPORT:
10
10
  * Guillaume Pierronnet <guillaume.pierronnet@laposte.net>
11
11
  Patches, bug reports.
12
12
 
13
+ * Chris Farmiloe <chris.farmiloe@farmiloe.com>
14
+ Bug fixes, Scaffolding improvements, patches.
15
+
13
16
  * James Britt <james_b@neurogami.com>
14
17
  Additional code, documentation, design, bug reports.
15
18
 
@@ -19,24 +22,27 @@ IDEAS, ADDITIONAL CODING, SUPPORT:
19
22
  * Aleksi Niemela <Aleksi.Niemela@cs.helsinki.fi>
20
23
  Bug fixes, patches, documentation.
21
24
 
22
- * Chris Farmiloe <chris.farmiloe@farmiloe.com>
23
- Bug fixes, Scaffolding improvements, patches.
24
-
25
25
  * Rob Pitt <rob@motionpath.co.uk>
26
26
  Bug fixes, Scaffolding improvements, patches.
27
27
 
28
+ * Bryan Soto <bryan.a.soto@gmail.com>
29
+ Small bug fixes, patches.
30
+
31
+ * Brian Bugh <brian@xsi-design.com>
32
+ Fixes, Patches.
33
+
28
34
  * Zed A. Shaw <zedshaw@zedshaw.com>
29
35
  SCGI adapter.
30
36
 
37
+ * Peter Abrahamsen <rainhead@gmail.com>
38
+ Documentation, small patches.
39
+
31
40
  * Anastasios Koutoumanos <ak@navel.gr>
32
41
  Design, bug reports.
33
42
 
34
43
  * TRANS <transfire@gmail.com>
35
44
  Small bug fixes, patches.
36
45
 
37
- * Bryan Soto <bryan.a.soto@gmail.com>
38
- Small bug fixes, patches.
39
-
40
46
  * Kostas Nasis <kostas@nasis.com>
41
47
  Ideas and bug reports.
42
48
 
@@ -1,3 +1,117 @@
1
+ == Version 0.26.0
2
+
3
+ Another step closer to web programming nirvana. This release
4
+ features completely recoded scaffolding, an auto admin system,
5
+ a recoded template-morphing system, a new intelligent dispatcher
6
+ that handles both nice urls and general structure, and so much
7
+ more. Moreover, this is the release with the most community
8
+ contributions. Download now!
9
+
10
+ Most notable changes:
11
+
12
+ * New, intelligent dispatcher handles nice urls automatically,
13
+ without explicit rewrite rules. At the same time, it handles
14
+ sub directories, so you are free to design your app's
15
+ structure as you like.
16
+
17
+ * New template morphing implementation. The morphing compiler
18
+ is fully customizable. You can implement your own morphers and
19
+ add them to the morphing system, here for example is the
20
+ new selected_if morpher:
21
+
22
+ <option value="1" selected_if="@cond">opt1</option>
23
+
24
+ becomes
25
+ <?r if @cond ?>
26
+ <option value="1" selected="selected">opt1</option>
27
+ <?r else ?>
28
+ <option value="1">opt1</option>
29
+ <?r end ?>
30
+
31
+ * New Sweeper mixin. Using this mixin allows you to keep
32
+ the cleanup logic in one place. This logic is called
33
+ automagically by many default Nitro/Og methods (for example
34
+ Og insert/update, scaffolding, etc). You can fully customize
35
+ the behaviour.
36
+
37
+ class Article
38
+ include Sweeper
39
+
40
+ def sweep_affected(action = :all)
41
+ expire_affected_output('articles/view')
42
+ ...
43
+ end
44
+ end
45
+
46
+ a = Article[1]
47
+ a.title = 'New'
48
+ a.save # => calls expire_affected.
49
+
50
+ This mixin is typically used to automatically clean up output
51
+ caching files from the filesystem, but you can use it to remove
52
+ temp rows from the database, or temp objects from a drb server
53
+ or anything you like.
54
+
55
+ * Searchable mixin. Include this mixin to your classes to make
56
+ them searchable by the auto administration system.
57
+
58
+ * Added two new session managers (OgSession, FileSession),
59
+ cleaned up the session code.
60
+
61
+ * Better validations implementation. Cleaner code, less evals,
62
+ more flexible and easier to extend.
63
+
64
+ * New scaffolding / auto administration system. The implementation
65
+ is much cleaner and easier to customize. It leverages the latest
66
+ advancements (dispatcher, sweeper, etc) and adds search support,
67
+ pager, breadcrumps and more. You can define your own controls
68
+ to handle properties and relations. Stay tuned for more stuff
69
+ in the near future.
70
+
71
+ * New Og revisable mixin. Just include this mixin in your classes
72
+ and get db backed revision support for free. Here comes an
73
+ example:
74
+
75
+ class Article
76
+ is Revisable
77
+ property :body, String, :revisable => true
78
+ property :title, String
79
+ end
80
+
81
+ Automatically generates the Revision class (and the
82
+ backend schema):
83
+
84
+ class Article::Revision
85
+
86
+ article.revisions
87
+
88
+ article.revise do |a|
89
+ a.title = 'hello'
90
+ a.body = 'world'
91
+ end
92
+
93
+ article.rollback(4)
94
+
95
+ * Bug fixed KirbyBase Og adapter. This works great with the
96
+ new 2.5 gem.
97
+
98
+ * Added more rational defaults, and many predefined options to
99
+ minimize the amount of setup needed to get your app running. Of
100
+ course you can still customize just about everything in Nitro.
101
+
102
+ * Improvements to PostgreSQL automatic generation of foreign key
103
+ constraints.
104
+
105
+ * Added evolution support to the MySql store.
106
+
107
+ * Upgrated to Prototype 1.4 and Scriptaculous 1.5
108
+
109
+ * Updated the examples, check out the improved blog and why_wiki
110
+ examples.
111
+
112
+ * Many, many, many bug fixes and smaller improvements.
113
+
114
+
1
115
  == Version 0.25.0
2
116
 
3
117
  This is the first in a series of releases focused on stability
@@ -0,0 +1,71 @@
1
+ require 'glue/aspects'
2
+
3
+ module Glue
4
+
5
+ # This module adds cleanup functionality to managed
6
+ # classes. Override and implement sweep_affected.
7
+ # Typically used to cleanup output caching files from
8
+ # the filesystem. But you can also use it to clean up
9
+ # temp objects in the database or other temp files.
10
+ #--
11
+ # FIXME: find a better name.
12
+ #++
13
+
14
+ module Sweeper
15
+ include Aspects
16
+
17
+ before "sweep_affected(:insert)", :on => :og_insert
18
+ before "sweep_affected(:update)", :on => :og_update
19
+ before "sweep_affected(:delete)", :on => :og_delete
20
+
21
+ #--
22
+ # FIXME: replace with 'extend Nitro::Caching::Output' ?
23
+ # If you change this method, don't forget the Caching::Output
24
+ # expire method.
25
+ #++
26
+
27
+ def self.expire(name)
28
+ begin
29
+ Logger.debug "Sweeper expired cache file '#{Server.public_root}/#{name}'" if $DBG
30
+ FileUtils.rm_rf("#{Server.public_root}/#{name}")
31
+ rescue Object
32
+ # gmosx: is this the right thing to do?
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ # If needed pass the calling action symbol to allow
39
+ # for conditional expiration.
40
+ # Action takes values from { :insert, :delete, :update }
41
+ # or your own custom enumeration.
42
+ #
43
+ # Generally add lines like the following:
44
+ #
45
+ # expire_affected_output('file_to_expire')
46
+
47
+ def sweep_affected(action = :all)
48
+ end
49
+ alias_method :expire_affected, :sweep_affected
50
+
51
+ #--
52
+ # Generally you don't override this.
53
+ #++
54
+
55
+ def expire_affected_output(name)
56
+ Sweeper.expire(name)
57
+ end
58
+ alias_method :expire_output, :expire_affected_output
59
+
60
+ # Expire affected cached fragments.
61
+
62
+ def expire_affected_fragment(name, options = {})
63
+ Nitro::Caching::Fragments.store.delete(name, options)
64
+ end
65
+ alias_method :expire_fragment, :expire_affected_fragment
66
+
67
+ end
68
+
69
+ end
70
+
71
+ # * George Moschovitis <gm@navel.gr>
@@ -16,7 +16,7 @@ module Nitro
16
16
 
17
17
  # The version.
18
18
 
19
- Version = '0.25.0'
19
+ Version = '0.26.0'
20
20
 
21
21
  # Library path.
22
22
 
@@ -37,7 +37,7 @@ end
37
37
 
38
38
  require 'nitro/context'
39
39
  require 'nitro/controller'
40
- require 'nitro/dispatcher/nice'
40
+ require 'nitro/dispatcher'
41
41
  require 'nitro/render'
42
42
  require 'nitro/server'
43
43
 
@@ -48,24 +48,31 @@ unless $NITRO_NO_ENVIRONMENT
48
48
  # $NITRO_NO_ENVIRONMENT = true
49
49
  #
50
50
  # before requiring nitro.
51
+
52
+ # if $0 # mod_ruby set $0 to false
53
+ # Put the start file dir in the path.
54
+ Dir.chdir(File.dirname($0))
51
55
 
52
- Dir.chdir(File.dirname($0))
53
-
54
- # Application code come here.
56
+ # Application code come here.
55
57
 
56
- $LOAD_PATH.unshift 'src'
58
+ $LOAD_PATH.unshift 'src'
57
59
 
58
- # Library code come here.
60
+ # Library code come here.
59
61
 
60
- $LOAD_PATH.unshift 'lib'
62
+ $LOAD_PATH.unshift 'lib'
63
+ # end
61
64
  end
62
65
 
63
66
  module Nitro
64
67
 
65
- # A helper method to start a Nitro application.
68
+ class << self
66
69
 
67
- def self.run(controller = nil)
68
- Server.run(controller)
70
+ # A helper method to start a Nitro application.
71
+
72
+ def run(controller = nil)
73
+ Server.run(controller)
74
+ end
75
+ alias_method :start, :run
69
76
  end
70
-
77
+
71
78
  end
@@ -15,6 +15,10 @@ class CgiAdapter
15
15
 
16
16
  def self.start(server)
17
17
  cgi = CGI.new
18
+ def cgi.env
19
+ env_table
20
+ end
21
+ Router.strip_path = cgi.env["SCRIPT_NAME"]
18
22
  Cgi.process(server, cgi, cgi, cgi)
19
23
  =begin
20
24
  context = Context.new(server)
@@ -25,7 +25,9 @@ class Webrick
25
25
  if RUBY_PLATFORM !~ /mswin32/
26
26
  wblog = WEBrick::BasicLog::new('/dev/null')
27
27
  elsif server.access_log
28
- wblog = WEBrick::BasicLog::new(server.access_log || 'log/access.log')
28
+ wblog = WEBrick::BasicLog::new(server.access_log)
29
+ elsif File.exist? 'log'
30
+ wblog = WEBrick::BasicLog::new('log/access.log')
29
31
  else
30
32
  wblog = STDERR
31
33
  end
@@ -146,7 +148,7 @@ class WebrickAdapter < WEBrick::HTTPServlet::AbstractServlet
146
148
  res.instance_variable_set(:@header, context.response_headers || {})
147
149
  res.instance_variable_set(:@cookies, context.response_cookies || {})
148
150
  res.body = context.out
149
- res.chunked = true if context.out.is_a?(IO)
151
+ res.chunked = true if context.out.is_a?(IO) and context["SERVER_PROTOCOL"] == "HTTP/1.1"
150
152
 
151
153
  context.close
152
154
  ensure
@@ -2,6 +2,7 @@ require 'fileutils'
2
2
 
3
3
  require 'glue/attribute'
4
4
  require 'glue/configuration'
5
+ require 'glue/sweeper'
5
6
 
6
7
  require 'nitro/caching/output'
7
8
  require 'nitro/caching/actions'
@@ -9,7 +9,8 @@ module Nitro
9
9
 
10
10
  module Caching
11
11
 
12
- # Action caching.
12
+ # Action caching. Caches a fragment, ie a page part.
13
+ # Use output cachingfor full page caching.
13
14
 
14
15
  module Fragments
15
16
 
@@ -58,6 +59,11 @@ module Caching
58
59
  end
59
60
  end
60
61
 
62
+ #--
63
+ # gmosx: If you modify the code here, don't forget to modify
64
+ # the same method on the sweeper.
65
+ #++
66
+
61
67
  def expire_fragment(name, options = {})
62
68
  Fragments.store.delete(name, options)
63
69
  end
@@ -10,7 +10,7 @@ module Caching
10
10
 
11
11
  module Output
12
12
 
13
- def self.append_features(base) # :nodoc:
13
+ def self.included(base) # :nodoc:
14
14
  super
15
15
  base.extend(ClassMethods)
16
16
  base.module_eval do
@@ -57,6 +57,11 @@ module Caching
57
57
  self.class.do_cache_output(@request.uri, @out)
58
58
  end
59
59
  end
60
+
61
+ #--
62
+ # If you change this method, don't forget the CacheSweeper
63
+ # expire method.
64
+ #++
60
65
 
61
66
  def expire_output(name)
62
67
  begin