big_band 0.2.5 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. data/LICENSE +1 -1
  2. data/README.md +82 -0
  3. data/Rakefile +50 -170
  4. data/TODO.md +50 -0
  5. data/lib/big_band.rb +13 -258
  6. data/lib/sinatra/big_band.rb +65 -1
  7. data/spec/sinatra/big_band_spec.rb +32 -0
  8. data/spec/spec_helper.rb +2 -4
  9. data/subproject.rb +42 -0
  10. data/tasks/doc.task +9 -0
  11. data/tasks/gem.task +10 -0
  12. data/tasks/git.task +41 -0
  13. data/tasks/setup.task +34 -0
  14. data/tasks/spec.task +24 -0
  15. metadata +200 -140
  16. data/README.rdoc +0 -346
  17. data/README.rdoc.erb +0 -39
  18. data/big_band.gemspec +0 -25
  19. data/dependencies.rb +0 -12
  20. data/depgen/README.rdoc +0 -7
  21. data/depgen/Rakefile +0 -23
  22. data/depgen/depgen.rb +0 -123
  23. data/depgen/depgen.task +0 -42
  24. data/depgen/depgen_spec.rb +0 -127
  25. data/deps.rip +0 -8
  26. data/example/example.rb +0 -13
  27. data/example/views/index.haml +0 -8
  28. data/example/views/layout.haml +0 -2
  29. data/example/views/stylesheets/_base.sass +0 -1
  30. data/example/views/stylesheets/screen.sass +0 -12
  31. data/lib/big_band/advanced_routes.rb +0 -188
  32. data/lib/big_band/basic_extensions.rb +0 -176
  33. data/lib/big_band/compass.rb +0 -94
  34. data/lib/big_band/compass/big_band.rb +0 -4
  35. data/lib/big_band/compass/stylesheets/_big_band.sass +0 -1
  36. data/lib/big_band/compass/stylesheets/big_band/_blueprint.sass +0 -1
  37. data/lib/big_band/compass/stylesheets/big_band/_utilities.sass +0 -6
  38. data/lib/big_band/compass/stylesheets/big_band/blueprint/_html5.sass +0 -4
  39. data/lib/big_band/compass/stylesheets/big_band/layouts/_inspector.sass +0 -103
  40. data/lib/big_band/compass/stylesheets/big_band/utilities/_border_radius.sass +0 -27
  41. data/lib/big_band/compass/stylesheets/big_band/utilities/_css3_prefix.sass +0 -14
  42. data/lib/big_band/compass/stylesheets/big_band/utilities/_fancy_buttons.sass +0 -62
  43. data/lib/big_band/compass/stylesheets/big_band/utilities/_html5.sass +0 -3
  44. data/lib/big_band/config_file.rb +0 -48
  45. data/lib/big_band/files/overlay-button.png +0 -0
  46. data/lib/big_band/integration.rb +0 -39
  47. data/lib/big_band/integration/bacon.rb +0 -10
  48. data/lib/big_band/integration/monk.rb +0 -26
  49. data/lib/big_band/integration/rake.rb +0 -80
  50. data/lib/big_band/integration/rspec.rb +0 -11
  51. data/lib/big_band/integration/test.rb +0 -42
  52. data/lib/big_band/integration/test/spec.rb +0 -2
  53. data/lib/big_band/integration/test/unit.rb +0 -2
  54. data/lib/big_band/integration/test_spec.rb +0 -8
  55. data/lib/big_band/integration/test_unit.rb +0 -10
  56. data/lib/big_band/integration/yard.rb +0 -104
  57. data/lib/big_band/more_helpers.rb +0 -50
  58. data/lib/big_band/more_server.rb +0 -14
  59. data/lib/big_band/more_server/rainbows.rb +0 -13
  60. data/lib/big_band/more_server/unicorn.rb +0 -27
  61. data/lib/big_band/reloader.rb +0 -113
  62. data/lib/big_band/sass.rb +0 -28
  63. data/lib/big_band/version.rb +0 -3
  64. data/lib/big_band/web_inspector.rb +0 -178
  65. data/lib/big_bang.rb +0 -6
  66. data/lib/sinatra/big_band/advanced_routes.rb +0 -2
  67. data/lib/sinatra/big_band/basic_extensions.rb +0 -2
  68. data/lib/sinatra/big_band/compass.rb +0 -2
  69. data/lib/sinatra/big_band/compass/big_band.rb +0 -2
  70. data/lib/sinatra/big_band/config_file.rb +0 -2
  71. data/lib/sinatra/big_band/integration.rb +0 -2
  72. data/lib/sinatra/big_band/integration/bacon.rb +0 -2
  73. data/lib/sinatra/big_band/integration/monk.rb +0 -2
  74. data/lib/sinatra/big_band/integration/rake.rb +0 -2
  75. data/lib/sinatra/big_band/integration/rspec.rb +0 -2
  76. data/lib/sinatra/big_band/integration/test.rb +0 -2
  77. data/lib/sinatra/big_band/integration/test/spec.rb +0 -2
  78. data/lib/sinatra/big_band/integration/test/unit.rb +0 -2
  79. data/lib/sinatra/big_band/integration/test_spec.rb +0 -2
  80. data/lib/sinatra/big_band/integration/test_unit.rb +0 -2
  81. data/lib/sinatra/big_band/integration/yard.rb +0 -2
  82. data/lib/sinatra/big_band/more_helpers.rb +0 -2
  83. data/lib/sinatra/big_band/more_server.rb +0 -2
  84. data/lib/sinatra/big_band/more_server/rainbows.rb +0 -2
  85. data/lib/sinatra/big_band/more_server/unicorn.rb +0 -2
  86. data/lib/sinatra/big_band/reloader.rb +0 -2
  87. data/lib/sinatra/big_band/sass.rb +0 -2
  88. data/lib/sinatra/big_band/version.rb +0 -2
  89. data/lib/sinatra/big_band/web_inspector.rb +0 -2
  90. data/lib/yard-sinatra.rb +0 -2
  91. data/spec/big_band/advanced_routes_spec.rb +0 -70
  92. data/spec/big_band/basic_extensions_spec.rb +0 -39
  93. data/spec/big_band/more_server_spec.rb +0 -7
  94. data/spec/big_band/sass_spec.rb +0 -21
  95. data/spec/spec.opts +0 -5
  96. data/yard-sinatra.gemspec +0 -24
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- copyright (c) 2009 Konstantin Haase. All rights reserved.
1
+ copyright (c) 2010 Konstantin Haase. All rights reserved.
2
2
 
3
3
  Developed by: Konstantin Haase
4
4
  http://github.com/rkh/big_band
data/README.md ADDED
@@ -0,0 +1,82 @@
1
+ Sinatra::BigBand
2
+ ================
3
+
4
+ BigBand is a stack of [Sinatra](http://sinatrarb.com) extensions, most of them developed as part of BigBand, but usable without,
5
+ each of available as a separate gem. All BigBand extensions follow the same release cycle.
6
+
7
+ Usage
8
+ -----
9
+
10
+ Simply replace `Sinatra::Base` with `Sinatra::BigBand` in your application.
11
+
12
+ A simple example would be:
13
+
14
+ require 'sinatra/big_band'
15
+ class MyApp < Sinatra::BigBand
16
+ # ...
17
+ end
18
+
19
+ Maybe you want all extensions except `Sinatra::Compass`?
20
+
21
+ require 'sinatra/big_band'
22
+ class MyApp < Sinatra::BigBand :except => :Compass
23
+ # ...
24
+ end
25
+
26
+ The BigBand Stack
27
+ -----------------
28
+
29
+ Sinatra Extensions
30
+
31
+ * [Sinatra::AdvancedRoutes](http://github.com/rkh/sinatra-advanced-routes) – Makes routes first class objects
32
+ * [Sinatra::Compass](http://github.com/rkh/sinatra-compass) – Integrates the Compass stylesheet framework
33
+ * [Sinatra::ConfigFile](http://github.com/rkh/sinatra-config-file) – Adds YAML config file support
34
+ * [Sinatra::MoreServer](http://github.com/rkh/sinatra-more-server) – Adds support for more web servers to Sinatra::Base#run!
35
+ * [Sinatra::Namespace](http://github.com/rkh/sinatra-namespace) – Adds namespaces, allows namespaces to have local helpers.
36
+ * [Sinatra::Reloader](http://github.com/rkh/sinatra-reloader) – Advanced and fast code reloader
37
+ * [Sinatra::Sugar](http://github.com/rkh/sinatra-sugar) – Extensions for Sinatra's standard methods, like #set or #register
38
+
39
+ Sinatra tool integration:
40
+
41
+ * [AsyncRack](http://github.com/rkh/async-rack) – Makes standard rack middleware play nice with `async.callback`
42
+ * [Haml::More](http://github.com/rkh/haml-more) – Adds more functionality to Haml and Sass
43
+ * [monkey-lib](http://github.com/rkh/monkey-lib) – Thin layer over ruby extension libraries (like ActiveSupport) to make those pluggable
44
+ * [Sinatra::TestHelper](http://github.com/rkh/sinatra-test-helper) – Adds helper methods and better integration for various testing frameworks
45
+ * [Yard::Sinatra](http://github.com/rkh/yard-sinatra) – Displays Sinatra routes (including comments) in YARD output
46
+
47
+ Besides those extensions, there are others in the BigBand stack, that are external:
48
+
49
+ * [Rack Flash](http://github.com/nakajima/rack-flash) by Pat Nakajima
50
+
51
+ Goals for 0.4.0
52
+ ---------------
53
+
54
+ * No sub-project relies on BigBand
55
+ * All sub-projects should work with MRI/REE >= 1.8.6 (including 1.9.x), JRuby >= 1.4.0 and Rubinius >= 1.0
56
+ * Some sub-projects should work with MagLev and IronRuby (partial MacRuby support planned for later release)
57
+ * Ease to modify the stack
58
+
59
+ Setup via gem
60
+ -------------
61
+
62
+ Try:
63
+
64
+ gem install big_band
65
+
66
+ Running the specs / Manual setup
67
+ --------------------------------
68
+
69
+ Try something like this:
70
+
71
+ # dependencies, rather mainstream. just in case you don't have one of those.
72
+ gem install sinatra rspec rack-test rake
73
+
74
+ # get the source
75
+ git clone git://github.com/rkh/big_band.git
76
+ rake setup:read_only
77
+
78
+ # run the specs
79
+ rake spec
80
+
81
+ # run with multiple ruby implementations using rvm
82
+ rvm specs ree,1.9.1,rbx,jruby
data/Rakefile CHANGED
@@ -1,190 +1,70 @@
1
- $LOAD_PATH.unshift "lib"
2
- load "depgen/depgen.task"
1
+ # see tasks/*.task for rake tasks
3
2
 
4
- if ENV['RUN_CODE_RUN']
5
- Rake::Task["dependencies:vendor:all"].invoke
6
- task :default => :spec
7
- else
8
- task :default => [:dummy_files, "dependencies:generate:rip", :gems] # gems will trigger spec
9
- end
10
-
11
- $LOAD_PATH.unshift(*Dir.glob(File.expand_path(__FILE__ + "/../vendor/*/lib")))
12
- require "erb"
13
- require "spec/rake/spectask"
14
- require "rake/clean"
15
- require "rake/rdoctask"
16
- require "monkey-lib"
17
- require "yard"
3
+ $RELATIVE_LOAD_PATH = Dir.glob '{*,.}/lib'
4
+ $LOAD_PATH.unshift('.', *$RELATIVE_LOAD_PATH)
5
+ require 'subproject'
18
6
 
19
- $LOAD_PATH.unshift __FILE__.dirname.expand_path / "lib"
20
- require "big_band/integration/yard"
21
- require "big_band/integration/rake"
22
- require "big_band/version"
23
-
24
- include BigBand::Integration::Rake
25
- RoutesTask.new { |t| t.source = "lib/**/*.rb" }
26
-
27
- task :install => "gems:install"
28
- task :test => :spec
29
- task :clobber => "doc:clobber_rdoc"
7
+ task :default => ["setup:check", :spec]
30
8
 
9
+ require "rake/clean"
31
10
  CLEAN.include "**/*.rbc"
32
- CLOBBER.include "*.gem", "README.rdoc"
33
-
34
- Spec::Rake::SpecTask.new('spec') do |t|
35
- t.spec_opts = %w[--options spec/spec.opts]
36
- t.spec_files = Dir.glob 'spec/**/*_spec.rb'
37
- end
38
-
39
- TOOL_NAMES = { :Rspec => :RSpec, :Yard => :YARD, :TestSpec => :"Test::Spec", :TestUnit => :"Test::Unit" }
40
-
41
- def yard(files)
42
- YARD::Registry.load(Dir[files], true)
43
- YARD::Registry.resolve(false, "BigBand")
44
- end
45
-
46
- def yard_children(ydoc, directory, defaults = {}, &block)
47
- children = Dir.glob("#{directory}/*.rb").map { |f| f[(directory.size+1)..-4].to_const_string.to_sym }
48
- children.select!(&block) if block
49
- children.map! do |name|
50
- rewritten_name = defaults[name] || name
51
- ydoc.child(rewritten_name) or ydoc.child(name).tap { |c| c.name = rewritten_name unless c.nil? }
52
- end
53
- children.compact
54
- end
55
-
56
- def generate_readme(target = "README.rdoc", template = "README.rdoc.erb")
57
- puts "generating #{target} from #{template}"
58
- # HACK: loading other libraries later, for some strange heisenbug setting the docstring to an empty string later.
59
- docstring = yard("lib/big_band.rb").docstring
60
- ydoc = yard("lib/big_band/{**/,}*.rb")
61
- extensions = yard_children(ydoc, "lib/big_band") { |n| n != :Integration }
62
- integration = yard_children(ydoc.child(:Integration), "lib/big_band/integration", TOOL_NAMES) { |n| n != :Test }
63
- version = BigBand::VERSION
64
- File.open(target, "w") { |f| f << ERB.new(File.read(template), nil, "<>").result(binding) }
65
- end
11
+ CLOBBER.include "*.gem", "doc"
66
12
 
67
- file "README.rdoc" => ["README.rdoc.erb", "lib/big_band.rb"] do
68
- generate_readme
13
+ def insert_desc(*values)
14
+ return unless Rake.application.last_comment
15
+ Rake.application.last_comment.replace(Rake.application.last_comment % values)
69
16
  end
70
17
 
71
- desc "Generate documentation"
72
- task "doc" => "doc:yardoc"
73
- task "yardoc" => "doc:yardoc"
74
- task "rdoc" => "doc:yardoc"
75
-
76
- namespace :doc do
77
-
78
- task "yardoc" => "readme"
79
- task "rdoc" => "readme"
80
- task "rerdoc" => "readme"
81
-
82
- desc "Generate README.rdoc from source files"
83
- task "readme" do |t|
84
- generate_readme
85
- end
86
-
87
- Rake::RDocTask.new("rdoc") do |rdoc|
88
- rdoc.rdoc_dir = 'doc'
89
- rdoc.options += %w[-a -S -N -m README.rdoc -q -w 2 -t BigBand -c UTF-8]
90
- rdoc.rdoc_files.add ['*.{rdoc,rb}', '{config,lib,routes}/**/*.rb']
91
- end
92
-
93
- YARD::Rake::YardocTask.new("yardoc") do |t|
94
- t.options = %w[--main README.rdoc --backtrace]
95
- end
96
-
97
- end
98
-
99
- task :gems => "gems:build"
100
-
101
- namespace :gems do
102
-
103
- desc "Build gems (runs specs first)"
104
- task :build => [:clobber, :spec, "doc:readme"] do
105
- GEMS = []
106
- Dir.glob("*.gemspec") do |file|
107
- sh "gem build #{file}"
108
- GEMS << "#{file[0..-9]}-#{BigBand::VERSION}.gem"
109
- end
110
- end
111
-
112
- desc "Install gems"
113
- task :install => :build do
114
- GEMS.each { |file| sh "gem install #{file}" }
115
- end
116
-
117
- desc "Publish gems (gemcutter)"
118
- task :push => :build do
119
- GEMS.each { |file| sh "gem push #{file}" }
120
- end
121
-
122
- end
123
-
124
- desc "generate dummy files"
125
- task :dummy_files do |t|
126
- chdir "lib" do
127
- rm_rf "sinatra/big_band/"
128
- mkdir_p "sinatra/big_band/"
129
- Dir.glob("big_band/**/*.rb") do |file|
130
- target = "sinatra" / file
131
- mkdir_p target.dirname
132
- File.open(target, "w") do |f|
133
- f.puts "# Generated file, run 'rake #{t.name}' to regenerate"
134
- f.puts "require #{file[0..-4].inspect}"
18
+ def project_namespace(parent = nil, all = true, &block)
19
+ return namespace(parent) { project_namespace(nil, all, &block) } if parent
20
+ project_was, default_desc_was = @project, @default_desc
21
+ namespaces = Subproject.inject({}) { |h, p| h.merge p.name => p}
22
+ namespaces[all == true ? nil : all] = :all if all
23
+ namespaces.each do |name, project|
24
+ @project, @default_desc = project, false
25
+ if name
26
+ namespace(name, &block)
27
+ if @default_desc
28
+ desc @default_desc
29
+ task name => "#{name}:default"
135
30
  end
31
+ else
32
+ yield
136
33
  end
137
34
  end
35
+ @project, @default_desc = project_was, default_desc_was
138
36
  end
139
37
 
140
- desc "make a release, will fail if there are uncommitted changes or the specs don't pass"
141
- task :release => "release:gem"
142
- namespace :release do
38
+ def subproject
39
+ @subproject
40
+ end
143
41
 
144
- task(:committed) do
145
- status = %x[git status]
146
- raise "uncommitted changes" unless status =~ /nothing to commit/
147
- raise "not on branch master" unless status =~ /On branch master\n/
42
+ def subproject_block(project)
43
+ proc do |raketask|
44
+ @subproject, subproject_was = project, @subproject
45
+ yield raketask if block_given?
46
+ @subproject = subproject_was
148
47
  end
48
+ end
149
49
 
150
- task :version_bump => [:spec, :committed] do
151
- new_version = ENV["VERSION"] || BigBand::VERSION.gsub(/\.(\d+)$/) { ".#{$1.to_i + 1}" }
152
- old_source = File.read "lib/big_band/version.rb"
153
- File.open("lib/big_band/version.rb", "w") do |f|
154
- f.puts 'require "big_band/integration" unless defined? BigBand'
155
- f.puts "BigBand::VERSION = #{new_version.inspect}"
156
- f.puts "BigBand::DATE = #{Date.today.to_s.inspect}"
157
- end
158
- puts "version bump: #{BigBand::VERSION} -> #{new_version}'"
159
- BigBand::VERSION.replace new_version
50
+ def project_task(name, &block)
51
+ return project_namespace { project_task(name, &block) } unless @project
52
+ name, dependencies = name.to_a.first if name.is_a? Hash
53
+ dependencies = [dependencies].flatten.compact
54
+ if @project == :all
55
+ dependencies += Subproject.map { |p| "#{p.name}:#{name}" }
56
+ block = nil
57
+ insert_desc "all subprojects"
58
+ else
59
+ insert_desc @project.name
160
60
  end
161
-
162
- task :prepare => [:version_bump, "dependencies:generate:rip", :clobber, "doc:readme", "gems:build"]
163
-
164
- task :git => :prepare do
165
- message = "-m 'release: #{BigBand::VERSION}'"
166
- sh "git ci -a #{message}"
167
- sh "git tag -a v#{BigBand::VERSION} #{message}"
168
- sh "git push && git push --tags"
61
+ if name.to_s == "default"
62
+ @default_desc = Rake.application.last_comment
63
+ desc nil
169
64
  end
170
-
171
- task :gem => [:git, "gems:push"]
172
-
65
+ task({name => dependencies}, &subproject_block(@project, &block))
173
66
  end
174
67
 
175
- ############
176
- # aliases
177
-
178
- task :c => [:clobber, "doc:readme"]
179
- task :s => :spec
180
- task :d
181
- namespace :d do
182
- task :r => "doc:readme"
183
- task :y => "doc:yardoc"
184
- end
185
- task :g => :gems
186
- namespace :g do
187
- task :b => "gems:build"
188
- task :i => "gems:install"
189
- task :p => "gems:push"
68
+ Dir.glob("tasks/*.task").sort.each do |file|
69
+ eval File.read(file), binding, file, 1
190
70
  end
data/TODO.md ADDED
@@ -0,0 +1,50 @@
1
+ TODO
2
+ ====
3
+
4
+ For 0.4.0 release
5
+ -----------------
6
+
7
+ All subprojects:
8
+
9
+ * Add licenses, deps.rip, maybe dependencies file for monk
10
+
11
+ BigBand:
12
+
13
+ * Create some sort of website (GitHub Pages?)
14
+ * Write example app
15
+
16
+ After 0.4.0
17
+ -----------
18
+
19
+ General:
20
+
21
+ * Implement more fancy stuff
22
+ * Padrino integration (maybe an example app, maybe some docs, dunno)
23
+ * Monk skeleton using big\_band
24
+ * See if stack\_helper can be extracted and is of any use (stack\_helper branch)
25
+ * Improve inline documentation (YARD tags)
26
+ * Maybe switch to [sinatra-flash](http://github.com/SFEley/sinatra-flash)
27
+
28
+ sinatra-advanced-routes:
29
+
30
+ * Make compatible with [Usher](http://github.com/joshbuddy/usher)
31
+ * Make compatible with [padrino-core/routing](http://github.com/padrino/padrino-framework/issues/issue/46)
32
+
33
+ Subprojects to be published or written:
34
+
35
+ * queueba (yet another message queue based on redis, maybe)
36
+ * sinatra-postpone
37
+ * "sinatra-queueba" or redis channel for pusher + pusher integration for sinatra
38
+
39
+ Before 0.5.0
40
+ ------------
41
+
42
+ BigBand:
43
+
44
+ * remove `::BigBand`
45
+
46
+ monkey-lib:
47
+
48
+ * remove `Object#metaclass`
49
+ * remove `Object#metaclass_eval`
50
+
data/lib/big_band.rb CHANGED
@@ -1,264 +1,19 @@
1
- require "sinatra/base"
2
- #require "monkey-lib"
3
- require "set"
4
-
5
- # BigBand is a collection of Sinatra extensions and offers better sinatra integration for common tools.
6
- # It is pluggable and each extension can be used in stand alone mode.
7
- #
8
- # The main features are:
9
- # * Routes as first class objects
10
- # * Better handling of #set: Merges hashes, more hooks
11
- # * Better compass integration
12
- # * YAML config files mapping to set (overwriting present values/methods is prevented)
13
- # * Rails-like helpers, like content_for
14
- # * Unicorn and Rainbows integration
15
- # * Smart code reloader only reloading changed files and getting rid of old routes
16
- # * Sass extensions
17
- # * Routes for inspection in development mode
18
- # * Helpers and configuration for Bacon, RSpec, Test::Spec and Test::Unit
19
- # * Tasks listing all routes for Monk and Rake.
20
- # * YARD: Add Sinatra routes to generated documentation
21
- #
22
- # Planned features:
23
- # * More template helpers
24
- # * ORM integration
25
- # * MSpec integration
26
- #
27
- # == Usage
28
- #
29
- # Using all BigBand features:
30
- #
31
- # require "sinatra/big_band"
32
- # class Example < Sinatra::BigBand
33
- # # Yay, BigBand!
34
- # end
35
- #
36
- # Or you may use the extension style:
37
- #
38
- # class AnotherExample < Sinatra::Base
39
- # register Sinatra::BigBand
40
- # end
41
- #
42
- # Or for the lazy folks (if you use classic style):
43
- #
44
- # require "sinatra"
45
- # require "sinatra/big_band"
46
- # # Yay, BigBand!
47
- #
48
- # Sinatra::BigBand is just an alias for BigBand. It was introduced manly to (in my opinion) have prettier
49
- # class signatures. First "class Example < Sinatra::BigBand" looks like Sinatra "class Example < BigBand", lets
50
- # give some credit to our beloved framework. Also, Sinatra::BigBand seems more akin to Sinatra::Base, Sinatra::Application
51
- # and Sinatra::Default, than just BigBand. Other than that I do not plan to move BigBand completely into Sinatra simply
52
- # to avoid more nesting. Last, but no least, the Sinatra docs sugest placing extensions inside Sinatra.
53
- #
54
- # Using just your favorite BigBand features:
55
- #
56
- # require "big_band"
57
- # class Example < Sinatra::Base
58
- # register BigBand::SomeFeature
59
- # # Yay, SomeFeature!
60
- # end
61
- #
62
- # Or, if you like a more handy syntax:
63
- #
64
- # require "sinatra/big_band"
65
- # class Example < Sinatra::BigBand :SomeFeature, MyStuff::Extension, :development => :DevelopmentOnlyFeature
66
- # # Yay, BigBand::SomeFeature!
67
- # # Yay, MyStuff::Extension!
68
- # # Yay, BigBand::DevelopmentOnlyFeature, if this is development mode!
69
- # end
70
- #
71
- # Loading all but one feature:
72
- #
73
- # require "sinatra/big_band"
74
- # class Example < Sinatra::BigBand :except => :SomeFeature
75
- # # Yay, all but BigBand::SomeFeature!
76
- # end
77
- #
78
- # Or just your favorite feature without you subclassing Sinatra::Base manually:
79
- #
80
- # require "sinatra"
81
- # require "big_band/some_feature"
82
- # Sinatra::Application.register BigBand::SomeFeature
83
- # # Yay, BigBand::SomeFeature!
84
- class BigBand < Sinatra::Base
85
-
86
- # Classes generated by BigBand.generate_class will be extended
87
- # with this class.
88
- module Generated
89
-
90
- attr_reader :big_band_extensions, :big_band_constructor
91
-
92
- # Adds extensions to subclass
93
- def inherited(klass)
94
- super
95
- BigBand.applications << klass
96
- BigBand.load_extensions(klass, *big_band_extensions)
97
- end
98
-
99
- # Use Generated#name for inspection.
100
- def inspect
101
- name
102
- end
103
-
104
- # Nice output for inspect and friends:
105
- # foo = Class.new BigBand(:SomeExtension)
106
- # foo.name # => BigBand(:SomeExtension)
107
- # Foo = foo
108
- # foo.name # => Foo
109
- def name
110
- real_name = super
111
- real_name.empty? ? big_band_constructor : real_name
112
- end
113
-
114
- end
115
-
116
- extend Generated
117
-
118
- def self.applications
119
- @applications ||= []
120
- end
121
-
122
- # Extensions to load.
123
- def self.big_band_extensions
124
- default_extensions
125
- end
126
-
127
- # Generates a class for the given extensions. Note that this class is ment to be
128
- # subclassed rather than used directly. Given extensione will only be available for
129
- # subclasses.
130
- #
131
- # class Foo < BigBand.generate_class(:except => :SomeExtension)
132
- # end
133
- def self.generate_class(*options)
134
- @generated_classes ||= {setify_parameters([]) => BigBand}
135
- @generated_classes[setify_parameters(options)] ||= Class.new(Sinatra::Base) do
136
- extend BigBand::Generated
137
- @big_band_extensions = options
138
- @big_band_constructor = "BigBand(#{options.map { |o| o.inspect}.join ", "})"
139
- end
140
- end
141
-
142
- # Adds extensions to a Sinatra application:
143
- #
144
- # class MyApp < Sinatra::Base
145
- # end
146
- #
147
- # BigBand.load_extensions MyApp, :SomeExtension, :development => :AnotherExtension
148
- def self.load_extensions(klass, *extensions)
149
- extensions = default_extensions if extensions.empty?
150
- extensions.flatten.each do |extension|
151
- if extension.respond_to? :each_pair
152
- extension.each_pair do |key, value|
153
- values = [value].flatten
154
- case key
155
- when :production, :test, :development
156
- klass.configure(key) { BigBand.load_extensions(klass, *values) }
157
- when :except
158
- exts = @nonenv_extensions.reject { |e| values.include? e }
159
- exts << @env_extensions.inject({}) do |accepted, (env, list)|
160
- accepted.merge env => list.reject { |e| values.include? e }
161
- end
162
- load_extensions(klass, *exts)
163
- else raise ArgumentError, "unknown key #{key.inspect}"
164
- end
165
- end
166
- else
167
- klass.register module_for(extension)
168
- end
169
- end
170
- end
171
-
172
- # Returns the module for a given extension identifier:
173
- #
174
- # BigBand.module_for :BasicExtension # => BigBand::BasicExtension
175
- # BigBand.module_for Array # => Array
176
- # BigBand.module_for "Foo::Bar" # => BigBand::Foo::Bar or Foo::Bar or raises an exception
177
- def self.module_for(extension)
178
- case extension
179
- when Module then extension
180
- when String then extension.split("::").inject(self) { |klass, name| klass.const_get name }
181
- when Symbol then const_get(extension)
182
- end
183
- end
184
-
185
- def self.setify_parameters(args)
186
- case args
187
- when Hash then args.inject({}) { |h,(k,v)| h k => setify_parameters(v) }
188
- when Array then args.flatten.to_set
189
- else args
190
- end
191
- end
192
-
193
- # Default extensions that will be used whenever you subclass BigBand. You can also use this to create
194
- # your own extension collection:
195
- #
196
- # class MyExtensions < BigBand(:except => :ExtensionIDontLike)
197
- # default_extension FunkyExtension, :development => DevExtension
198
- # end
199
- #
200
- # Note: If given a string or symbol, it will also try to setup an autoloader:
201
- #
202
- # MyExtensions.default_extensions :Foo
203
- def self.default_extensions(*extensions)
204
- return @default_extensions if @default_extensions and extensions.empty?
205
- @nonenv_extensions ||= []
206
- @env_extensions ||= {:development => []}
207
- extensions.each do |extension|
208
- if extension.respond_to? :each_pair
209
- extension.each_pair { |env, exts| (@env_extensions[env] ||= []).push(*exts) }
210
- else
211
- @nonenv_extensions.push(*extension)
212
- end
213
- end
214
- @default_extensions = [@nonenv_extensions, @env_extensions].flatten
215
- end
216
-
217
- def self.default_extension(name, path = nil, env = nil)
218
- autoload name, path if path
219
- default_extensions(env ? {env => name} : name)
220
- end
221
-
222
- default_extension :AdvancedRoutes, "big_band/advanced_routes"
223
- default_extension :BasicExtensions, "big_band/basic_extensions"
224
- default_extension :Compass, "big_band/compass"
225
- default_extension :ConfigFile, "big_band/config_file"
226
- default_extension :MoreHelpers, "big_band/more_helpers"
227
- default_extension :MoreServer, "big_band/more_server"
228
- default_extension :Reloader, "big_band/reloader", :development
229
- default_extension :Sass, "big_band/sass"
230
- default_extension :WebInspector, "big_band/web_inspector", :development
1
+ warn "#{caller.detect { |c| c !~ /require/ }}: require 'big_band' is deprecated, use require 'sinatra/big_band' instead."
2
+ require "sinatra/big_band"
231
3
 
4
+ def BigBand(*args, &block)
5
+ warn "#{caller.first}: Using BigBand is deprecated, use Sinatra::BigBand instead. It will be removed in BigBand 0.5."
6
+ Monkey.invisible { Sinatra::BigBand(*args, &block) }
232
7
  end
233
8
 
234
- # Shorthand for BigBand.generate_class
235
- def BigBand(*options)
236
- BigBand.generate_class(*options)
237
- end
238
-
239
- module Sinatra
240
- BigBand = ::BigBand
241
- class Base
242
- class << self
243
- alias register_without_big_band register
244
- def register(*extensions, &block)
245
- big_band, normal = extensions.partition { |e| e.respond_to? :big_band_extensions }
246
- big_band.each { |e| e.load_extensions self }
247
- register_without_big_band(*normal, &block)
248
- extensions
249
- end
250
- end
251
- end
252
- module Delegator
253
- # Hooks into Sinatra to allow easy integration with "require 'sinatra'".
254
- def self.included(klass)
255
- BigBand.inherited(Sinatra::Application)
256
- Sinatra::Application.extensions.each do |ext|
257
- delegate(*ext.delegations) if ext.respond_to? :delegations
258
- end
9
+ Module.class_eval do
10
+ alias const_missing_without_deprecation_warnings const_missing
11
+ def const_missing(name)
12
+ Monkey.invisible __FILE__ do
13
+ return const_missing_without_deprecation_warnings(name) unless name == :BigBand and self != ::Sinatra
14
+ from = caller.detect { |e| e !~ /const_missing/ }
15
+ warn "#{from}: Using BigBand is deprecated, use Sinatra::BigBand instead. It will be removed in BigBand 0.5."
16
+ Sinatra::BigBand
259
17
  end
260
18
  end
261
19
  end
262
-
263
- # If require "sinatra" came before require "big_band" Sinatra::Delegator.included has not been called.
264
- Sinatra::Delegator.included(self) if is_a? Sinatra::Delegator