jeremyboles-smart-asset-helper 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.rdoc ADDED
@@ -0,0 +1,3 @@
1
+ == 0.1.0, released 2009-04-16
2
+
3
+ * Initial release
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Jeremy Boles
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,31 @@
1
+ = SmartAssetHelper
2
+
3
+ SmartAssetHelper is a utility that add a number of conveniences for dealing with CSS and Javascript files. The library sprung out of a distain for how "dirty" my CSS and Javascript organization would get over time. SmartAssetHelper introduces an opinionated way to organize CSS and Javascript files and also contains a number of convenient helper methods to make your life easier.
4
+
5
+
6
+ == Example
7
+
8
+ SmartAssetHelper introduces two new methods for including CSS and Javascript within your <head> tag:
9
+
10
+ # app/views/layouts/application.html.erb
11
+ <html>
12
+ <head>
13
+ <%= include_stylesheets 'global' %>
14
+ <%= include_javascript :default %>
15
+ </head>
16
+ <body>
17
+ <%= yield %>
18
+ </body>
19
+ </html>
20
+
21
+ The <code>include_stylesheets</code> and <code>include_javascript</code> helper methods will include asset files that have been 'required' by helper methods:
22
+
23
+ # app/views/users/new.html.erb
24
+ <% require_stylesheet 'form %>
25
+ <% require_javascript 'validations' %>
26
+ ...
27
+
28
+ When the <code>include_stylesheets</code> and <code>include_javascript</code> methods are passed the <code>:auto => true</code> parameter, they will automatically include assets based on the request parameters (if the files exists). For example, a request to <code>UsersController#index</code> will automatically include stylesheets at <code>/stylesheets/users.css</code> and <code>/stylesheets/users/index.css</code>, if they exsist.
29
+
30
+
31
+ Copyright (c) 2009 (Jeremy Boles)[http://jeremyboles.com/], released under the MIT license
data/Rakefile ADDED
@@ -0,0 +1,40 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ desc 'Default: run unit tests.'
6
+ task :default => :test
7
+
8
+ desc 'Test the small_asset_helper plugin.'
9
+ Rake::TestTask.new(:test) do |t|
10
+ t.libs << 'lib'
11
+ t.libs << 'test'
12
+ t.pattern = 'test/**/*_test.rb'
13
+ t.verbose = true
14
+ end
15
+
16
+ desc 'Generate documentation for the small_asset_helper plugin.'
17
+ Rake::RDocTask.new(:rdoc) do |rdoc|
18
+ rdoc.rdoc_dir = 'rdoc'
19
+ rdoc.title = 'SmallAssetHelper'
20
+ rdoc.options << '--line-numbers' << '--inline-source'
21
+ rdoc.rdoc_files.include('README')
22
+ rdoc.rdoc_files.include('lib/**/*.rb')
23
+ end
24
+
25
+ desc %{Update ".manifest" with the latest list of project filenames.}
26
+ task :manifest do
27
+ list = `git ls-files --full-name --exclude=*.gemspec --exclude=.*`.chomp.split("\n")
28
+
29
+ if spec_file = Dir['*.gemspec'].first
30
+ spec = File.read spec_file
31
+ spec.gsub! /^(\s* s.(test_)?files \s* = \s* )( \[ [^\]]* \] | %w\( [^)]* \) )/mx do
32
+ assignment = $1
33
+ bunch = $2 ? list.grep(/^test\//) : list
34
+ '%s%%w(%s)' % [assignment, bunch.join(' ')]
35
+ end
36
+
37
+ File.open(spec_file, 'w') { |f| f << spec }
38
+ end
39
+ File.open('.manifest', 'w') { |f| f << list.join("\n") }
40
+ end
data/init.rb ADDED
@@ -0,0 +1,14 @@
1
+ require 'action_view/helpers/smart_asset_helper'
2
+ require 'action_view/helpers/smarter_asset_tag_helper'
3
+
4
+ ActionView::Base.class_eval do
5
+ include ActionView::Helpers::SmartAssetHelper
6
+ include ActionView::Helpers::SmarterAssetTagHelper
7
+ end
8
+
9
+ ActionController::Base.class_eval do
10
+ before_filter :create_asset_manager_instance
11
+ def create_asset_manager_instance
12
+ @_asset_manager = AssetManager.new
13
+ end
14
+ end
@@ -0,0 +1,85 @@
1
+ require 'asset_manager'
2
+
3
+ module ActionView
4
+ module Helpers
5
+ module SmartAssetHelper
6
+
7
+ # Prevent a javscript file from being required
8
+ def deny_javascript(*javascripts)
9
+ @_asset_manager.deny(:js, javascripts)
10
+ end
11
+
12
+ # Prevent a stylesheet file from being required
13
+ def deny_stylesheet(*stylesheets)
14
+ @_asset_manager.deny(:css, stylesheets)
15
+ end
16
+
17
+ # Print required javascript
18
+ def include_javascript(*args)
19
+ options = extract_options(args)
20
+ javascript = javascript_include_tag(*include_assets(:js, args, options))
21
+ javascript += ie_assets(:js, args) if options[:ie]
22
+ javascript.gsub("\n", '')
23
+ end
24
+
25
+ # Print required stylesheets
26
+ def include_stylesheets(*args)
27
+ options = extract_options(args)
28
+ stylesheets = stylesheet_link_tag(*include_assets(:css, args, options))
29
+ stylesheets += ie_assets(:css, args) if options[:ie]
30
+ stylesheets.gsub("\n", '')
31
+ end
32
+
33
+ # Require bot Javscript and CSS
34
+ def require_assets(*assets)
35
+ require_stylesheet(*assets)
36
+ require_javascript(*assets)
37
+ end
38
+
39
+ # Request a javascript to be outputed by include_javascript
40
+ def require_javascript(*javascripts)
41
+ @_asset_manager.add(:js, javascripts)
42
+ end
43
+
44
+ # Request a stylesheet to be outputed by include_stylesheets
45
+ def require_stylesheet(*stylesheets)
46
+ @_asset_manager.add(:css, stylesheets)
47
+ end
48
+
49
+ private
50
+
51
+ def conditional_comment(text, version)
52
+ "<!--[if IE #{version}]>#{text}<![endif]-->"
53
+ end
54
+
55
+ def extract_options(args)
56
+ options = args.delete(args.last) if args.last.is_a?(Hash)
57
+ options || {}
58
+ end
59
+
60
+ def ie_assets(asset_type, args)
61
+ ie_assets = ''
62
+ %w{ 6 7 8 }.each do |v|
63
+ assets = @_asset_manager.required_with_extra(asset_type, "ie#{v}")
64
+
65
+ unless assets.blank?
66
+ assets = case asset_type
67
+ when :css : stylesheet_link_tag(assets)
68
+ when :js : javascript_include_tag(assets)
69
+ end
70
+
71
+ ie_assets += conditional_comment(assets.to_s, v)
72
+ end
73
+ end
74
+ ie_assets
75
+ end
76
+
77
+ def include_assets(asset_type, args, options)
78
+ @_asset_manager.append(asset_type, args) unless args.empty?
79
+ @_asset_manager.auto_add(asset_type, params) if options[:auto]
80
+ @_asset_manager.required(asset_type)
81
+ end
82
+
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,30 @@
1
+ module ActionView
2
+ module Helpers
3
+ module SmarterAssetTagHelper
4
+
5
+ def self.included(base)
6
+ base.send :include, InstanceMethods
7
+ base.send :alias_method_chain, :javascript_include_tag, :query_strings
8
+ end
9
+
10
+ module InstanceMethods
11
+
12
+ # This is to cope with Rails appending '.js' to things like Google maps API and other things
13
+ # that have query strings
14
+ def javascript_include_tag_with_query_strings(*sources)
15
+ query_strings_sources = sources.flatten.select { |s| s =~ /[\?]/ }
16
+ sources = sources.flatten - query_strings_sources
17
+
18
+ script_tag(query_strings_sources) + javascript_include_tag_without_query_strings(*sources)
19
+ end
20
+
21
+ def script_tag(*sources)
22
+ sources.map do |s|
23
+ content_tag(:script, '', :src => s, :type => 'text/javascript')
24
+ end.join
25
+ end
26
+
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,87 @@
1
+ class AssetManager
2
+
3
+ ASSET_DIR = {
4
+ :js => ActionView::Helpers::AssetTagHelper::JAVASCRIPTS_DIR,
5
+ :css => ActionView::Helpers::AssetTagHelper::STYLESHEETS_DIR
6
+ }
7
+
8
+ SHORTCUTS = {
9
+ :css => {},
10
+ :js => { :defaults => ActionView::Helpers::AssetTagHelper::JAVASCRIPT_DEFAULT_SOURCES }
11
+ }
12
+
13
+ def initialize
14
+ @denied = { :css => [], :js => [] }
15
+ @required = { :css => [], :js => [] }
16
+ end
17
+
18
+ # Add assets to the list of required assets
19
+ def add(asset_type, *assets)
20
+ @required[asset_type] << assets
21
+ end
22
+
23
+ # Append assets to the front of the list of assets
24
+ def append(asset_type, *assets)
25
+ @required[asset_type] = assets + @required[asset_type]
26
+ end
27
+
28
+ # Automaticly add assets based the controller/action params, if they exsist
29
+ def auto_add(asset_type, request_params)
30
+ files, prefix = [], ''
31
+ (request_params[:controller] + '/' + request_params[:action]).split('/').each do |path|
32
+ path = prefix + path
33
+ asset_path = "#{path}.#{asset_type}"
34
+ file_path = "#{ASSET_DIR[asset_type]}/#{asset_path}"
35
+
36
+ files << path if File.exists?(file_path)
37
+ prefix = path + '/'
38
+ end
39
+ self.add(asset_type, files)
40
+ end
41
+
42
+ # Prevent an asset from being required
43
+ def deny(asset_type, *assets)
44
+ @denied[asset_type] << assets
45
+ end
46
+
47
+ # Returns a list of assets that have been required
48
+ def required(asset_type)
49
+ files = extract(asset_type)
50
+ files = process_shortcuts(asset_type, files)
51
+ files
52
+ end
53
+
54
+ def required_with_extra(asset_type, extra)
55
+ files = []
56
+ self.required(asset_type).each do |file|
57
+ path = "#{file}-#{extra}"
58
+ asset_path = "#{path}.#{asset_type}"
59
+ file_path = "#{ASSET_DIR[asset_type]}/#{asset_path}"
60
+ files << path if File.exists?(file_path)
61
+ end
62
+ files
63
+ end
64
+
65
+ private
66
+
67
+ # Extracts the required files, unique and honoring denied assets
68
+ def extract(asset_type)
69
+ seen_files = @denied[asset_type].flatten
70
+
71
+ required_files = @required[asset_type].flatten.inject([]) do |required, files|
72
+ files_to_include = files.to_a - seen_files
73
+ seen_files += files_to_include
74
+ required << files_to_include unless files_to_include.empty?
75
+ required
76
+ end.flatten
77
+ end
78
+
79
+ # Processes the shortcuts
80
+ def process_shortcuts(asset_type, files)
81
+ files.flatten.map do |file|
82
+ file = SHORTCUTS[asset_type][file] if SHORTCUTS[asset_type].has_key?(file)
83
+ file
84
+ end.flatten
85
+ end
86
+
87
+ end
@@ -0,0 +1,5 @@
1
+ require 'test_helper'
2
+
3
+ class SmallAssetHelperTest < ActiveSupport::TestCase
4
+
5
+ end
@@ -0,0 +1,3 @@
1
+ require 'rubygems'
2
+ require 'active_support'
3
+ require 'active_support/test_case'
data/uninstall.rb ADDED
@@ -0,0 +1 @@
1
+ # Uninstall hook code here
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jeremyboles-smart-asset-helper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jeremy Boles
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-04-19 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rails
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - "="
22
+ - !ruby/object:Gem::Version
23
+ version: 2.3.2
24
+ version:
25
+ description: SmartAssetHelper helps ease some of the pain with dealing and organizing stylesheet and javascript files.
26
+ email: jeremy@jeremyboles.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - README.rdoc
33
+ - MIT-LICENSE
34
+ - CHANGELOG.rdoc
35
+ files:
36
+ - CHANGELOG.rdoc
37
+ - MIT-LICENSE
38
+ - README.rdoc
39
+ - Rakefile
40
+ - init.rb
41
+ - lib/action_view/helpers/smart_asset_helper.rb
42
+ - lib/action_view/helpers/smarter_asset_tag_helper.rb
43
+ - lib/asset_manager.rb
44
+ - test/small_asset_helper_test.rb
45
+ - test/test_helper.rb
46
+ - uninstall.rb
47
+ has_rdoc: true
48
+ homepage: http://github.com/jeremyboles/smart-asset-helper/wikis
49
+ post_install_message:
50
+ rdoc_options:
51
+ - --main
52
+ - README.rdoc
53
+ - --inline-source
54
+ - --charset=UTF-8
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: "0"
62
+ version:
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ version:
69
+ requirements: []
70
+
71
+ rubyforge_project:
72
+ rubygems_version: 1.2.0
73
+ signing_key:
74
+ specification_version: 2
75
+ summary: A simple Rails plugin for dealing with stylesheet and javascript management and organization.
76
+ test_files:
77
+ - test/small_asset_helper_test.rb
78
+ - test/test_helper.rb