├── .gitignore ├── .travis.yml ├── CHANGELOG.rdoc ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── README.rdoc ├── Rakefile ├── app ├── assets │ ├── javascripts │ │ ├── swf_fu.js.coffee │ │ └── swfobject.js │ └── swfs │ │ └── expressInstall.swf ├── helpers │ └── swf_fu_helper.rb └── models │ └── swf_fu │ └── generator.rb ├── lib ├── swf_fu.rb ├── swf_fu │ └── version.rb └── tasks │ └── swf_fu_tasks.rake ├── public └── swfs │ └── expressInstall.swf ├── swf_fu.gemspec └── test ├── dummy ├── .gitignore ├── Gemfile ├── Gemfile.lock ├── README.rdoc ├── Rakefile ├── app │ ├── assets │ │ ├── images │ │ │ └── rails.png │ │ ├── javascripts │ │ │ ├── application.js │ │ │ └── example.js.coffee │ │ ├── stylesheets │ │ │ └── application.css │ │ └── swfs │ │ │ ├── example.swf │ │ │ └── source │ │ │ ├── Example.as │ │ │ └── example.fla │ ├── controllers │ │ └── application_controller.rb │ ├── helpers │ │ └── application_helper.rb │ ├── mailers │ │ └── .gitkeep │ ├── models │ │ └── .gitkeep │ └── views │ │ ├── application │ │ └── example.html.erb │ │ └── layouts │ │ └── application.html.erb ├── config.ru ├── config │ ├── application.rb │ ├── boot.rb │ ├── database.yml │ ├── environment.rb │ ├── environments │ │ ├── development.rb │ │ ├── production.rb │ │ └── test.rb │ ├── initializers │ │ ├── backtrace_silencers.rb │ │ ├── inflections.rb │ │ ├── mime_types.rb │ │ ├── secret_token.rb │ │ ├── session_store.rb │ │ └── wrap_parameters.rb │ ├── locales │ │ └── en.yml │ └── routes.rb ├── db │ └── seeds.rb ├── doc │ └── README_FOR_APP ├── lib │ ├── assets │ │ └── .gitkeep │ └── tasks │ │ └── .gitkeep ├── log │ └── .gitkeep ├── public │ ├── 404.html │ ├── 422.html │ ├── 500.html │ ├── favicon.ico │ └── robots.txt ├── script │ └── rails ├── test │ ├── fixtures │ │ └── .gitkeep │ ├── functional │ │ └── .gitkeep │ ├── integration │ │ └── .gitkeep │ ├── test_helper.rb │ └── unit │ │ └── .gitkeep └── vendor │ ├── assets │ ├── javascripts │ │ └── .gitkeep │ └── stylesheets │ │ └── .gitkeep │ └── plugins │ └── .gitkeep ├── support ├── assert_same_striped.rb └── fixtures │ └── results.rb ├── swf_path_test.rb ├── swf_tag_test.rb └── test_helper.rb /.gitignore: -------------------------------------------------------------------------------- 1 | .bundle/ 2 | log/*.log 3 | pkg/ 4 | test/dummy/db/*.sqlite3 5 | test/dummy/log/*.log 6 | test/dummy/tmp/ 7 | test/dummy/.sass-cache 8 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | --- 2 | language: ruby 3 | rvm: 4 | - "1.8.7" 5 | - "1.9.2" 6 | - "1.9.3" 7 | - "2.0.0" 8 | - jruby-18mode 9 | - jruby-19mode 10 | - rbx-18mode 11 | - rbx-19mode 12 | -------------------------------------------------------------------------------- /CHANGELOG.rdoc: -------------------------------------------------------------------------------- 1 | = swf_fu --- History 2 | 3 | == Version 2.0.2 - April 25, 2012 4 | 5 | * Fix dependency on Rails 3.1+ and Readme 6 | 7 | == Version 2.0.2 - April 25, 2012 8 | 9 | * Fix dependency on Rails 3.1+ and Readme 10 | 11 | == Version 2.0.1 - March 23, 2012 12 | 13 | * Fix for Ruby 1.8 14 | 15 | == Version 2.0.0 - March 20, 2012 16 | 17 | * Refactored in an engine. Rails 3.1+ compatibility only. 18 | 19 | == Version 1.4.0 - May 8, 2010 20 | 21 | * Any option can be a block, in which case it is called (with the source swf passed as argument) 22 | 23 | == Version 1.3.1 - February 5, 2010 24 | 25 | * Improved compatibility with Rails 3.0: swf_tag now outputs html_safe content. 26 | 27 | * Got rid of deprecation warning in Rails 2.2+ when using swf_tag in block form. 28 | 29 | == Version 1.3.0 - June 20, 2009 30 | 31 | * Updated to swf_object v2.2. Change should not be noticeable to users, except compatibility improvements and better auto install. Added the option +switch_off_auto_hide_show+. 32 | 33 | == Version 1.2.0 - January 14, 2009 34 | 35 | * flashvars[:id] will now default to the DOM id of the object. I didn't want to have any extra defaults than the very basic ones, but there is no easy way to get this from Flash (see http://www.actionscript.org/forums/showthread.php3?t=136044 ) and no easy way to specify that using +swf_default_options+. 36 | * If flashvars is a string (e.g. "myVar=myValue") it will be parsed into a hash so that the behaviour for default values apply to strings or hashes. swf_default_options[:flashvars] can also be a string and will also be parsed before being merged. 37 | * Small bug fix: the options passed as hashes (:flashvars, :parameters and :html_options) were changed if swf_default_options[:flashvars, ...] existed. They are now left unchanged. 38 | 39 | == Version 1.1.0 - January 3, 2009 40 | 41 | * Improved the way to specify alternate content 42 | 43 | == Version 1.0.3 - January 3, 2009 44 | 45 | * Improved javascript initialization 46 | 47 | :initialize => [1, 2, 3] # produces in javascript: obj.initialize(1,2,3) instead of ([1,2,3]) 48 | # no :initialize produces in javascript: obj.initialize() instead of (null) 49 | :initialize => nil # stil produces obj.initialize(null) 50 | 51 | == Version 1.0.2 - January 3, 2009 52 | 53 | * Bug fix for flashvars in dynamic method 54 | 55 | == Version 1.0.1 - January 2, 2009 56 | 57 | * File reorganization 58 | * Bug fix for default options 59 | 60 | == Version 1.0 - X-mas, 2008 61 | 62 | === Initial release. 63 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "http://rubygems.org" 2 | 3 | # Declare your gem's dependencies in swf_fu.gemspec. 4 | # Bundler will treat runtime dependencies like base dependencies, and 5 | # development dependencies will be added by default to the :development group. 6 | gemspec 7 | 8 | group :test do 9 | # jquery-rails is used by the dummy application 10 | gem "jquery-rails" 11 | gem 'psych', :platforms => :mri_19 12 | end 13 | 14 | # Declare any dependencies that are still in development here instead of in 15 | # your gemspec. These might include edge Rails or gems from your path or 16 | # Git. Remember to move these dependencies to your gemspec before releasing 17 | # your gem to rubygems.org. 18 | 19 | # To use debugger 20 | # gem 'ruby-debug19', :require => 'ruby-debug' 21 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | PATH 2 | remote: . 3 | specs: 4 | swf_fu (2.0.4) 5 | coffee-script 6 | rails (>= 3.1) 7 | 8 | GEM 9 | remote: http://rubygems.org/ 10 | specs: 11 | actionmailer (3.2.2) 12 | actionpack (= 3.2.2) 13 | mail (~> 2.4.0) 14 | actionpack (3.2.2) 15 | activemodel (= 3.2.2) 16 | activesupport (= 3.2.2) 17 | builder (~> 3.0.0) 18 | erubis (~> 2.7.0) 19 | journey (~> 1.0.1) 20 | rack (~> 1.4.0) 21 | rack-cache (~> 1.1) 22 | rack-test (~> 0.6.1) 23 | sprockets (~> 2.1.2) 24 | activemodel (3.2.2) 25 | activesupport (= 3.2.2) 26 | builder (~> 3.0.0) 27 | activerecord (3.2.2) 28 | activemodel (= 3.2.2) 29 | activesupport (= 3.2.2) 30 | arel (~> 3.0.2) 31 | tzinfo (~> 0.3.29) 32 | activeresource (3.2.2) 33 | activemodel (= 3.2.2) 34 | activesupport (= 3.2.2) 35 | activesupport (3.2.2) 36 | i18n (~> 0.6) 37 | multi_json (~> 1.0) 38 | arel (3.0.2) 39 | builder (3.0.0) 40 | coffee-script (2.2.0) 41 | coffee-script-source 42 | execjs 43 | coffee-script-source (1.4.0) 44 | erubis (2.7.0) 45 | execjs (1.4.0) 46 | multi_json (~> 1.0) 47 | hike (1.2.1) 48 | i18n (0.6.0) 49 | journey (1.0.3) 50 | jquery-rails (2.0.1) 51 | railties (>= 3.2.0, < 5.0) 52 | thor (~> 0.14) 53 | json (1.6.5) 54 | mail (2.4.4) 55 | i18n (>= 0.4.0) 56 | mime-types (~> 1.16) 57 | treetop (~> 1.4.8) 58 | mime-types (1.21) 59 | multi_json (1.1.0) 60 | polyglot (0.3.3) 61 | psych (1.3.4) 62 | rack (1.4.1) 63 | rack-cache (1.2) 64 | rack (>= 0.4) 65 | rack-ssl (1.3.2) 66 | rack 67 | rack-test (0.6.1) 68 | rack (>= 1.0) 69 | rails (3.2.2) 70 | actionmailer (= 3.2.2) 71 | actionpack (= 3.2.2) 72 | activerecord (= 3.2.2) 73 | activeresource (= 3.2.2) 74 | activesupport (= 3.2.2) 75 | bundler (~> 1.0) 76 | railties (= 3.2.2) 77 | railties (3.2.2) 78 | actionpack (= 3.2.2) 79 | activesupport (= 3.2.2) 80 | rack-ssl (~> 1.3.2) 81 | rake (>= 0.8.7) 82 | rdoc (~> 3.4) 83 | thor (~> 0.14.6) 84 | rake (10.0.3) 85 | rdoc (3.12) 86 | json (~> 1.4) 87 | shoulda-context (1.0.0) 88 | sprockets (2.1.2) 89 | hike (~> 1.2) 90 | rack (~> 1.0) 91 | tilt (~> 1.1, != 1.3.0) 92 | thor (0.14.6) 93 | tilt (1.3.3) 94 | treetop (1.4.12) 95 | polyglot 96 | polyglot (>= 0.3.1) 97 | tzinfo (0.3.35) 98 | 99 | PLATFORMS 100 | ruby 101 | 102 | DEPENDENCIES 103 | jquery-rails 104 | psych 105 | shoulda-context 106 | swf_fu! 107 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | # swf_fu plugin for rails 2 | # Copyright (c) 2010, Marc-André Lafortune. 3 | # All rights reserved. 4 | # Inspired by FlashObject by Davide D'Agostino aka DAddYE (http://www.lipsiasoft.com) 5 | # Uses SWFObject.js 2.2 (http://code.google.com/p/swfobject) 6 | # 7 | # Licensed under the terms of the (modified) BSD License below: 8 | # 9 | # Redistribution and use in source and binary forms, with or without 10 | # modification, are permitted provided that the following conditions are met: 11 | # * Redistributions of source code must retain the above copyright 12 | # notice, this list of conditions and the following disclaimer. 13 | # * Redistributions in binary form must reproduce the above copyright 14 | # notice, this list of conditions and the following disclaimer in the 15 | # documentation and/or other materials provided with the distribution. 16 | # * Neither the name of the nor the 17 | # names of its contributors may be used to endorse or promote products 18 | # derived from this software without specific prior written permission. 19 | # 20 | # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY 21 | # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 22 | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | # DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 24 | # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 25 | # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 26 | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 27 | # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 29 | # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /README.rdoc: -------------------------------------------------------------------------------- 1 | = +swf_fu+ {}[https://travis-ci.org/marcandre/swf_fu] {Gem Version}[http://badge.fury.io/rb/swf_fu] 2 | 3 | With the +swf_fu+ plugin, rails treats your swf files like any other asset (images, javascripts, etc...). 4 | 5 | +swf_fu+ (pronounced "swif-fu", bonus joke for french speakers) uses SWFObject 2.2 to embed swf objects in HTML and supports all its options. 6 | SWFObject 2 is such a nice library that Adobe now uses it as the official way to embed swf! 7 | SWFObject's project can be found at http://code.google.com/p/swfobject 8 | 9 | Comments and pull requests welcome: http://github.com/marcandre/swf_fu 10 | 11 | == Compatibility 12 | 13 | Version 2 of +swf_fu+ is an engine for Rails 3.1+ and Ruby 1.8.7+. 14 | 15 | Version 1.x was a plugin for previous versions of Rails and should not be used with Rails 3.1+. If you want to use it, checkout the v1.x branch[https://github.com/marcandre/swf_fu/tree/v1.x]. If you are upgrading to Rails 3.1+, remove the plugin! 16 | 17 | == Install 18 | 19 | Add to your +Gemfile+: 20 | 21 | gem "swf_fu", "~> 2.0" 22 | 23 | Then run `bundle install`. 24 | 25 | You also need to require some javascripts, so in your `app/assets/javascripts/application.js` you want to append: 26 | 27 | \\= require swf_fu 28 | 29 | == Usage 30 | 31 | === Embedding in HTML 32 | 33 | To embed a swf file, use +swf_tag+: 34 | <%= swf_tag "i_like_flashing" %> 35 | 36 | Exactly like images and javascripts, +swf_tag+ will use +swf_path+ 37 | to determine the path of the swf file; it will assume it is in /assets/swfs/ or in /public/swfs/ 38 | unless specified otherwise and it will add the ".swf" extension automatically. 39 | 40 | You can specify alternate content either with the options :alt => "Get Flash!" or you can use +swf_tag+ as a block: 41 | 42 | <% swf_tag "i_like_flashing" do %> 43 | Get Flash 44 | <% end %> 45 | 46 | === Options 47 | 48 | * :id - the DOM +id+ of the flash +object+ element that is used to contain the Flash object; defaults to the name of the swf in +source+ 49 | * :width, :height - the width & height of the Flash object. Defaults to "100%". These could also specified using :size 50 | * :size - the size of the Flash object, in the form "400x300". 51 | * :mode - Either :dynamic (default) or :static. Refer to SWFObject's doc[http://code.google.com/p/swfobject/wiki/documentation#Should_I_use_the_static_or_dynamic_publishing_method?] 52 | * :flashvars - a Hash of variables that are passed to the swf. Can also be a string like "foo=bar&hello=world". Defaults to {:id => the DOM id} 53 | * :parameters - a Hash of configuration parameters for the swf. See Adobe's doc[http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_12701#optional] 54 | * :html_options - a Hash of extra html options for the object tag. 55 | * :alt - HTML text that is displayed when the Flash player is not available. Defaults to a "Get Flash" image pointing to Adobe Flash's installation page. This can also be specified as a block (see embedding section). In Rails 3, this text is _assumed_ to be HTML, so there is no need to call +html_safe+ on it. 56 | * :flash_version - the version of the Flash player that is required (e.g. "7" (default) or "8.1.0") 57 | * :auto_install - a swf file that will upgrade flash player if needed (defaults to "expressInstall" which was installed by +swf_fu+) 58 | * :javascript_class - specify a javascript class (e.g. "MyFlash") for your flash object. If it exists, the +initialize+ method will be called. See the 'dummy' example in the test folder 59 | * :initialize - arguments to pass to the initialization method of your javascript class. 60 | * :div_id - the DOM +id+ of the containing div itself. Defaults to "#{option[:id]}_div" 61 | * :switch_off_auto_hide_show - switch off SWFObject's default hide/show behavior. SWFObject temporarily hides your SWF or alternative content until the library has decided which content to display. Defaults to nil. 62 | 63 | You can override these default options with a global setting: 64 | 65 | ActionView::Base.swf_default_options = {:mode => :static} # All swf_tag will use the static mode by default 66 | 67 | In your config files, you can write this as: 68 | 69 | config.action_view.swf_default_options = {:mode => :static} # All swf_tag will use the static mode by default 70 | 71 | Any of these options can be a +Proc+, in which case it will be called each time swf_tag is called. 72 | 73 | For example, the following will generate unique IDs: 74 | 75 | my_swf_counter = 0 76 | config.action_view.swf_default_options[:id] = Proc.new{"swf_unique_id_#{my_swf_counter+=1}"} 77 | 78 | === swf_path 79 | 80 | +swf_tag+ implements and relies on +swf_path+ which behaves in a similar fashion to +image_path+, +javascript_path+, etc...: 81 | 82 | swf_path("example") => "/swfs/example.swf" or "/assets/example.swf" 83 | swf_path("example.swf") => "/swfs/example.swf" or "/assets/example.swf" 84 | swf_path("fonts/optima") => "/swfs/fonts/optima.swf" or "/assets/fonts/optima.swf" 85 | swf_path("/fonts/optima") => "/fonts/optima.swf" 86 | swf_path("http://www.example.com/game.swf") => "http://www.example.com/game.swf" 87 | 88 | It takes into account the global setting +asset_host+, like any other asset: 89 | 90 | ActionController::Base.asset_host = "http://assets.example.com" 91 | image_path("logo.jpg") => "http://assets.example.com/images/logo.jpg" 92 | swf_path("fonts/optima") => "http://assets.example.com/swfs/fonts/optima.swf" 93 | 94 | Copyright (c) 2010-2013 Marc-André Lafortune, released under the BSD license 95 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env rake 2 | begin 3 | require 'bundler/setup' 4 | rescue LoadError 5 | puts 'You must `gem install bundler` and `bundle install` to run rake tasks' 6 | end 7 | begin 8 | require 'rdoc/task' 9 | rescue LoadError 10 | require 'rdoc/rdoc' 11 | require 'rake/rdoctask' 12 | RDoc::Task = Rake::RDocTask 13 | end 14 | 15 | RDoc::Task.new(:rdoc) do |rdoc| 16 | rdoc.rdoc_dir = 'rdoc' 17 | rdoc.title = 'Swf Fu' 18 | rdoc.options << '--line-numbers' 19 | rdoc.rdoc_files.include('README.rdoc') 20 | rdoc.rdoc_files.include('lib/**/*.rb') 21 | end 22 | 23 | 24 | 25 | 26 | Bundler::GemHelper.install_tasks 27 | 28 | require 'rake/testtask' 29 | 30 | Rake::TestTask.new(:test) do |t| 31 | t.libs << 'lib' 32 | t.libs << 'test' 33 | t.pattern = 'test/**/*_test.rb' 34 | t.verbose = false 35 | end 36 | 37 | 38 | task :default => :test 39 | -------------------------------------------------------------------------------- /app/assets/javascripts/swf_fu.js.coffee: -------------------------------------------------------------------------------- 1 | #= require_tree . 2 | 3 | @SwfFu = 4 | setup: (object, klass, init_args) -> 5 | object extends klass.prototype 6 | object.initialize?(init_args...) 7 | null -------------------------------------------------------------------------------- /app/assets/javascripts/swfobject.js: -------------------------------------------------------------------------------- 1 | /* SWFObject v2.2 2 | is released under the MIT License 3 | */ 4 | var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab:id - the DOM +id+ of the flash +object+ element that is used to contain the Flash object; defaults to the name of the swf in +source+ 7 | # * :width, :height - the width & height of the Flash object. Defaults to "100%". These could also specified using :size 8 | # * :size - the size of the Flash object, in the form "400x300". 9 | # * :mode - Either :dynamic (default) or :static. Refer to SWFObject's doc[http://code.google.com/p/swfobject/wiki/documentation#Should_I_use_the_static_or_dynamic_publishing_method?] 10 | # * :flashvars - a Hash of variables that are passed to the swf. Can also be a string like "foo=bar&hello=world" 11 | # * :parameters - a Hash of configuration parameters for the swf. See Adobe's doc[http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_12701#optional] 12 | # * :alt - HTML text that is displayed when the Flash player is not available. Defaults to a "Get Flash" image pointing to Adobe Flash's installation page. 13 | # * :flash_version - the version of the Flash player that is required (e.g. "7" (default) or "8.1.0") 14 | # * :auto_install - a swf file that will upgrade flash player if needed (defaults to "expressInstall" which was installed by swf_fu) 15 | # * :javascript_class - specify a javascript class (e.g. "MyFlash") for your flash object. The initialize method will be called when the flash object is ready. 16 | # * :initialize - arguments to pass to the initialization method of your javascript class. 17 | # * :div_id - the DOM +id+ of the containing div itself. Defaults to "#{option[:id]}"_div 18 | # 19 | def swf_tag(source, options={}, &block) 20 | ::SwfFu::Generator.new(source, options, self).generate(&block) 21 | end 22 | 23 | 24 | # Computes the path to an swf asset in the public 'swfs' directory. 25 | # Full paths from the document root will be passed through. 26 | # Used internally by +swf_tag+ to build the swf path. 27 | # 28 | # ==== Examples 29 | # swf_path("example") # => /swfs/example.swf 30 | # swf_path("example.swf") # => /swfs/example.swf 31 | # swf_path("fonts/optima") # => /swfs/fonts/optima.swf 32 | # swf_path("/fonts/optima") # => /fonts/optima.swf 33 | # swf_path("http://www.example.com/game.swf") # => http://www.example.com/game.swf 34 | # 35 | # It takes into account the global setting +asset_host+, like any other asset: 36 | # 37 | # ActionController::Base.asset_host = "http://assets.example.com" 38 | # image_path("logo.jpg") # => http://assets.example.com/images/logo.jpg 39 | # swf_path("fonts/optima") # => http://assets.example.com/swfs/fonts/optima.swf 40 | def swf_path(source) 41 | if respond_to? :path_to_asset 42 | path_to_asset(source, :ext => 'swf') 43 | else 44 | asset_paths.compute_public_path(source, 'swfs', :ext => 'swf') 45 | end 46 | end 47 | alias_method :path_to_swf, :swf_path # aliased to avoid conflicts with an image_path named route 48 | 49 | # Computes the full URL to a swf asset in the public swf directory. 50 | # This will use +swf_path+ internally, so most of their behaviors will be the same. 51 | def swf_url(source) 52 | URI.join(current_host, path_to_swf(source)).to_s 53 | end 54 | alias_method :url_to_swf, :swf_url # aliased to avoid conflicts with an swf_url named route 55 | end 56 | -------------------------------------------------------------------------------- /app/models/swf_fu/generator.rb: -------------------------------------------------------------------------------- 1 | module SwfFu 2 | DEFAULTS = { 3 | :width => "100%", 4 | :height => "100%", 5 | :flash_version => 7, 6 | :mode => :dynamic, 7 | :auto_install => "expressInstall", 8 | :alt => <<-"EOS".squeeze(" ").strip.freeze 9 | 10 | Get Adobe Flash player 11 | 12 | EOS 13 | }.freeze 14 | 15 | class Generator # :nodoc: 16 | VALID_MODES = [:static, :dynamic] 17 | def initialize(source, options, view) 18 | @view = view 19 | @source = view.swf_path(source) 20 | options = ActionView::Base.swf_default_options.merge(options) 21 | options.each do |key, value| 22 | options[key] = value.call(source) if value.respond_to?(:call) 23 | end 24 | [:html_options, :parameters, :flashvars].each do |k| 25 | options[k] = convert_to_hash(options[k]).reverse_merge convert_to_hash(ActionView::Base.swf_default_options[k]) 26 | end 27 | options.reverse_merge!(DEFAULTS) 28 | options[:id] ||= source.gsub(/^.*\//, '').gsub(/\.swf$/,'') 29 | options[:id] = force_to_valid_id(options[:id]) 30 | options[:div_id] ||= options[:id]+"_div" 31 | options[:div_id] = force_to_valid_id(options[:div_id]) 32 | options[:width], options[:height] = options[:size].scan(/^(\d*%?)x(\d*%?)$/).first if options[:size] 33 | options[:auto_install] &&= @view.swf_path(options[:auto_install]) 34 | options[:flashvars][:id] ||= options[:id] 35 | @mode = options.delete(:mode) 36 | @options = options 37 | unless VALID_MODES.include? @mode 38 | raise ArgumentError, "options[:mode] should be either #{VALID_MODES.join(' or ')}" 39 | end 40 | end 41 | 42 | def force_to_valid_id(id) 43 | id = id.gsub /[^A-Za-z0-9\-_]/, "_" # HTML id can only contain these characters 44 | id = "swf_" + id unless id =~ /^[A-Z]/i # HTML id must start with alpha 45 | id 46 | end 47 | 48 | def generate(&block) 49 | @options[:alt] = @view.capture(&block) if block_given? 50 | send(@mode) 51 | end 52 | 53 | private 54 | def convert_to_hash(s) 55 | case s 56 | when Hash 57 | s 58 | when nil 59 | {} 60 | when String 61 | s.split("&").inject({}) do |h, kvp| 62 | key, value = kvp.split("=") 63 | h[key.to_sym] = CGI::unescape(value) 64 | h 65 | end 66 | else 67 | raise ArgumentError, "#{s} should be a Hash, a String or nil" 68 | end 69 | end 70 | 71 | def convert_to_string(h) 72 | h.map do |key_value| 73 | key_value.map{|val| CGI::escape(val.to_s)}.join("=") 74 | end.join("&") 75 | end 76 | 77 | def static 78 | param_list = @options[:parameters].map{|k,v| %() }.join("\n") 79 | param_list += %(\n) unless @options[:flashvars].empty? 80 | html_options = @options[:html_options].map{|k,v| %(#{k}="#{v}")}.join(" ") 81 | r = @view.javascript_tag( 82 | %(swfobject.registerObject("#{@options[:id]}_container", "#{@options[:flash_version]}", #{convert_to_escaped_arguments(@options[:auto_install])});) 83 | ) 84 | r << <<-"EOS".strip.html_safe 85 |
86 | 87 | #{param_list} 88 | 89 | 90 | #{param_list} 91 | 92 | #{@options[:alt]} 93 | 94 | 95 | 96 |
97 | EOS 98 | r << @view.javascript_tag(extend_js) if @options[:javascript_class] 99 | r << library_check 100 | r 101 | end 102 | 103 | def dynamic 104 | @options[:html_options] = @options[:html_options].merge(:id => @options[:id]) 105 | @options[:parameters] = @options[:parameters].dup # don't modify the original parameters 106 | args = convert_to_escaped_arguments(@source, 107 | *(@options.values_at(:div_id,:width,:height,:flash_version).map(&:to_s) + 108 | @options.values_at(:auto_install,:flashvars,:parameters,:html_options)) 109 | ) 110 | 111 | preambule = @options[:switch_off_auto_hide_show] ? "swfobject.switchOffAutoHideShow();" : "" 112 | r = @view.javascript_tag(preambule + "swfobject.embedSWF(#{args})") 113 | r << @view.content_tag("div", @options[:alt].html_safe, :id => @options[:div_id]) 114 | r << @view.javascript_tag("swfobject.addDomLoadEvent(function(){#{extend_js}})") if @options[:javascript_class] 115 | r << library_check 116 | r 117 | end 118 | 119 | def convert_to_escaped_arguments(*values) 120 | # Note: Rails used to escape <>& but it's now a setting 121 | values.map(&:to_json).join(",").gsub('>', '\u003E').gsub('<', '\u003C').gsub('&', '\u0026') 122 | end 123 | 124 | def extend_js 125 | args = @options[:initialize] 126 | args = [args] unless args.is_a?(Array) 127 | "SwfFu.setup($('##{@options[:id]}')[0], #{@options[:javascript_class]}, [#{convert_to_escaped_arguments(*args)}])" 128 | end 129 | 130 | def library_check 131 | return "" unless 'development' == ENV['RAILS_ENV'] 132 | @view.javascript_tag(<<-"EOS") 133 | if (typeof swfobject == 'undefined') { 134 | document.getElementById('#{@options[:div_id]}').innerHTML = 'Warning: SWFObject.js was not loaded properly. Make sure you require "swfobject" in your main javascript file.'; 135 | } 136 | EOS 137 | end 138 | end #class Generator 139 | end 140 | -------------------------------------------------------------------------------- /lib/swf_fu.rb: -------------------------------------------------------------------------------- 1 | module SwfFu 2 | class Engine < Rails::Engine 3 | # Thanks to http://robots.thoughtbot.com/post/159805560/tips-for-writing-your-own-rails-engine for: 4 | config.to_prepare do 5 | ActionView::Helpers.class_eval { include SwfFuHelper } 6 | end 7 | # Thanks to http://jonswope.com/2010/07/25/rails-3-engines-plugins-and-static-assets/ for: 8 | initializer "static assets" do |app| 9 | app.middleware.use ::ActionDispatch::Static, "#{root}/public" 10 | end 11 | end 12 | 13 | ::ActionView::Base.cattr_accessor :swf_default_options 14 | ::ActionView::Base.swf_default_options = {} 15 | end 16 | -------------------------------------------------------------------------------- /lib/swf_fu/version.rb: -------------------------------------------------------------------------------- 1 | module SwfFu 2 | VERSION = '2.0.4' 3 | end 4 | -------------------------------------------------------------------------------- /lib/tasks/swf_fu_tasks.rake: -------------------------------------------------------------------------------- 1 | # desc "Explaining what the task does" 2 | # task :swf_fu do 3 | # # Task goes here 4 | # end 5 | -------------------------------------------------------------------------------- /public/swfs/expressInstall.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcandre/swf_fu/64c61378e2935510969b473696660c8fe9023a76/public/swfs/expressInstall.swf -------------------------------------------------------------------------------- /swf_fu.gemspec: -------------------------------------------------------------------------------- 1 | $:.push File.expand_path("../lib", __FILE__) 2 | 3 | # Maintain your gem's version: 4 | require "swf_fu/version" 5 | 6 | # Describe your gem and declare its dependencies: 7 | Gem::Specification.new do |s| 8 | s.name = "swf_fu" 9 | s.version = SwfFu::VERSION 10 | s.authors = ["Marc-André Lafortune"] 11 | s.email = ["github@marc-andre.ca"] 12 | s.homepage = "https://github.com/marcandre/swf_fu" 13 | s.summary = "Rails.supported_asset_types << 'swf'" 14 | s.description = "Treat your swf files like other assets" 15 | 16 | s.files = Dir["{app,config,db,lib}/**/*"] + ["LICENSE", "Rakefile", "README.rdoc"] 17 | s.test_files = Dir["test/**/*"] 18 | 19 | s.add_dependency "rails", ">= 3.1" 20 | s.add_dependency "coffee-script" 21 | 22 | 23 | s.add_development_dependency "shoulda-context" 24 | end 25 | -------------------------------------------------------------------------------- /test/dummy/.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | # 3 | # If you find yourself ignoring temporary files generated by your text editor 4 | # or operating system, you probably want to add a global ignore instead: 5 | # git config --global core.excludesfile ~/.gitignore_global 6 | 7 | # Ignore bundler config 8 | /.bundle 9 | 10 | # Ignore the default SQLite database. 11 | /db/*.sqlite3 12 | 13 | # Ignore all logfiles and tempfiles. 14 | /log/*.log 15 | /tmp 16 | -------------------------------------------------------------------------------- /test/dummy/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'rails', '3.2.6' 4 | 5 | # Bundle edge Rails instead: 6 | # gem 'rails', :git => 'git://github.com/rails/rails.git' 7 | 8 | # gem 'sqlite3' 9 | 10 | # Gems used only for assets and not required 11 | # in production environments by default. 12 | group :assets do 13 | gem 'sass-rails', '~> 3.2.3' 14 | gem 'coffee-rails', '~> 3.2.1' 15 | 16 | # See https://github.com/sstephenson/execjs#readme for more supported runtimes 17 | # gem 'therubyracer', :platforms => :ruby 18 | 19 | gem 'uglifier', '>= 1.0.3' 20 | end 21 | 22 | gem 'jquery-rails' 23 | 24 | gem 'swf_fu', :path => "../.." 25 | # To use ActiveModel has_secure_password 26 | # gem 'bcrypt-ruby', '~> 3.0.0' 27 | 28 | # To use Jbuilder templates for JSON 29 | # gem 'jbuilder' 30 | 31 | # Use unicorn as the app server 32 | # gem 'unicorn' 33 | 34 | # Deploy with Capistrano 35 | # gem 'capistrano' 36 | 37 | # To use debugger 38 | # gem 'debugger' 39 | -------------------------------------------------------------------------------- /test/dummy/Gemfile.lock: -------------------------------------------------------------------------------- 1 | PATH 2 | remote: ../.. 3 | specs: 4 | swf_fu (2.0.4) 5 | coffee-script 6 | rails (>= 3.1) 7 | 8 | GEM 9 | remote: https://rubygems.org/ 10 | specs: 11 | actionmailer (3.2.6) 12 | actionpack (= 3.2.6) 13 | mail (~> 2.4.4) 14 | actionpack (3.2.6) 15 | activemodel (= 3.2.6) 16 | activesupport (= 3.2.6) 17 | builder (~> 3.0.0) 18 | erubis (~> 2.7.0) 19 | journey (~> 1.0.1) 20 | rack (~> 1.4.0) 21 | rack-cache (~> 1.2) 22 | rack-test (~> 0.6.1) 23 | sprockets (~> 2.1.3) 24 | activemodel (3.2.6) 25 | activesupport (= 3.2.6) 26 | builder (~> 3.0.0) 27 | activerecord (3.2.6) 28 | activemodel (= 3.2.6) 29 | activesupport (= 3.2.6) 30 | arel (~> 3.0.2) 31 | tzinfo (~> 0.3.29) 32 | activeresource (3.2.6) 33 | activemodel (= 3.2.6) 34 | activesupport (= 3.2.6) 35 | activesupport (3.2.6) 36 | i18n (~> 0.6) 37 | multi_json (~> 1.0) 38 | arel (3.0.2) 39 | builder (3.0.0) 40 | coffee-rails (3.2.2) 41 | coffee-script (>= 2.2.0) 42 | railties (~> 3.2.0) 43 | coffee-script (2.2.0) 44 | coffee-script-source 45 | execjs 46 | coffee-script-source (1.3.3) 47 | erubis (2.7.0) 48 | execjs (1.4.0) 49 | multi_json (~> 1.0) 50 | hike (1.2.1) 51 | i18n (0.6.0) 52 | journey (1.0.4) 53 | jquery-rails (2.0.2) 54 | railties (>= 3.2.0, < 5.0) 55 | thor (~> 0.14) 56 | json (1.7.4) 57 | mail (2.4.4) 58 | i18n (>= 0.4.0) 59 | mime-types (~> 1.16) 60 | treetop (~> 1.4.8) 61 | mime-types (1.19) 62 | multi_json (1.3.6) 63 | polyglot (0.3.3) 64 | rack (1.4.1) 65 | rack-cache (1.2) 66 | rack (>= 0.4) 67 | rack-ssl (1.3.2) 68 | rack 69 | rack-test (0.6.1) 70 | rack (>= 1.0) 71 | rails (3.2.6) 72 | actionmailer (= 3.2.6) 73 | actionpack (= 3.2.6) 74 | activerecord (= 3.2.6) 75 | activeresource (= 3.2.6) 76 | activesupport (= 3.2.6) 77 | bundler (~> 1.0) 78 | railties (= 3.2.6) 79 | railties (3.2.6) 80 | actionpack (= 3.2.6) 81 | activesupport (= 3.2.6) 82 | rack-ssl (~> 1.3.2) 83 | rake (>= 0.8.7) 84 | rdoc (~> 3.4) 85 | thor (>= 0.14.6, < 2.0) 86 | rake (0.9.2.2) 87 | rdoc (3.12) 88 | json (~> 1.4) 89 | sass (3.1.20) 90 | sass-rails (3.2.5) 91 | railties (~> 3.2.0) 92 | sass (>= 3.1.10) 93 | tilt (~> 1.3) 94 | sprockets (2.1.3) 95 | hike (~> 1.2) 96 | rack (~> 1.0) 97 | tilt (~> 1.1, != 1.3.0) 98 | thor (0.15.4) 99 | tilt (1.3.3) 100 | treetop (1.4.10) 101 | polyglot 102 | polyglot (>= 0.3.1) 103 | tzinfo (0.3.33) 104 | uglifier (1.2.7) 105 | execjs (>= 0.3.0) 106 | multi_json (~> 1.3) 107 | 108 | PLATFORMS 109 | ruby 110 | 111 | DEPENDENCIES 112 | coffee-rails (~> 3.2.1) 113 | jquery-rails 114 | rails (= 3.2.6) 115 | sass-rails (~> 3.2.3) 116 | swf_fu! 117 | uglifier (>= 1.0.3) 118 | -------------------------------------------------------------------------------- /test/dummy/README.rdoc: -------------------------------------------------------------------------------- 1 | == Welcome to Rails 2 | 3 | Rails is a web-application framework that includes everything needed to create 4 | database-backed web applications according to the Model-View-Control pattern. 5 | 6 | This pattern splits the view (also called the presentation) into "dumb" 7 | templates that are primarily responsible for inserting pre-built data in between 8 | HTML tags. The model contains the "smart" domain objects (such as Account, 9 | Product, Person, Post) that holds all the business logic and knows how to 10 | persist themselves to a database. The controller handles the incoming requests 11 | (such as Save New Account, Update Product, Show Post) by manipulating the model 12 | and directing data to the view. 13 | 14 | In Rails, the model is handled by what's called an object-relational mapping 15 | layer entitled Active Record. This layer allows you to present the data from 16 | database rows as objects and embellish these data objects with business logic 17 | methods. You can read more about Active Record in 18 | link:files/vendor/rails/activerecord/README.html. 19 | 20 | The controller and view are handled by the Action Pack, which handles both 21 | layers by its two parts: Action View and Action Controller. These two layers 22 | are bundled in a single package due to their heavy interdependence. This is 23 | unlike the relationship between the Active Record and Action Pack that is much 24 | more separate. Each of these packages can be used independently outside of 25 | Rails. You can read more about Action Pack in 26 | link:files/vendor/rails/actionpack/README.html. 27 | 28 | 29 | == Getting Started 30 | 31 | 1. At the command prompt, create a new Rails application: 32 | rails new myapp (where myapp is the application name) 33 | 34 | 2. Change directory to myapp and start the web server: 35 | cd myapp; rails server (run with --help for options) 36 | 37 | 3. Go to http://localhost:3000/ and you'll see: 38 | "Welcome aboard: You're riding Ruby on Rails!" 39 | 40 | 4. Follow the guidelines to start developing your application. You can find 41 | the following resources handy: 42 | 43 | * The Getting Started Guide: http://guides.rubyonrails.org/getting_started.html 44 | * Ruby on Rails Tutorial Book: http://www.railstutorial.org/ 45 | 46 | 47 | == Debugging Rails 48 | 49 | Sometimes your application goes wrong. Fortunately there are a lot of tools that 50 | will help you debug it and get it back on the rails. 51 | 52 | First area to check is the application log files. Have "tail -f" commands 53 | running on the server.log and development.log. Rails will automatically display 54 | debugging and runtime information to these files. Debugging info will also be 55 | shown in the browser on requests from 127.0.0.1. 56 | 57 | You can also log your own messages directly into the log file from your code 58 | using the Ruby logger class from inside your controllers. Example: 59 | 60 | class WeblogController < ActionController::Base 61 | def destroy 62 | @weblog = Weblog.find(params[:id]) 63 | @weblog.destroy 64 | logger.info("#{Time.now} Destroyed Weblog ID ##{@weblog.id}!") 65 | end 66 | end 67 | 68 | The result will be a message in your log file along the lines of: 69 | 70 | Mon Oct 08 14:22:29 +1000 2007 Destroyed Weblog ID #1! 71 | 72 | More information on how to use the logger is at http://www.ruby-doc.org/core/ 73 | 74 | Also, Ruby documentation can be found at http://www.ruby-lang.org/. There are 75 | several books available online as well: 76 | 77 | * Programming Ruby: http://www.ruby-doc.org/docs/ProgrammingRuby/ (Pickaxe) 78 | * Learn to Program: http://pine.fm/LearnToProgram/ (a beginners guide) 79 | 80 | These two books will bring you up to speed on the Ruby language and also on 81 | programming in general. 82 | 83 | 84 | == Debugger 85 | 86 | Debugger support is available through the debugger command when you start your 87 | Mongrel or WEBrick server with --debugger. This means that you can break out of 88 | execution at any point in the code, investigate and change the model, and then, 89 | resume execution! You need to install ruby-debug to run the server in debugging 90 | mode. With gems, use sudo gem install ruby-debug. Example: 91 | 92 | class WeblogController < ActionController::Base 93 | def index 94 | @posts = Post.all 95 | debugger 96 | end 97 | end 98 | 99 | So the controller will accept the action, run the first line, then present you 100 | with a IRB prompt in the server window. Here you can do things like: 101 | 102 | >> @posts.inspect 103 | => "[#nil, "body"=>nil, "id"=>"1"}>, 105 | #"Rails", "body"=>"Only ten..", "id"=>"2"}>]" 107 | >> @posts.first.title = "hello from a debugger" 108 | => "hello from a debugger" 109 | 110 | ...and even better, you can examine how your runtime objects actually work: 111 | 112 | >> f = @posts.first 113 | => #nil, "body"=>nil, "id"=>"1"}> 114 | >> f. 115 | Display all 152 possibilities? (y or n) 116 | 117 | Finally, when you're ready to resume execution, you can enter "cont". 118 | 119 | 120 | == Console 121 | 122 | The console is a Ruby shell, which allows you to interact with your 123 | application's domain model. Here you'll have all parts of the application 124 | configured, just like it is when the application is running. You can inspect 125 | domain models, change values, and save to the database. Starting the script 126 | without arguments will launch it in the development environment. 127 | 128 | To start the console, run rails console from the application 129 | directory. 130 | 131 | Options: 132 | 133 | * Passing the -s, --sandbox argument will rollback any modifications 134 | made to the database. 135 | * Passing an environment name as an argument will load the corresponding 136 | environment. Example: rails console production. 137 | 138 | To reload your controllers and models after launching the console run 139 | reload! 140 | 141 | More information about irb can be found at: 142 | link:http://www.rubycentral.org/pickaxe/irb.html 143 | 144 | 145 | == dbconsole 146 | 147 | You can go to the command line of your database directly through rails 148 | dbconsole. You would be connected to the database with the credentials 149 | defined in database.yml. Starting the script without arguments will connect you 150 | to the development database. Passing an argument will connect you to a different 151 | database, like rails dbconsole production. Currently works for MySQL, 152 | PostgreSQL and SQLite 3. 153 | 154 | == Description of Contents 155 | 156 | The default directory structure of a generated Ruby on Rails application: 157 | 158 | |-- app 159 | | |-- assets 160 | | |-- images 161 | | |-- javascripts 162 | | `-- stylesheets 163 | | |-- controllers 164 | | |-- helpers 165 | | |-- mailers 166 | | |-- models 167 | | `-- views 168 | | `-- layouts 169 | |-- config 170 | | |-- environments 171 | | |-- initializers 172 | | `-- locales 173 | |-- db 174 | |-- doc 175 | |-- lib 176 | | `-- tasks 177 | |-- log 178 | |-- public 179 | |-- script 180 | |-- test 181 | | |-- fixtures 182 | | |-- functional 183 | | |-- integration 184 | | |-- performance 185 | | `-- unit 186 | |-- tmp 187 | | |-- cache 188 | | |-- pids 189 | | |-- sessions 190 | | `-- sockets 191 | `-- vendor 192 | |-- assets 193 | `-- stylesheets 194 | `-- plugins 195 | 196 | app 197 | Holds all the code that's specific to this particular application. 198 | 199 | app/assets 200 | Contains subdirectories for images, stylesheets, and JavaScript files. 201 | 202 | app/controllers 203 | Holds controllers that should be named like weblogs_controller.rb for 204 | automated URL mapping. All controllers should descend from 205 | ApplicationController which itself descends from ActionController::Base. 206 | 207 | app/models 208 | Holds models that should be named like post.rb. Models descend from 209 | ActiveRecord::Base by default. 210 | 211 | app/views 212 | Holds the template files for the view that should be named like 213 | weblogs/index.html.erb for the WeblogsController#index action. All views use 214 | eRuby syntax by default. 215 | 216 | app/views/layouts 217 | Holds the template files for layouts to be used with views. This models the 218 | common header/footer method of wrapping views. In your views, define a layout 219 | using the layout :default and create a file named default.html.erb. 220 | Inside default.html.erb, call <% yield %> to render the view using this 221 | layout. 222 | 223 | app/helpers 224 | Holds view helpers that should be named like weblogs_helper.rb. These are 225 | generated for you automatically when using generators for controllers. 226 | Helpers can be used to wrap functionality for your views into methods. 227 | 228 | config 229 | Configuration files for the Rails environment, the routing map, the database, 230 | and other dependencies. 231 | 232 | db 233 | Contains the database schema in schema.rb. db/migrate contains all the 234 | sequence of Migrations for your schema. 235 | 236 | doc 237 | This directory is where your application documentation will be stored when 238 | generated using rake doc:app 239 | 240 | lib 241 | Application specific libraries. Basically, any kind of custom code that 242 | doesn't belong under controllers, models, or helpers. This directory is in 243 | the load path. 244 | 245 | public 246 | The directory available for the web server. Also contains the dispatchers and the 247 | default HTML files. This should be set as the DOCUMENT_ROOT of your web 248 | server. 249 | 250 | script 251 | Helper scripts for automation and generation. 252 | 253 | test 254 | Unit and functional tests along with fixtures. When using the rails generate 255 | command, template test files will be generated for you and placed in this 256 | directory. 257 | 258 | vendor 259 | External libraries that the application depends on. Also includes the plugins 260 | subdirectory. If the app has frozen rails, those gems also go here, under 261 | vendor/rails/. This directory is in the load path. 262 | -------------------------------------------------------------------------------- /test/dummy/Rakefile: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env rake 2 | # Add your own tasks in files placed in lib/tasks ending in .rake, 3 | # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. 4 | 5 | require File.expand_path('../config/application', __FILE__) 6 | 7 | Dummy::Application.load_tasks 8 | -------------------------------------------------------------------------------- /test/dummy/app/assets/images/rails.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcandre/swf_fu/64c61378e2935510969b473696660c8fe9023a76/test/dummy/app/assets/images/rails.png -------------------------------------------------------------------------------- /test/dummy/app/assets/javascripts/application.js: -------------------------------------------------------------------------------- 1 | // This is a manifest file that'll be compiled into application.js, which will include all the files 2 | // listed below. 3 | // 4 | // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, 5 | // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path. 6 | // 7 | // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the 8 | // the compiled file. 9 | // 10 | // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD 11 | // GO AFTER THE REQUIRES BELOW. 12 | // 13 | //= require jquery 14 | //= require jquery_ujs 15 | //= require_tree . 16 | //= require swf_fu -------------------------------------------------------------------------------- /test/dummy/app/assets/javascripts/example.js.coffee: -------------------------------------------------------------------------------- 1 | @receiveFromFlash = (arg) -> 2 | alert("Received from Flash: #{arg}") 3 | 4 | class @ExampleClass 5 | initialize: -> 6 | alert("We're ready to rock & roll...") 7 | 8 | say: (what) -> 9 | @sendFlash(what) 10 | -------------------------------------------------------------------------------- /test/dummy/app/assets/stylesheets/application.css: -------------------------------------------------------------------------------- 1 | /* 2 | * This is a manifest file that'll be compiled into application.css, which will include all the files 3 | * listed below. 4 | * 5 | * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, 6 | * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path. 7 | * 8 | * You're free to add application-wide styles to this file and they'll appear at the top of the 9 | * compiled file, but it's generally better to create a new file per style scope. 10 | * 11 | *= require_self 12 | *= require_tree . 13 | */ 14 | -------------------------------------------------------------------------------- /test/dummy/app/assets/swfs/example.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcandre/swf_fu/64c61378e2935510969b473696660c8fe9023a76/test/dummy/app/assets/swfs/example.swf -------------------------------------------------------------------------------- /test/dummy/app/assets/swfs/source/Example.as: -------------------------------------------------------------------------------- 1 | import flash.external.ExternalInterface; 2 | import mx.utils.Delegate; 3 | 4 | dynamic class Example extends MovieClip { 5 | 6 | function Example() { 7 | this.info = createTextField("info", getNextHighestDepth(), 0, 0, Stage.width, Stage.height); 8 | this.log(_level0.message ? _level0.message : "Hello, world!\n"); 9 | ExternalInterface.addCallback("sendFlash", this, this.receiveFromJS); 10 | } 11 | 12 | function callJS(arg) { 13 | ExternalInterface.call("receiveFromFlash", arg); 14 | } 15 | 16 | function receiveFromJS(arg) { 17 | this.log("Received from JS: "+arg+"\n"); 18 | this.callJS("Thanks for: "+arg); 19 | } 20 | 21 | function log(txt) { 22 | this.info.text += txt; 23 | } 24 | 25 | private var info: TextField; 26 | } -------------------------------------------------------------------------------- /test/dummy/app/assets/swfs/source/example.fla: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcandre/swf_fu/64c61378e2935510969b473696660c8fe9023a76/test/dummy/app/assets/swfs/source/example.fla -------------------------------------------------------------------------------- /test/dummy/app/controllers/application_controller.rb: -------------------------------------------------------------------------------- 1 | class ApplicationController < ActionController::Base 2 | protect_from_forgery 3 | def example 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /test/dummy/app/helpers/application_helper.rb: -------------------------------------------------------------------------------- 1 | module ApplicationHelper 2 | end 3 | -------------------------------------------------------------------------------- /test/dummy/app/mailers/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcandre/swf_fu/64c61378e2935510969b473696660c8fe9023a76/test/dummy/app/mailers/.gitkeep -------------------------------------------------------------------------------- /test/dummy/app/models/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcandre/swf_fu/64c61378e2935510969b473696660c8fe9023a76/test/dummy/app/models/.gitkeep -------------------------------------------------------------------------------- /test/dummy/app/views/application/example.html.erb: -------------------------------------------------------------------------------- 1 | A very simple example of communication javascript <-> flash: 2 |
3 | <%= swf_tag("example", :width => 400, :height => 300, :mode => :dynamic, :id => "my_flash", :flashvars => {:message => 'Hello, World!'}, :parameters => {:allowScriptAccess => "always", :scale => "showall"}, :javascript_class => "ExampleClass") %> 4 |
5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /test/dummy/app/views/layouts/application.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Dummy 5 | <%= stylesheet_link_tag "application", :media => "all" %> 6 | <%= javascript_include_tag "application" %> 7 | <%= csrf_meta_tags %> 8 | 9 | 10 | 11 | <%= yield %> 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /test/dummy/config.ru: -------------------------------------------------------------------------------- 1 | # This file is used by Rack-based servers to start the application. 2 | 3 | require ::File.expand_path('../config/environment', __FILE__) 4 | run Dummy::Application 5 | -------------------------------------------------------------------------------- /test/dummy/config/application.rb: -------------------------------------------------------------------------------- 1 | require File.expand_path('../boot', __FILE__) 2 | 3 | # See http://stackoverflow.com/questions/3954307/rails-3-how-do-i-avoid-database-altogether 4 | require "action_controller/railtie" 5 | require "action_mailer/railtie" 6 | require "active_resource/railtie" 7 | require "rails/test_unit/railtie" 8 | require "sprockets/railtie" 9 | 10 | if defined?(Bundler) 11 | # If you precompile assets before deploying to production, use this line 12 | Bundler.require(*Rails.groups(:assets => %w(development test))) 13 | # If you want your assets lazily compiled in production, use this line 14 | # Bundler.require(:default, :assets, Rails.env) 15 | end 16 | 17 | module Dummy 18 | class Application < Rails::Application 19 | # Settings in config/environments/* take precedence over those specified here. 20 | # Application configuration should go into files in config/initializers 21 | # -- all .rb files in that directory are automatically loaded. 22 | 23 | # Custom directories with classes and modules you want to be autoloadable. 24 | # config.autoload_paths += %W(#{config.root}/extras) 25 | 26 | # Only load the plugins named here, in the order given (default is alphabetical). 27 | # :all can be used as a placeholder for all plugins not explicitly named. 28 | # config.plugins = [ :exception_notification, :ssl_requirement, :all ] 29 | 30 | # Activate observers that should always be running. 31 | # config.active_record.observers = :cacher, :garbage_collector, :forum_observer 32 | 33 | # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. 34 | # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. 35 | # config.time_zone = 'Central Time (US & Canada)' 36 | 37 | # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. 38 | # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] 39 | # config.i18n.default_locale = :de 40 | 41 | # Configure the default encoding used in templates for Ruby 1.9. 42 | config.encoding = "utf-8" 43 | 44 | # Configure sensitive parameters which will be filtered from the log file. 45 | config.filter_parameters += [:password] 46 | 47 | # Enable escaping HTML in JSON. 48 | config.active_support.escape_html_entities_in_json = true 49 | 50 | # Use SQL instead of Active Record's schema dumper when creating the database. 51 | # This is necessary if your schema can't be completely dumped by the schema dumper, 52 | # like if you have constraints or database-specific column types 53 | # config.active_record.schema_format = :sql 54 | 55 | # Enforce whitelist mode for mass assignment. 56 | # This will create an empty whitelist of attributes available for mass-assignment for all models 57 | # in your app. As such, your models will need to explicitly whitelist or blacklist accessible 58 | # parameters by using an attr_accessible or attr_protected declaration. 59 | #config.active_record.whitelist_attributes = true 60 | 61 | # Enable the asset pipeline 62 | config.assets.enabled = true 63 | 64 | # Version of your assets, change this if you want to expire all your assets 65 | config.assets.version = '1.0' 66 | end 67 | end 68 | -------------------------------------------------------------------------------- /test/dummy/config/boot.rb: -------------------------------------------------------------------------------- 1 | require 'rubygems' 2 | 3 | # Set up gems listed in the Gemfile. 4 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) 5 | 6 | require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE']) 7 | -------------------------------------------------------------------------------- /test/dummy/config/database.yml: -------------------------------------------------------------------------------- 1 | # SQLite version 3.x 2 | # gem install sqlite3 3 | # 4 | # Ensure the SQLite 3 gem is defined in your Gemfile 5 | # gem 'sqlite3' 6 | development: 7 | adapter: sqlite3 8 | database: db/development.sqlite3 9 | pool: 5 10 | timeout: 5000 11 | 12 | # Warning: The database defined as "test" will be erased and 13 | # re-generated from your development database when you run "rake". 14 | # Do not set this db to the same as development or production. 15 | test: 16 | adapter: sqlite3 17 | database: db/test.sqlite3 18 | pool: 5 19 | timeout: 5000 20 | 21 | production: 22 | adapter: sqlite3 23 | database: db/production.sqlite3 24 | pool: 5 25 | timeout: 5000 26 | -------------------------------------------------------------------------------- /test/dummy/config/environment.rb: -------------------------------------------------------------------------------- 1 | # Load the rails application 2 | require File.expand_path('../application', __FILE__) 3 | 4 | # Initialize the rails application 5 | Dummy::Application.initialize! 6 | -------------------------------------------------------------------------------- /test/dummy/config/environments/development.rb: -------------------------------------------------------------------------------- 1 | Dummy::Application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb 3 | 4 | # In the development environment your application's code is reloaded on 5 | # every request. This slows down response time but is perfect for development 6 | # since you don't have to restart the web server when you make code changes. 7 | config.cache_classes = false 8 | 9 | # Log error messages when you accidentally call methods on nil. 10 | config.whiny_nils = true 11 | 12 | # Show full error reports and disable caching 13 | config.consider_all_requests_local = true 14 | config.action_controller.perform_caching = false 15 | 16 | # Don't care if the mailer can't send 17 | config.action_mailer.raise_delivery_errors = false 18 | 19 | # Print deprecation notices to the Rails logger 20 | config.active_support.deprecation = :log 21 | 22 | # Only use best-standards-support built into browsers 23 | config.action_dispatch.best_standards_support = :builtin 24 | 25 | # Raise exception on mass assignment protection for Active Record models 26 | #config.active_record.mass_assignment_sanitizer = :strict 27 | 28 | # Log the query plan for queries taking more than this (works 29 | # with SQLite, MySQL, and PostgreSQL) 30 | #config.active_record.auto_explain_threshold_in_seconds = 0.5 31 | 32 | # Do not compress assets 33 | config.assets.compress = false 34 | 35 | # Expands the lines which load the assets 36 | config.assets.debug = true 37 | end 38 | -------------------------------------------------------------------------------- /test/dummy/config/environments/production.rb: -------------------------------------------------------------------------------- 1 | Dummy::Application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb 3 | 4 | # Code is not reloaded between requests 5 | config.cache_classes = true 6 | 7 | # Full error reports are disabled and caching is turned on 8 | config.consider_all_requests_local = false 9 | config.action_controller.perform_caching = true 10 | 11 | # Disable Rails's static asset server (Apache or nginx will already do this) 12 | config.serve_static_assets = true 13 | 14 | # Compress JavaScripts and CSS 15 | config.assets.compress = true 16 | 17 | # Don't fallback to assets pipeline if a precompiled asset is missed 18 | config.assets.compile = false 19 | 20 | # Generate digests for assets URLs 21 | config.assets.digest = true 22 | 23 | # Defaults to nil and saved in location specified by config.assets.prefix 24 | # config.assets.manifest = YOUR_PATH 25 | 26 | # Specifies the header that your server uses for sending files 27 | # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache 28 | # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx 29 | 30 | # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. 31 | # config.force_ssl = true 32 | 33 | # See everything in the log (default is :info) 34 | # config.log_level = :debug 35 | 36 | # Prepend all log lines with the following tags 37 | # config.log_tags = [ :subdomain, :uuid ] 38 | 39 | # Use a different logger for distributed setups 40 | # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) 41 | 42 | # Use a different cache store in production 43 | # config.cache_store = :mem_cache_store 44 | 45 | # Enable serving of images, stylesheets, and JavaScripts from an asset server 46 | # config.action_controller.asset_host = "http://assets.example.com" 47 | 48 | # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added) 49 | # config.assets.precompile += %w( search.js ) 50 | 51 | # Disable delivery errors, bad email addresses will be ignored 52 | # config.action_mailer.raise_delivery_errors = false 53 | 54 | # Enable threaded mode 55 | # config.threadsafe! 56 | 57 | # Enable locale fallbacks for I18n (makes lookups for any locale fall back to 58 | # the I18n.default_locale when a translation can not be found) 59 | config.i18n.fallbacks = true 60 | 61 | # Send deprecation notices to registered listeners 62 | config.active_support.deprecation = :notify 63 | 64 | # Log the query plan for queries taking more than this (works 65 | # with SQLite, MySQL, and PostgreSQL) 66 | # config.active_record.auto_explain_threshold_in_seconds = 0.5 67 | end 68 | -------------------------------------------------------------------------------- /test/dummy/config/environments/test.rb: -------------------------------------------------------------------------------- 1 | Dummy::Application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb 3 | 4 | # The test environment is used exclusively to run your application's 5 | # test suite. You never need to work with it otherwise. Remember that 6 | # your test database is "scratch space" for the test suite and is wiped 7 | # and recreated between test runs. Don't rely on the data there! 8 | config.cache_classes = true 9 | 10 | # Configure static asset server for tests with Cache-Control for performance 11 | config.serve_static_assets = true 12 | config.static_cache_control = "public, max-age=3600" 13 | 14 | # Log error messages when you accidentally call methods on nil 15 | config.whiny_nils = true 16 | 17 | # Show full error reports and disable caching 18 | config.consider_all_requests_local = true 19 | config.action_controller.perform_caching = false 20 | 21 | # Raise exceptions instead of rendering exception templates 22 | config.action_dispatch.show_exceptions = false 23 | 24 | # Disable request forgery protection in test environment 25 | config.action_controller.allow_forgery_protection = false 26 | 27 | # Tell Action Mailer not to deliver emails to the real world. 28 | # The :test delivery method accumulates sent emails in the 29 | # ActionMailer::Base.deliveries array. 30 | config.action_mailer.delivery_method = :test 31 | 32 | # Raise exception on mass assignment protection for Active Record models 33 | #config.active_record.mass_assignment_sanitizer = :strict 34 | 35 | # Print deprecation notices to the stderr 36 | config.active_support.deprecation = :stderr 37 | end 38 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/backtrace_silencers.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. 4 | # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } 5 | 6 | # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. 7 | # Rails.backtrace_cleaner.remove_silencers! 8 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/inflections.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new inflection rules using the following format 4 | # (all these examples are active by default): 5 | # ActiveSupport::Inflector.inflections do |inflect| 6 | # inflect.plural /^(ox)$/i, '\1en' 7 | # inflect.singular /^(ox)en/i, '\1' 8 | # inflect.irregular 'person', 'people' 9 | # inflect.uncountable %w( fish sheep ) 10 | # end 11 | # 12 | # These inflection rules are supported but not enabled by default: 13 | # ActiveSupport::Inflector.inflections do |inflect| 14 | # inflect.acronym 'RESTful' 15 | # end 16 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/mime_types.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new mime types for use in respond_to blocks: 4 | # Mime::Type.register "text/richtext", :rtf 5 | # Mime::Type.register_alias "text/html", :iphone 6 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/secret_token.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Your secret key for verifying the integrity of signed cookies. 4 | # If you change this key, all old signed cookies will become invalid! 5 | # Make sure the secret is at least 30 characters and all random, 6 | # no regular words or you'll be exposed to dictionary attacks. 7 | Dummy::Application.config.secret_token = 'e2fa07bf03885f6437ee9d3705a5e478db7448ee013ca8344cbe8c2279debb920ec022af3470ed1d7e4964af433bf3317428eaf8a91d4ab102e782d9cd78a47d' 8 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/session_store.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | Dummy::Application.config.session_store :cookie_store, :key => '_dummy_session' 4 | 5 | # Use the database for sessions instead of the cookie-based default, 6 | # which shouldn't be used to store highly confidential information 7 | # (create the session table with "rails generate session_migration") 8 | # Dummy::Application.config.session_store :active_record_store 9 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/wrap_parameters.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | # 3 | # This file contains settings for ActionController::ParamsWrapper which 4 | # is enabled by default. 5 | 6 | # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. 7 | ActiveSupport.on_load(:action_controller) do 8 | wrap_parameters :format => [:json] 9 | end 10 | 11 | # Disable root element in JSON by default. 12 | ActiveSupport.on_load(:active_record) do 13 | self.include_root_in_json = false 14 | end 15 | -------------------------------------------------------------------------------- /test/dummy/config/locales/en.yml: -------------------------------------------------------------------------------- 1 | # Sample localization file for English. Add more files in this directory for other locales. 2 | # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. 3 | 4 | en: 5 | hello: "Hello world" 6 | -------------------------------------------------------------------------------- /test/dummy/config/routes.rb: -------------------------------------------------------------------------------- 1 | Dummy::Application.routes.draw do 2 | # The priority is based upon order of creation: 3 | # first created -> highest priority. 4 | 5 | # Sample of regular route: 6 | # match 'products/:id' => 'catalog#view' 7 | # Keep in mind you can assign values other than :controller and :action 8 | 9 | # Sample of named route: 10 | # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase 11 | # This route can be invoked with purchase_url(:id => product.id) 12 | 13 | # Sample resource route (maps HTTP verbs to controller actions automatically): 14 | # resources :products 15 | 16 | # Sample resource route with options: 17 | # resources :products do 18 | # member do 19 | # get 'short' 20 | # post 'toggle' 21 | # end 22 | # 23 | # collection do 24 | # get 'sold' 25 | # end 26 | # end 27 | 28 | # Sample resource route with sub-resources: 29 | # resources :products do 30 | # resources :comments, :sales 31 | # resource :seller 32 | # end 33 | 34 | # Sample resource route with more complex sub-resources 35 | # resources :products do 36 | # resources :comments 37 | # resources :sales do 38 | # get 'recent', :on => :collection 39 | # end 40 | # end 41 | 42 | # Sample resource route within a namespace: 43 | # namespace :admin do 44 | # # Directs /admin/products/* to Admin::ProductsController 45 | # # (app/controllers/admin/products_controller.rb) 46 | # resources :products 47 | # end 48 | 49 | # You can have the root of your site routed with "root" 50 | # just remember to delete public/index.html. 51 | root :to => 'application#example' 52 | 53 | # See how all your routes lay out with "rake routes" 54 | 55 | # This is a legacy wild controller route that's not recommended for RESTful applications. 56 | # Note: This route will make all actions in every controller accessible via GET requests. 57 | # match ':controller(/:action(/:id))(.:format)' 58 | end 59 | -------------------------------------------------------------------------------- /test/dummy/db/seeds.rb: -------------------------------------------------------------------------------- 1 | # This file should contain all the record creation needed to seed the database with its default values. 2 | # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). 3 | # 4 | # Examples: 5 | # 6 | # cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }]) 7 | # Mayor.create(name: 'Emanuel', city: cities.first) 8 | -------------------------------------------------------------------------------- /test/dummy/doc/README_FOR_APP: -------------------------------------------------------------------------------- 1 | Use this README file to introduce your application and point to useful places in the API for learning more. 2 | Run "rake doc:app" to generate API documentation for your models, controllers, helpers, and libraries. 3 | -------------------------------------------------------------------------------- /test/dummy/lib/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcandre/swf_fu/64c61378e2935510969b473696660c8fe9023a76/test/dummy/lib/assets/.gitkeep -------------------------------------------------------------------------------- /test/dummy/lib/tasks/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcandre/swf_fu/64c61378e2935510969b473696660c8fe9023a76/test/dummy/lib/tasks/.gitkeep -------------------------------------------------------------------------------- /test/dummy/log/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcandre/swf_fu/64c61378e2935510969b473696660c8fe9023a76/test/dummy/log/.gitkeep -------------------------------------------------------------------------------- /test/dummy/public/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | The page you were looking for doesn't exist (404) 5 | 17 | 18 | 19 | 20 | 21 |
22 |

The page you were looking for doesn't exist.

23 |

You may have mistyped the address or the page may have moved.

24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /test/dummy/public/422.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | The change you wanted was rejected (422) 5 | 17 | 18 | 19 | 20 | 21 |
22 |

The change you wanted was rejected.

23 |

Maybe you tried to change something you didn't have access to.

24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /test/dummy/public/500.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | We're sorry, but something went wrong (500) 5 | 17 | 18 | 19 | 20 | 21 |
22 |

We're sorry, but something went wrong.

23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /test/dummy/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcandre/swf_fu/64c61378e2935510969b473696660c8fe9023a76/test/dummy/public/favicon.ico -------------------------------------------------------------------------------- /test/dummy/public/robots.txt: -------------------------------------------------------------------------------- 1 | # See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file 2 | # 3 | # To ban all spiders from the entire site uncomment the next two lines: 4 | # User-Agent: * 5 | # Disallow: / 6 | -------------------------------------------------------------------------------- /test/dummy/script/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application. 3 | 4 | APP_PATH = File.expand_path('../../config/application', __FILE__) 5 | require File.expand_path('../../config/boot', __FILE__) 6 | require 'rails/commands' 7 | -------------------------------------------------------------------------------- /test/dummy/test/fixtures/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcandre/swf_fu/64c61378e2935510969b473696660c8fe9023a76/test/dummy/test/fixtures/.gitkeep -------------------------------------------------------------------------------- /test/dummy/test/functional/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcandre/swf_fu/64c61378e2935510969b473696660c8fe9023a76/test/dummy/test/functional/.gitkeep -------------------------------------------------------------------------------- /test/dummy/test/integration/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcandre/swf_fu/64c61378e2935510969b473696660c8fe9023a76/test/dummy/test/integration/.gitkeep -------------------------------------------------------------------------------- /test/dummy/test/test_helper.rb: -------------------------------------------------------------------------------- 1 | ENV["RAILS_ENV"] = "test" 2 | require File.expand_path('../../config/environment', __FILE__) 3 | require 'rails/test_help' 4 | 5 | class ActiveSupport::TestCase 6 | # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order. 7 | # 8 | # Note: You'll currently still have to declare fixtures explicitly in integration tests 9 | # -- they do not yet inherit this setting 10 | fixtures :all 11 | 12 | # Add more helper methods to be used by all tests here... 13 | end 14 | -------------------------------------------------------------------------------- /test/dummy/test/unit/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcandre/swf_fu/64c61378e2935510969b473696660c8fe9023a76/test/dummy/test/unit/.gitkeep -------------------------------------------------------------------------------- /test/dummy/vendor/assets/javascripts/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcandre/swf_fu/64c61378e2935510969b473696660c8fe9023a76/test/dummy/vendor/assets/javascripts/.gitkeep -------------------------------------------------------------------------------- /test/dummy/vendor/assets/stylesheets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcandre/swf_fu/64c61378e2935510969b473696660c8fe9023a76/test/dummy/vendor/assets/stylesheets/.gitkeep -------------------------------------------------------------------------------- /test/dummy/vendor/plugins/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcandre/swf_fu/64c61378e2935510969b473696660c8fe9023a76/test/dummy/vendor/plugins/.gitkeep -------------------------------------------------------------------------------- /test/support/assert_same_striped.rb: -------------------------------------------------------------------------------- 1 | def assert_same_stripped(expect, test, *equivalencies) 2 | equivalencies.each{|look, ok| test.gsub! look, ok } 3 | expect, test = [expect, test].map{|s| s.split("\n").map(&:strip)} 4 | same = expect & test 5 | delta_expect, delta_test = [expect, test].map{|a| a-same} 6 | STDOUT << "\n\n---- Actual result: ----\n" << test.join("\n") << "\n---------\n" unless delta_expect == delta_test 7 | assert_equal delta_expect, delta_test 8 | end 9 | 10 | -------------------------------------------------------------------------------- /test/support/fixtures/results.rb: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | DYNAMIC_RESULT = <<'EOS' 3 | 14 | EOS 15 | 16 | STATIC_RESULT = <<'EOS' 17 |
22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | Get Adobe Flash player 32 | 33 | 34 | 35 | 36 |
41 | EOS 42 | -------------------------------------------------------------------------------- /test/swf_path_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class SwfPathTest < ActionView::TestCase 4 | context "with no special asset host" do 5 | should "deduce the extension" do 6 | assert_equal swf_path("example.swf"), swf_path("example") 7 | assert_match "/swfs/example.swf", swf_path("example.swf") 8 | end 9 | 10 | should "accept relative paths" do 11 | assert_equal "/swfs/whatever/example.swf", swf_path("whatever/example.swf") 12 | end 13 | 14 | should "leave full paths alone" do 15 | ["/full/path.swf", "http://www.example.com/whatever.swf"].each do |p| 16 | assert_equal p, swf_path(p) 17 | end 18 | end 19 | end 20 | 21 | context "with custom asset host" do 22 | HOST = "http://assets.example.com" 23 | setup do 24 | ActionController::Base.asset_host = HOST 25 | end 26 | 27 | teardown do 28 | ActionController::Base.asset_host = nil 29 | end 30 | 31 | should "take it into account" do 32 | assert_equal "#{HOST}/swfs/whatever.swf", swf_path("whatever") 33 | end 34 | end 35 | end -------------------------------------------------------------------------------- /test/swf_tag_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class SwfTagTest < ActionView::TestCase 4 | 5 | COMPLEX_OPTIONS = { :width => "456", :height => 123, 6 | :flashvars => {:myVar => "value 1 > 2"}.freeze, 7 | :javascript_class => "SomeClass", 8 | :initialize => {:be => "good"}.freeze, 9 | :parameters => {:play => true}.freeze 10 | }.freeze 11 | 12 | should "understand size" do 13 | assert_equal swf_tag("hello", :size => "123x456"), 14 | swf_tag("hello", :width => 123, :height => "456") 15 | end 16 | 17 | should "only accept valid modes" do 18 | assert_raise(ArgumentError) { swf_tag("xyz", :mode => :xyz) } 19 | end 20 | 21 | context "with custom defaults" do 22 | setup do 23 | test = {:flashvars=> {:xyz => "abc", :hello => "world"}.freeze, :mode => :static, :size => "400x300"}.freeze 24 | @expect = swf_tag("test", test) 25 | @expect_with_hello = swf_tag("test", :flashvars => {:xyz => "abc", :hello => "my friend"}, :mode => :static, :size => "400x300") 26 | ActionView::Base.swf_default_options = test 27 | end 28 | 29 | should "respect them" do 30 | assert_equal @expect, swf_tag("test") 31 | end 32 | 33 | should "merge suboptions" do 34 | assert_equal @expect_with_hello, swf_tag("test", :flashvars => {:hello => "my friend"}.freeze) 35 | end 36 | 37 | teardown { ActionView::Base.swf_default_options = {} } 38 | end 39 | 40 | context "with proc options" do 41 | should "call them" do 42 | expect = swf_tag("test", :id => "generated_id_for_test") 43 | assert_equal expect, swf_tag("test", :id => Proc.new{|arg| "generated_id_for_#{arg}"}) 44 | end 45 | 46 | should "call global default's everytime" do 47 | expect1 = swf_tag("test", :id => "call_number_1") 48 | expect2 = swf_tag("test", :id => "call_number_2") 49 | cnt = 0 50 | ActionView::Base.swf_default_options = { :id => Proc.new{ "call_number_#{cnt+=1}" }} 51 | assert_equal expect1, swf_tag("test") 52 | assert_equal expect2, swf_tag("test") 53 | end 54 | end 55 | 56 | context "with static mode" do 57 | setup { ActionView::Base.swf_default_options = {:mode => :static} } 58 | 59 | should "deal with string flashvars" do 60 | assert_equal swf_tag("hello", :flashvars => "xyz=abc", :mode => :static), 61 | swf_tag("hello", :flashvars => {:xyz => "abc"}, :mode => :static) 62 | end 63 | 64 | should "produce the expected code" do 65 | assert_same_stripped STATIC_RESULT, swf_tag("mySwf", COMPLEX_OPTIONS.merge(:html_options => {:class => "lots"}.freeze).freeze), 66 | [%q[value="id=mySwf&myVar=value+1+%3E+2"], %q[value="myVar=value+1+%3E+2&id=mySwf"]] 67 | end 68 | 69 | teardown { ActionView::Base.swf_default_options = {} } 70 | end 71 | 72 | context "with dynamic mode" do 73 | should "produce the expected code" do 74 | assert_same_stripped DYNAMIC_RESULT, swf_tag("mySwf", COMPLEX_OPTIONS), 75 | [%q[{"id":"mySwf","myVar":"value 1 \u003E 2"}], %q[{"myVar":"value 1 \u003E 2","id":"mySwf"}]] 76 | end 77 | 78 | end 79 | 80 | should "enforce HTML id validity" do 81 | div_result = '
' 82 | assert_match /#{div_result}/, swf_tag("123-456_ok$!+X") 83 | obj_result = '"id":"swf_123-456_ok___X"' 84 | assert_match /#{obj_result}/, swf_tag("123-456_ok$!+X") 85 | end 86 | 87 | should "treat initialize arrays as list of parameters" do 88 | assert_match '"hello","world"])', swf_tag("mySwf", :initialize => ["hello", "world"], :javascript_class => "SomeClass") 89 | end 90 | 91 | should "be html safe" do 92 | assert swf_tag("test").html_safe? 93 | end 94 | end 95 | 96 | -------------------------------------------------------------------------------- /test/test_helper.rb: -------------------------------------------------------------------------------- 1 | # Configure Rails Environment 2 | ENV["RAILS_ENV"] = "test" 3 | 4 | require File.expand_path("../dummy/config/environment.rb", __FILE__) 5 | require "rails/test_help" 6 | require "shoulda-context" 7 | 8 | Rails.backtrace_cleaner.remove_silencers! 9 | 10 | # Load support files 11 | Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f } 12 | 13 | --------------------------------------------------------------------------------