orange 0.1.8 → 0.1.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. data/README.markdown +1 -0
  2. data/lib/orange-core/application.rb +13 -11
  3. data/lib/orange-core/core.rb +32 -0
  4. data/lib/orange-core/middleware/base.rb +5 -1
  5. data/lib/orange-core/middleware/database.rb +8 -4
  6. data/lib/orange-core/middleware/globals.rb +3 -3
  7. data/lib/orange-core/packet.rb +1 -1
  8. data/lib/orange-core/resource.rb +6 -2
  9. data/lib/orange-core/resources/parser.rb +9 -0
  10. data/lib/orange-core/stack.rb +16 -4
  11. data/lib/orange-more/administration/middleware/access_control.rb +2 -2
  12. data/lib/orange-more/assets/resources/asset_resource.rb +7 -8
  13. data/lib/orange-more/blog/resources/blog_post_resource.rb +1 -1
  14. data/lib/orange-more/blog/resources/blog_resource.rb +1 -1
  15. data/lib/orange-more/cloud/resources/cloud_resource.rb +2 -4
  16. data/lib/orange-more/debugger/middleware/debugger.rb +8 -1
  17. data/lib/orange-more/debugger/views/debug_bar.haml +20 -1
  18. data/lib/orange-more/events/cartons/orange_event.rb +7 -1
  19. data/lib/orange-more/events/resources/calendar_resource.rb +2 -0
  20. data/lib/orange-more/events/resources/event_resource.rb +33 -1
  21. data/lib/orange-more/events/views/events/create.haml +2 -1
  22. data/lib/orange-more/news/resources/news_resource.rb +3 -6
  23. data/lib/orange-more/pages/resources/page_resource.rb +5 -2
  24. data/lib/orange-more/sitemap/resources/sitemap_resource.rb +2 -2
  25. data/lib/orange-more/sitemap/views/default_resource/sitemap_row.haml +27 -0
  26. data/lib/orange-more/slices/resources/slices.rb +16 -18
  27. data/lib/orange-more/subsites/resources/subsite_resource.rb +1 -1
  28. data/lib/orange-more/testimonials/resources/testimonials_resource.rb +12 -13
  29. data/spec/orange-core/application_spec.rb +37 -0
  30. data/spec/orange-core/core_spec.rb +4 -4
  31. data/spec/orange-core/middleware/base_spec.rb +5 -5
  32. data/spec/orange-core/mock/mock_middleware.rb +4 -0
  33. data/spec/orange-core/mock/mock_resource.rb +12 -0
  34. data/spec/orange-core/resource_spec.rb +7 -0
  35. data/spec/orange-core/stack_spec.rb +48 -0
  36. metadata +4 -3
data/README.markdown CHANGED
@@ -103,6 +103,7 @@ Required Gems
103
103
  * rack-openid
104
104
  * openid_dm_store
105
105
  * radius
106
+ * crack
106
107
 
107
108
  All dependencies should be loaded if you install the gem except for the datamapper
108
109
  adapter relevant to your set up. If, for example, you want to use a mysql database,
@@ -9,17 +9,17 @@ module Orange
9
9
  # the self.stack method, which will be used to create a new
10
10
  # Orange::Stack
11
11
  class Application
12
+ extend ClassInheritableAttributes
13
+ cattr_accessor :core, :stack_block
12
14
  # Initialize will set the core, and additionally accept any
13
15
  # other options to be added in to the opts array
14
16
  # @param [Orange::Core] core the orange core instance that this application will use
15
17
  # @param [Hash] *opts the optional arguments
16
18
  def initialize(core = false, *opts, &block)
17
- @core = core
19
+ @core = core || self.class.core
18
20
  @options ||= {}
19
21
  @options = Orange::Options.new(*opts, &block).hash.with_defaults(self.class.opts)
20
- orange.register(:stack_loaded) do |s|
21
- stack_init
22
- end
22
+ core.application(self) # Register self into core
23
23
  init
24
24
  end
25
25
 
@@ -106,12 +106,14 @@ module Orange
106
106
  # Returns an instance of Orange::Stack to be run by Rack
107
107
  #
108
108
  # Usually, you'll call this in the rackup file: `run MyApplication.app`
109
- def self.app
110
- @core ||= Orange::Core.new
111
- if @app.instance_of?(Proc)
112
- Orange::Stack.new self, @core, &@app # turn saved proc into a block arg
109
+ def self.app(core = false)
110
+ self.core = core if core
111
+ self.core ||= Orange::Core.new
112
+ return self.core.stack unless self.core.stack.blank?
113
+ if self.stack_block.instance_of?(Proc)
114
+ Orange::Stack.new self, self.core, &self.stack_block # turn saved proc into a block arg
113
115
  else
114
- Orange::Stack.new self, @core
116
+ Orange::Stack.new self, self.core
115
117
  end
116
118
  end
117
119
 
@@ -120,8 +122,8 @@ module Orange
120
122
  #
121
123
  # Each call to stack overrides the previous one.
122
124
  def self.stack(core = false, &block)
123
- @core = core
124
- @app = Proc.new # pulls in the block and makes it a proc
125
+ self.core = core if core
126
+ self.stack_block = Proc.new # pulls in the block and makes it a proc
125
127
  end
126
128
  end
127
129
  end
@@ -65,12 +65,20 @@ module Orange
65
65
  def initialize(*args, &block)
66
66
  @options = Options.new(*args, &block).hash.with_defaults(DEFAULT_CORE_OPTIONS)
67
67
  @resources = {}
68
+ @application = false
69
+ @stack = false
70
+ @middleware = []
68
71
  @events = {}
69
72
  @file = __FILE__
70
73
  load(Orange::Parser.new, :parser)
71
74
  load(Orange::Mapper.new, :mapper)
72
75
  load(Orange::PageParts.new, :page_parts)
73
76
  Orange.plugins.each{|p| p.resources.each{|args| load(*args)} if p.has_resources?}
77
+ self.register(:stack_loaded) do |s|
78
+ @middleware.each{|m| m.stack_init if m.respond_to?(:stack_init)}
79
+ @application.stack_init if @application
80
+ end
81
+ self.register(:stack_reloading){|s| @middleware = []} # Dump middleware on stack reload
74
82
  # load(Orange::AdminResource.new, :admin)
75
83
  afterLoad
76
84
  self
@@ -133,6 +141,26 @@ module Orange
133
141
  @resources[name] = resource.set_orange(self, name)
134
142
  end
135
143
 
144
+ # Takes an instance of Orange::Middleware::Base subclass and
145
+ # keeps it for later. This way we can provide introspection into the
146
+ # middleware instances (useful for calling stack_init on them)
147
+ def middleware(middle = false)
148
+ @middleware << middle if middle
149
+ @middleware
150
+ end
151
+
152
+ # Takes an instance of Orange::Application and saves it.
153
+ def application(app = false)
154
+ @application = app if app
155
+ @application
156
+ end
157
+
158
+ # Takes an instance of Orange::Stack and saves it.
159
+ def stack(stack = false)
160
+ @stack = stack if stack
161
+ @stack
162
+ end
163
+
136
164
  # Convenience self for consistent naming across middleware
137
165
  # @return [Orange::Core] self
138
166
  def orange; self; end
@@ -224,5 +252,9 @@ module Orange
224
252
  def self.add_pulp(inc)
225
253
  Packet.mixin inc
226
254
  end
255
+
256
+ def inspect
257
+ "#<Orange::Core:0x#{self.object_id.to_s(16)}>"
258
+ end
227
259
  end
228
260
  end
@@ -11,7 +11,9 @@ require 'orange-core/packet'
11
11
  module Orange::Middleware
12
12
  class Base
13
13
  # Initialize will set the core and downstream app, then call init
14
- # subclasses should override init instead of initialize
14
+ # subclasses should override init instead of initialize.
15
+ # If the subclass defines a stack_init, then it will be registered
16
+ # as a stack_loaded event.
15
17
  # @param [Object] app a downstream app
16
18
  # @param [Orange::Core] core the orange core
17
19
  # @param [optional, Array] args any arguments
@@ -19,9 +21,11 @@ module Orange::Middleware
19
21
  @app = app
20
22
  @core = core
21
23
  init(*args)
24
+ core.middleware(self)
22
25
  end
23
26
 
24
27
  # A stub method that subclasses can override to handle initialization
28
+ # For initialization
25
29
  # @return [void]
26
30
  def init(*args)
27
31
  end
@@ -5,13 +5,17 @@ module Orange::Middleware
5
5
  def init(opts = {})
6
6
  opts = opts.with_defaults(:migration_url => (orange.options[:development_mode] ? '/__ORANGE_DB__/migrate' : false), :no_auto_upgrade => false)
7
7
  orange.mixin Orange::Mixins::DBLoader
8
- orange.register(:stack_loaded) do |stack|
8
+ @options = opts
9
+ end
10
+
11
+ def stack_init
12
+ unless orange.options.has_key?('database') && orange.options['database'] == false
9
13
  db = orange.options['database'] || 'sqlite3::memory:'
10
- orange.load_db!(db)
11
- orange.upgrade_db! unless opts[:no_auto_upgrade] || orange.options['no_auto_upgrade']
14
+ orange.load_db!(db)
15
+ orange.upgrade_db! unless @options[:no_auto_upgrade]
12
16
  end
13
- @options = opts
14
17
  end
18
+
15
19
  def packet_call(packet)
16
20
  path = packet['route.path'] || packet.request.path_info
17
21
  if @options[:migration_url] && @options[:migration_url] == path
@@ -2,11 +2,11 @@ require 'orange-core/middleware/base'
2
2
  module Orange::Middleware
3
3
 
4
4
  class Globals < Base
5
- def init(*args)
6
- opts = args.extract_options!.with_defaults(:file => "__ORANGE__/config.yml")
5
+ def init(opts = {})
6
+ opts = opts.with_defaults(:file => "__ORANGE__/config.yml")
7
7
  @file = opts[:file].gsub('__ORANGE__', orange.app_dir)
8
8
  @globals = orange[:parser].yaml(@file) || {}
9
- @globals.each{|k,v| orange.options[k] = v }
9
+ @globals.each{|k,v| orange.options[k] = v}
10
10
  end
11
11
  def packet_call(packet)
12
12
  packet['orange.globals'] ||= orange.options
@@ -210,7 +210,7 @@ module Orange
210
210
  break if matched
211
211
  end
212
212
  return @@matchers[matched].call(packet, matched.match(id), args) if matched
213
- raise NoMethodError
213
+ raise NoMethodError.new("No method ##{id} found", id)
214
214
  end
215
215
  end
216
216
  end
@@ -15,7 +15,8 @@ module Orange
15
15
  def set_orange(orange, name)
16
16
  @orange = orange
17
17
  @my_orange_name = name
18
- afterLoad
18
+ init
19
+ orange.register(:stack_loaded) { |s| stack_init } if self.respond_to? :stack_init
19
20
  self
20
21
  end
21
22
 
@@ -23,8 +24,11 @@ module Orange
23
24
  raise 'instantiate the resource before calling set orange'
24
25
  end
25
26
 
27
+ def init
28
+ afterLoad
29
+ end
30
+
26
31
  def afterLoad
27
- true
28
32
  end
29
33
 
30
34
  def self.call_me(name)
@@ -1,6 +1,7 @@
1
1
  require 'orange-core/core'
2
2
  require 'haml'
3
3
  require 'yaml'
4
+ require 'crack'
4
5
 
5
6
  module Orange
6
7
  class Parser < Resource
@@ -60,6 +61,14 @@ module Orange
60
61
  require 'hpricot'
61
62
  Hpricot(text)
62
63
  end
64
+
65
+ def xml(text)
66
+ Crack::XML.parse(text)
67
+ end
68
+
69
+ def json(text)
70
+ Crack::JSON.parse(text)
71
+ end
63
72
  end
64
73
 
65
74
  module Pulp::ParserPulp
@@ -28,8 +28,9 @@ module Orange
28
28
  # @param [Symbol] prebuilt the optional prebuilt stack, if one isn't passed as block
29
29
  def initialize(app_class = nil, core = false, prebuilt = :none, &block)
30
30
  @build = Rack::Builder.new
31
- @core = Orange::Core.new
31
+ @core = core || Orange::Core.new
32
32
  @auto_reload = false
33
+ @middleware = []
33
34
  @recapture = true
34
35
  @main_app = app_class
35
36
  if block_given?
@@ -193,9 +194,15 @@ module Orange
193
194
  # @return [Object] a full stack of middleware and the exit application,
194
195
  # conforming to Rack guidelines
195
196
  def app
196
- @app = false if @auto_reload # Rebuild no matter what if autoload
197
- @app ||= @build.to_app # Build if necessary
198
- orange.fire(:stack_loaded, @app)
197
+ if @auto_reload
198
+ orange.fire(:stack_reloading, @app) if orange.stack # Alert we are rebuilding
199
+ @app = false # Rebuild no matter what if autoload
200
+ end
201
+ unless @app
202
+ @app = @build.to_app # Build if necessary
203
+ orange.stack self
204
+ orange.fire(:stack_loaded, @app)
205
+ end
199
206
  @app
200
207
  end
201
208
 
@@ -205,5 +212,10 @@ module Orange
205
212
  env['orange.core'] = @core
206
213
  app.call(env)
207
214
  end
215
+
216
+ # Debug helping
217
+ def inspect
218
+ "#<Orange::Stack:0x#{self.object_id.to_s(16)} @build=#{@build.inspect}, @core=#{@core.inspect}>"
219
+ end
208
220
  end
209
221
  end
@@ -68,11 +68,11 @@ module Orange::Middleware
68
68
  end
69
69
 
70
70
  def need_to_handle?(packet)
71
- @handle && ([@login, @logout].include? packet.request.path)
71
+ @handle && ([@login, @logout].include? packet.request.path.gsub(/\/$/, ''))
72
72
  end
73
73
 
74
74
  def handle_openid(packet)
75
- if packet.env['REQUEST_PATH'] == @logout
75
+ if packet.request.path.gsub(/\/$/, '') == @logout
76
76
  packet.session['user.id'] = nil
77
77
  packet['user.id'] = nil
78
78
  after = packet.session['user.after_login'].blank? ?
@@ -3,15 +3,14 @@ module Orange
3
3
  class AssetResource < Orange::ModelResource
4
4
  use Orange::Asset
5
5
  call_me :assets
6
- def afterLoad
6
+
7
+ def stack_init
7
8
  orange[:admin, true].add_link("Content", :resource => @my_orange_name, :text => 'Assets')
8
- orange.register(:stack_loaded) do
9
- orange[:radius, true].context.define_tag "asset" do |tag|
10
- if tag.attr['id']
11
- (m = model_class.first(:id => tag.attr['id'])) ? m.to_asset_tag : 'Invalid Asset'
12
- else
13
- ''
14
- end
9
+ orange[:radius, true].context.define_tag "asset" do |tag|
10
+ if tag.attr['id']
11
+ (m = model_class.first(:id => tag.attr['id'])) ? m.to_asset_tag : 'Invalid Asset'
12
+ else
13
+ ''
15
14
  end
16
15
  end
17
16
  end
@@ -2,7 +2,7 @@ module Orange
2
2
  class BlogResource < Orange::ModelResource
3
3
  use OrangeBlogPost
4
4
  call_me :blog_posts
5
- def afterLoad
5
+ def stack_init
6
6
  orange[:admin, true].add_link("Content", :resource => @my_orange_name, :text => 'Blog')
7
7
  end
8
8
 
@@ -2,7 +2,7 @@ module Orange
2
2
  class BlogPostResource < Orange::ModelResource
3
3
  use OrangeBlog
4
4
  call_me :blog
5
- def afterLoad
5
+ def stack_init
6
6
  orange[:admin, true].add_link("Settings", :resource => @my_orange_name, :text => 'Blog')
7
7
  end
8
8
 
@@ -4,10 +4,8 @@ module Orange
4
4
  class CloudResource < Orange::Resource
5
5
  ORANGE_PING_KEY = "c99550a0430eb9054eb4b7ee290664cf"
6
6
  call_me :cloud
7
- def afterLoad
8
- orange.register(:stack_loaded) do |stack|
9
- options[:ping_fm_key] = orange.options['ping_fm_key'] || false
10
- end
7
+ def stack_init
8
+ options[:ping_fm_key] = orange.options['ping_fm_key'] || false
11
9
  end
12
10
 
13
11
  def microblog(packet, status, opts = {})
@@ -32,4 +32,11 @@ module Orange::Pulp::DebuggerHelpers
32
32
  Rack::Utils.escape_html(obj.inspect)
33
33
  end
34
34
  end
35
- end
35
+ end
36
+
37
+ class Rack::Builder
38
+ def inspect
39
+ "#<Rack::Builder:#{self.object_id.to_s(16)} @ins=#{@ins.map{|x| x.instance_of?(Proc)? x.call(nil) : x }.inspect} >"
40
+ end
41
+ end
42
+
@@ -61,4 +61,23 @@
61
61
  %tr
62
62
  %td #{h_debug key}
63
63
  %td.code
64
- %div #{h_debug val}
64
+ %div #{h_debug val}
65
+ %h3#orange-info= 'Orange Core'
66
+ %table.req
67
+ %thead
68
+ %tr
69
+ %th Variable
70
+ %th Value
71
+ %tbody
72
+ %tr
73
+ %td Middleware
74
+ %td.code
75
+ %div #{h_debug packet.env['orange.core'].middleware}
76
+ %tr
77
+ %td Application
78
+ %td.code
79
+ %div #{h_debug packet.env['orange.core'].application}
80
+ %tr
81
+ %td Stack
82
+ %td.code
83
+ %div #{h_debug packet.env['orange.core'].stack}
@@ -2,13 +2,19 @@ class OrangeEvent < Orange::Carton
2
2
  id
3
3
  admin do
4
4
  title :name
5
- text :location
5
+ text :location_name
6
+ text :location_address
7
+ text :location_address2
8
+ text :location_city
9
+ text :location_state
10
+ text :location_zip
6
11
  fulltext :description
7
12
  end
8
13
  orange do
9
14
  time :starts
10
15
  time :ends
11
16
  end
17
+
12
18
  def starts_time
13
19
  self.starts.strftime("%I:%M %p")
14
20
  end
@@ -6,5 +6,7 @@ module Orange
6
6
  def afterNew(packet, obj, opts = {})
7
7
  obj.orange_site = packet['site'] unless obj.orange_site
8
8
  end
9
+
10
+
9
11
  end
10
12
  end
@@ -1,10 +1,42 @@
1
+ require 'rest_client'
2
+
1
3
  module Orange
2
4
  class EventResource < ModelResource
5
+ # For integration with Eventbrite. Application key needs user
6
+ # key for full access.
7
+ ORANGE_EVENTBRITE_KEY = "ODQ5MDMzZWQwOWRl"
8
+
3
9
  use OrangeEvent
4
10
  call_me :events
5
11
 
12
+ def stack_init
13
+ options[:eventbrite_key] = orange.options['eventbrite_key'] || false
14
+ end
15
+
6
16
  def find_extras(packet, mode, opts = {})
7
- {:calendars => OrangeCalendar.all}
17
+ extras = {:calendars => OrangeCalendar.all}
18
+ case mode
19
+ when :create
20
+ ev = eventbrite_venues
21
+ extras.merge!(:eventbrite_venues => eventbrite_venues) if options[:eventbrite_key]
22
+ end
23
+ extras
24
+ end
25
+
26
+ def post_to_eventbrite
27
+
28
+ end
29
+
30
+ def eventbrite_venues
31
+ list = []
32
+ begin
33
+ response = RestClient.get("https://www.eventbrite.com/xml/user_list_venues?app_key=#{ORANGE_EVENTBRITE_KEY}&user_key=#{options[:eventbrite_key]}")
34
+ xml = orange[:parser].xml(response.body)
35
+ list = xml["venues"]["venue"].select{|x| !x['country'].blank? }
36
+ rescue
37
+ return false
38
+ end
39
+ list
8
40
  end
9
41
  end
10
42
  end
@@ -19,4 +19,5 @@
19
19
  %input{:type => 'text', :id => "#{model_name}-ends", :size => 10, :class => 'date', :name => "#{model_name}[ends_date]", :value => (Time.now + 60*60).strftime("%m/%d/%Y") }
20
20
  at
21
21
  %input{:type => 'text', :name => "#{model_name}[ends_time]", :size => 8, :value => (Time.now + 60*60).strftime("%I:%M %p") }
22
- %input{:type => 'submit', :value => 'Save New Event'}
22
+ %input{:type => 'submit', :value => 'Save New Event'}
23
+
@@ -2,13 +2,10 @@ module Orange
2
2
  class NewsResource < Orange::ModelResource
3
3
  use OrangeNews
4
4
  call_me :news
5
- def afterLoad
5
+ def stack_init
6
6
  orange[:admin, true].add_link("Content", :resource => @my_orange_name, :text => 'News')
7
-
8
- orange.register(:stack_loaded) do
9
- orange[:radius, true].context.define_tag "latest_news" do |tag|
10
- orange[:news].latest(tag.locals.packet)
11
- end
7
+ orange[:radius, true].context.define_tag "latest_news" do |tag|
8
+ orange[:news].latest(tag.locals.packet)
12
9
  end
13
10
  end
14
11
 
@@ -24,12 +24,15 @@ module Orange
24
24
  class PageResource < Orange::ModelResource
25
25
  use OrangePage
26
26
  call_me :pages
27
- def afterLoad
28
- orange[:admin, true].add_link("Content", :resource => @my_orange_name, :text => 'Pages')
27
+ def init
29
28
  options[:sitemappable] = true
30
29
  orange.add_pulp(Orange::Pulp::PageHelpers)
31
30
  end
32
31
 
32
+ def stack_init
33
+ orange[:admin, true].add_link("Content", :resource => @my_orange_name, :text => 'Pages')
34
+ end
35
+
33
36
  def publish(packet, opts = {})
34
37
  no_reroute = opts[:no_reroute]
35
38
  if packet.request.post? || !opts.blank?
@@ -5,10 +5,10 @@ module Orange
5
5
  class SitemapResource < ModelResource
6
6
  use OrangeRoute
7
7
  call_me :sitemap
8
- def afterLoad
8
+ def stack_init
9
9
  orange[:admin, true].add_link('Content', :resource => @my_orange_name, :text => 'Sitemap')
10
-
11
10
  end
11
+
12
12
  def route_actions(packet, opts = {})
13
13
  do_view(packet, :route_actions, opts)
14
14
  end
@@ -0,0 +1,27 @@
1
+ - if route
2
+ .sitemap_item{:class => "sitemap_level_#{route.level}"}
3
+ - if route.level > 0
4
+ .move_actions.dent_actions
5
+ = form_link('Outdent', route_to(:sitemap, route.id, 'outdent'), false, {:method => 'post', :class => 'outdent arrow'}) if route.level > 1
6
+ %p= '&nbsp;'
7
+ .move_actions
8
+ - if route.previous_sibling
9
+ = form_link('Up', route_to(:sitemap, route.id, 'higher'), false, {:method => 'post', :class => 'up arrow'})
10
+ - else
11
+ %p.disabled_up.arrow= '&nbsp;'
12
+ - if route.next_sibling
13
+ = form_link('Down', route_to(:sitemap, route.id, 'lower'), false, {:method => 'post', :class => 'down arrow'})
14
+ - else
15
+ %p.disabled_down.arrow= '&nbsp;'
16
+ .move_actions.dent_actions
17
+ = form_link('Indent', route_to(:sitemap, route.id, 'indent'), false, {:method => 'post', :class => 'indent arrow'}) if route.previous_sibling && route.previous_sibling.level == route.level
18
+ %p= '&nbsp;'
19
+ %h4 #{route.link_text} <span>(#{route.full_path})</span>
20
+ .linked_to
21
+ %p
22
+ Linked to:
23
+ %a{:href => route.resource.blank? ? '#' : route_to(route.resource, route.resource_id, 'edit')} [#{route.resource}] ##{route.resource_id}
24
+ .actions
25
+ = form_link('Delete', route_to(:sitemap, route.id, 'delete'), 'Are you sure you want to delete this?', {:method => 'delete'})
26
+ %a{:href => route_to(:sitemap, route.id, 'edit')} Edit
27
+ %br.clear
@@ -1,25 +1,23 @@
1
1
  module Orange
2
2
  class Slices < Orange::Resource
3
3
  call_me :slices
4
- def afterLoad
5
- orange.register(:stack_loaded){
6
- orange[:radius].context.define_tag "slice" do |tag|
7
- content = ''
8
- resource = (tag.attr['resource'] || :slices).to_sym
9
- id = tag.attr['id'] || nil
10
- mode = (tag.attr['mode'] || tag.attr['chunk'] || (id ? :show : :index )).to_sym
11
- if orange.loaded?(resource)
12
- if orange[resource].respond_to?(mode) || resource == :slices
13
- content << (id ? orange[resource].__send__(mode, tag.locals.packet, :id => id) : orange[resource].__send__(mode, tag.locals.packet))
14
- else
15
- content << "resource #{resource} doesn't respond to #{mode}"
16
- end
4
+ def stack_init
5
+ orange[:radius].context.define_tag "slice" do |tag|
6
+ content = ''
7
+ resource = (tag.attr['resource'] || :slices).to_sym
8
+ id = tag.attr['id'] || nil
9
+ mode = (tag.attr['mode'] || tag.attr['chunk'] || (id ? :show : :index )).to_sym
10
+ if orange.loaded?(resource)
11
+ if orange[resource].respond_to?(mode) || resource == :slices
12
+ content << (id ? orange[resource].__send__(mode, tag.locals.packet, :id => id) : orange[resource].__send__(mode, tag.locals.packet))
17
13
  else
18
- content << "resource #{resource} not loaded"
19
- end
20
- content
21
- end
22
- }
14
+ content << "resource #{resource} doesn't respond to #{mode}"
15
+ end
16
+ else
17
+ content << "resource #{resource} not loaded"
18
+ end
19
+ content
20
+ end
23
21
  end
24
22
 
25
23
 
@@ -2,7 +2,7 @@ module Orange
2
2
  class SubsiteResource < Orange::ModelResource
3
3
  use OrangeSubsite
4
4
  call_me :subsites
5
- def afterLoad
5
+ def stack_init
6
6
  orange[:admin, true].add_link("Settings", :resource => @my_orange_name, :text => 'Subsites')
7
7
  end
8
8
 
@@ -2,23 +2,22 @@ module Orange
2
2
  class TestimonialsResource < Orange::ModelResource
3
3
  use OrangeTestimonial
4
4
  call_me :testimonials
5
- def afterLoad
5
+ def stack_init
6
6
  orange[:admin, true].add_link("Content", :resource => @my_orange_name, :text => 'Testimonials')
7
- orange.register(:stack_loaded) do
8
- orange[:radius].context.define_tag "testimonials" do |tag|
9
- if tag.attr["tag"] && model_class.all.count >0
10
- m = model_class.with_tag(tag.attr["tag"]).first(:offset => rand(model_class.with_tag(tag.attr["tag"]).count)) #selects testimonial based on tag
11
- elsif model_class.all.count > 0
12
- m = model_class.first(:offset => rand(model_class.all.count)) #selects a random testimonial
13
- end
14
- unless m.nil?
15
- orange[:testimonials].testimonial(tag.locals.packet, {:model => m })
16
- else
17
- ""
18
- end
7
+ orange[:radius].context.define_tag "testimonials" do |tag|
8
+ if tag.attr["tag"] && model_class.all.count >0
9
+ m = model_class.with_tag(tag.attr["tag"]).first(:offset => rand(model_class.with_tag(tag.attr["tag"]).count)) #selects testimonial based on tag
10
+ elsif model_class.all.count > 0
11
+ m = model_class.first(:offset => rand(model_class.all.count)) #selects a random testimonial
12
+ end
13
+ unless m.nil?
14
+ orange[:testimonials].testimonial(tag.locals.packet, {:model => m })
15
+ else
16
+ ""
19
17
  end
20
18
  end
21
19
  end
20
+
22
21
  def testimonial(packet, opts = {})
23
22
  do_view(packet, :testimonials, opts)
24
23
  end
@@ -14,6 +14,22 @@ describe Orange::Application do
14
14
  @wibble = true
15
15
  end
16
16
  end
17
+ # allow deep introspection into rack builder
18
+ class Rack::Builder
19
+ attr_accessor :ins
20
+ # introspection into the Builder object's list of items
21
+ # builder uses Proc magic to chain the middleware together,
22
+ # so we undo it.
23
+ def ins_no_procs
24
+ @ins.map{|x| x.instance_of?(Proc)? x.call(nil) : x }
25
+ end
26
+ end
27
+ class Orange::Stack
28
+ attr_accessor :build
29
+ def middlewarez
30
+ build.ins_no_procs
31
+ end
32
+ end
17
33
  end
18
34
 
19
35
  def app
@@ -126,6 +142,27 @@ describe Orange::Application do
126
142
  }.should change(x, :orange)
127
143
  end
128
144
 
145
+ it "should allow setting the core via #app" do
146
+ c = Orange::Core.new
147
+ x= MockApplication.app(c)
148
+ x.orange.should equal(c)
149
+ end
150
+
151
+ it "should allow setting the core via #stack" do
152
+ c = Orange::Core.new
153
+ MockApplication.stack(c) do
154
+ run MockApplication.new(orange)
155
+ end
156
+ x= MockApplication.app
157
+ x.orange.should equal(c)
158
+ x.middlewarez.first.orange.should equal(c)
159
+ p = Orange::Packet.new(c, {'orange.core' => c})
160
+ Orange::Packet.should_receive(:new).with(c, {'orange.core' => c}).and_return(p)
161
+ lambda{
162
+ x.call({}) # We don't care about the error, we care about the should_receive
163
+ }.should raise_error
164
+ end
165
+
129
166
  it "should respond correctly to call" do
130
167
  x= MockApplication.new(Orange::Core.new)
131
168
  lambda{
@@ -60,9 +60,11 @@ describe Orange::Core do
60
60
  c.loaded?(:parser).should be_true
61
61
  end
62
62
 
63
- it "should have no events by default" do
63
+ it "should have two events by default" do
64
64
  c= Orange::Core.new
65
- c.events.should have(0).events
65
+ c.events.should have(2).events
66
+ c.events.should have_key(:stack_reloading)
67
+ c.events.should have_key(:stack_loaded)
66
68
  end
67
69
 
68
70
  it "should return a directory that contains core.rb when calling core_dir" do
@@ -167,7 +169,6 @@ describe Orange::Core do
167
169
 
168
170
  it "should add event to events list when register called" do
169
171
  c= Orange::Core.new
170
- c.events.should be_empty
171
172
  c.register(:mock_event) {|x| x }
172
173
  c.events.should_not be_empty
173
174
  c.events.should have_key(:mock_event)
@@ -179,7 +180,6 @@ describe Orange::Core do
179
180
 
180
181
  it "should add events in specified order when registered with position" do
181
182
  c= Orange::Core.new
182
- c.events.should be_empty
183
183
  c.register(:mock_event, 5) {|x| '5' }
184
184
  c.events.should_not be_empty
185
185
  c.events.should have_key(:mock_event)
@@ -1,18 +1,18 @@
1
1
  describe Orange::Middleware::Base do
2
2
  it "should call init after initializing" do
3
3
  lambda{
4
- mid = MockOrangeDeathMiddleware.new(nil, nil, :foo => 'bar')
4
+ mid = MockOrangeDeathMiddleware.new(nil, Orange::Core.new, :foo => 'bar')
5
5
  }.should raise_error(RuntimeError, "middleware_init with foo=bar")
6
6
  end
7
7
 
8
8
  it "should create a packet and call packet call" do
9
- mid = MockOrangeBasedMiddlewareTwo.new(nil, nil)
9
+ mid = MockOrangeBasedMiddlewareTwo.new(nil, Orange::Core.new)
10
10
  mid.should_receive(:packet_call).with(an_instance_of(Orange::Packet))
11
11
  mid.call({})
12
12
  end
13
13
 
14
14
  it "should pass the packet on by default for packet_call" do
15
- mid = MockOrangeBasedMiddlewareTwo.new(nil, nil)
15
+ mid = MockOrangeBasedMiddlewareTwo.new(nil, Orange::Core.new)
16
16
  mid.should_receive(:pass).with(an_instance_of(Orange::Packet))
17
17
  mid.packet_call(empty_packet)
18
18
  end
@@ -23,8 +23,8 @@ describe Orange::Middleware::Base do
23
23
  my_hash = {:foo => :bar}
24
24
  app.should_receive(:call).with(my_hash).and_return([{},200,[]])
25
25
  app2.should_receive(:packet_call).with(an_instance_of(Orange::Packet))
26
- mid = MockOrangeBasedMiddlewareTwo.new(app, nil)
27
- mid2 = MockOrangeBasedMiddlewareTwo.new(app2, nil)
26
+ mid = MockOrangeBasedMiddlewareTwo.new(app, Orange::Core.new)
27
+ mid2 = MockOrangeBasedMiddlewareTwo.new(app2, Orange::Core.new)
28
28
  mid.call(my_hash)
29
29
  mid2.call(my_hash)
30
30
  end
@@ -13,6 +13,10 @@ class MockMiddleware
13
13
  end
14
14
 
15
15
  class MockOrangeBasedMiddlewareTwo < Orange::Middleware::Base; end
16
+ class MockOrangeBasedMiddlewareThree < Orange::Middleware::Base
17
+ def stack_init
18
+ end
19
+ end
16
20
  class MockOrangeDeathMiddleware < Orange::Middleware::Base
17
21
  def init(*args)
18
22
  opts = args.extract_options!
@@ -7,6 +7,18 @@ class MockResource < Orange::Resource
7
7
  end
8
8
  end
9
9
 
10
+ class MockResourceTwo < Orange::Resource
11
+ def mock_method
12
+ 'MockResource#mock_method'
13
+ end
14
+ def afterLoad
15
+ @options[:mocked] = true
16
+ end
17
+ def stack_init
18
+ true
19
+ end
20
+ end
21
+
10
22
  class MockHamlParser < Orange::Resource
11
23
  def haml(template, packet, opts)
12
24
  [template, packet, opts]
@@ -44,6 +44,13 @@ describe Orange::Resource do
44
44
  me.should equal r
45
45
  end
46
46
 
47
+ it "should register for stack_loaded iff stack_init method present" do
48
+ c = Orange::Core.new
49
+ c.should_receive(:register).with(:stack_loaded).once
50
+ mid1 = c.load MockResource.new
51
+ mid2 = c.load MockResourceTwo.new
52
+ end
53
+
47
54
  it "should return an error if setting orange on a class" do
48
55
  lambda {
49
56
  Orange::Resource.set_orange(Orange::Core.new, :mock)
@@ -46,6 +46,17 @@ describe Orange::Stack do
46
46
  }.should raise_error(RuntimeError, "Mock Exitware")
47
47
  end
48
48
 
49
+ it "should accept a core object in initialization" do
50
+ c = Orange::Core.new
51
+ c2 = Orange::Core.new
52
+
53
+ x = Orange::Stack.new(nil, c) do
54
+ run MockExitware.new
55
+ end
56
+ x.orange.should equal(c)
57
+ x.orange.should_not equal(c2)
58
+ end
59
+
49
60
  it "should have the use function" do
50
61
  x= Orange::Stack.new do
51
62
  use MockMiddleware
@@ -101,6 +112,27 @@ describe Orange::Stack do
101
112
  x.app.should eql(x.app)
102
113
  end
103
114
 
115
+ it "should fire the stack events" do
116
+ c = Orange::Core.new
117
+ c2 = Orange::Core.new
118
+ x= Orange::Stack.new(nil, c) do
119
+ run MockExitware.new
120
+ end
121
+ x2= Orange::Stack.new(nil, c2) do
122
+ auto_reload!
123
+ run MockExitware.new
124
+ end
125
+ c.should_receive(:fire).with(:stack_loaded, anything()).once
126
+ c.should_receive(:fire).with(:stack_reloading, anything()).exactly(0).times
127
+ x.app
128
+ x.app
129
+ c2.should_receive(:fire).with(:stack_loaded, anything()).exactly(3).times
130
+ c2.should_receive(:fire).with(:stack_reloading, anything()).twice
131
+ x2.app
132
+ x2.app
133
+ x2.app
134
+ end
135
+
104
136
  it "should rebuild stack if auto_reload! set" do
105
137
  x= Orange::Stack.new do
106
138
  auto_reload!
@@ -133,6 +165,22 @@ describe Orange::Stack do
133
165
  x.middlewarez.select{|y| y.instance_of?(Orange::Middleware::RouteSite)}.should_not be_empty
134
166
  end
135
167
 
168
+ it "should have routing, postrouting and responder middleware hooks" do
169
+ x = Orange::Stack.new do
170
+ run MockExitware.new
171
+ end
172
+ x.should respond_to(:routing)
173
+ x.should respond_to(:postrouting)
174
+ x.should respond_to(:responders)
175
+ q = mock(:plugins)
176
+ plugin = mock(:plugin)
177
+ Orange.should_receive(:plugins).exactly(3).times.and_return(q)
178
+ q.should_receive(:each).exactly(3).times.and_return([plugin])
179
+ x.routing
180
+ x.postrouting
181
+ x.responders
182
+ end
183
+
136
184
  it "should add one less middleware when calling prerouting with opt :no_abstract_format" do
137
185
  x= Orange::Stack.new do
138
186
  no_recapture
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 8
9
- version: 0.1.8
8
+ - 10
9
+ version: 0.1.10
10
10
  platform: ruby
11
11
  authors:
12
12
  - David Haslem
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-23 00:00:00 -04:00
17
+ date: 2010-04-05 00:00:00 -04:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -199,6 +199,7 @@ files:
199
199
  - lib/orange-more/sitemap/middleware/flex_router.rb
200
200
  - lib/orange-more/sitemap/plugin.rb
201
201
  - lib/orange-more/sitemap/resources/sitemap_resource.rb
202
+ - lib/orange-more/sitemap/views/default_resource/sitemap_row.haml
202
203
  - lib/orange-more/sitemap/views/sitemap/list.haml
203
204
  - lib/orange-more/sitemap/views/sitemap/route_actions.haml
204
205
  - lib/orange-more/sitemap/views/sitemap/sitemap_links.haml