merb-assets 1.0.15 → 1.1.0.pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Rakefile CHANGED
@@ -1,73 +1,64 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "..", "rake_helpers"))
2
-
3
- ##############################################################################
4
- # Package && release
5
- ##############################################################################
6
- RUBY_FORGE_PROJECT = "merb"
7
- PROJECT_URL = "http://merbivore.com"
8
- PROJECT_SUMMARY = "Merb plugin that provides the helpers for assets and asset bundling"
9
- PROJECT_DESCRIPTION = PROJECT_SUMMARY
10
-
11
- GEM_AUTHOR = "Ezra Zygmuntowicz"
12
- GEM_EMAIL = "ez@engineyard.com"
13
-
14
- GEM_NAME = "merb-assets"
15
- PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
16
- GEM_VERSION = Merb::VERSION + PKG_BUILD
17
-
18
- RELEASE_NAME = "REL #{GEM_VERSION}"
19
-
20
- require "extlib/tasks/release"
21
-
22
- spec = Gem::Specification.new do |s|
23
- s.rubyforge_project = RUBY_FORGE_PROJECT
24
- s.name = GEM_NAME
25
- s.version = GEM_VERSION
26
- s.platform = Gem::Platform::RUBY
27
- s.has_rdoc = true
28
- s.extra_rdoc_files = ["README", "LICENSE", 'TODO']
29
- s.summary = PROJECT_SUMMARY
30
- s.description = PROJECT_DESCRIPTION
31
- s.author = GEM_AUTHOR
32
- s.email = GEM_EMAIL
33
- s.homepage = PROJECT_URL
34
- s.add_dependency('merb-core', "~> #{Merb::VERSION}")
35
- s.require_path = 'lib'
36
- s.files = %w(LICENSE README Rakefile TODO) + Dir.glob("{lib,spec}/**/*")
37
- end
1
+ require 'rubygems'
2
+ require 'rake'
38
3
 
39
- Rake::GemPackageTask.new(spec) do |pkg|
40
- pkg.gem_spec = spec
41
- end
4
+ # Assume a typical dev checkout to fetch the current merb-core version
5
+ require File.expand_path('../../merb-core/lib/merb-core/version', __FILE__)
42
6
 
43
- desc "Install the gem"
44
- task :install do
45
- Merb::RakeHelper.install(GEM_NAME, :version => GEM_VERSION)
46
- end
7
+ # Load this library's version information
8
+ require File.expand_path('../lib/merb-assets/version', __FILE__)
47
9
 
48
- desc "Uninstall the gem"
49
- task :uninstall do
50
- Merb::RakeHelper.uninstall(GEM_NAME, :version => GEM_VERSION)
51
- end
10
+ begin
11
+
12
+ gem 'jeweler', '~> 1.4'
13
+ require 'jeweler'
14
+
15
+ Jeweler::Tasks.new do |gemspec|
16
+
17
+ gemspec.version = Merb::Assets::VERSION
18
+
19
+ gemspec.name = "merb-assets"
20
+ gemspec.description = "Merb plugin for supporting assets"
21
+ gemspec.summary = "Merb plugin that provides helpers for assets and asset bundling"
22
+
23
+ gemspec.authors = [ "Ezra Zygmuntowicz" ]
24
+ gemspec.email = "ez@engineyard.com"
25
+ gemspec.homepage = "http://merbivore.com/"
26
+
27
+ gemspec.files = %w(LICENSE Rakefile README TODO) + Dir['{lib,spec}/**/*']
28
+
29
+ # Runtime dependencies
30
+ gemspec.add_dependency 'merb-core', "~> #{Merb::VERSION}"
31
+
32
+ # Development dependencies
33
+ gemspec.add_development_dependency 'rspec', '>= 1.2.9'
52
34
 
53
- desc "Create a gemspec file"
54
- task :gemspec do
55
- File.open("#{GEM_NAME}.gemspec", "w") do |file|
56
- file.puts spec.to_ruby
57
35
  end
36
+
37
+ Jeweler::GemcutterTasks.new
38
+
39
+ rescue LoadError
40
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
58
41
  end
59
42
 
60
- desc "Run all examples (or a specific spec with TASK=xxxx)"
61
- Spec::Rake::SpecTask.new('spec') do |t|
62
- t.spec_opts = ["-cfs"]
63
- t.spec_files = begin
64
- if ENV["TASK"]
65
- ENV["TASK"].split(',').map { |task| "spec/**/#{task}_spec.rb" }
66
- else
67
- FileList['spec/**/*_spec.rb']
68
- end
69
- end
43
+ require 'spec/rake/spectask'
44
+ Spec::Rake::SpecTask.new(:spec) do |spec|
45
+ spec.spec_opts << '--options' << 'spec/spec.opts' if File.exists?('spec/spec.opts')
46
+ spec.libs << 'lib' << 'spec'
47
+ spec.spec_files = FileList['spec/**/*_spec.rb']
70
48
  end
71
49
 
72
- desc 'Default: run spec examples'
73
- task :default => 'spec'
50
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
51
+ spec.libs << 'lib' << 'spec'
52
+ spec.pattern = 'spec/**/*_spec.rb'
53
+ spec.rcov = true
54
+ end
55
+
56
+ task :default => :spec
57
+
58
+ require 'rake/rdoctask'
59
+ Rake::RDocTask.new do |rdoc|
60
+ rdoc.rdoc_dir = 'rdoc'
61
+ rdoc.title = "test_gem #{Merb::Assets::VERSION}"
62
+ rdoc.rdoc_files.include('README*')
63
+ rdoc.rdoc_files.include('lib/**/*.rb')
64
+ end
@@ -41,12 +41,16 @@ module Merb
41
41
  # # => "public/javascripts/dingo.js"
42
42
  def asset_path(asset_type, filename, local_path = false)
43
43
  filename = filename.to_s
44
+ return filename if filename =~ %r{^https?://} #leave absolte paths alone
45
+
46
+ # add extension if none given
44
47
  if filename !~ /#{'\\' + ASSET_FILE_EXTENSIONS[asset_type]}\Z/ && filename.index('?').nil?
45
48
  filename = "#{filename}#{ASSET_FILE_EXTENSIONS[asset_type]}" # don't modify receiver
46
49
  end
47
- if filename !~ %r{^(/|https?://)}
48
- filename = "/#{asset_type}s/#{filename}"
49
- end
50
+
51
+ # prepend asset type's folder path
52
+ filename = "/#{asset_type}s/#{filename}" unless filename.index("/") == 0
53
+
50
54
  if local_path
51
55
  return "public#{filename}"
52
56
  else
@@ -56,7 +60,7 @@ module Merb
56
60
  end
57
61
 
58
62
  # Helper for creating unique paths to a file name
59
- # Can increase speend for browsers that are limited to a certain number of connections per host
63
+ # Can increase speed for browsers that are limited to a certain number of connections per host
60
64
  # for downloading static files (css, js, images...)
61
65
  class UniqueAssetPath
62
66
  class << self
@@ -76,7 +80,8 @@ module Merb
76
80
  config = Merb::Plugins.config[:asset_helpers]
77
81
  #%{#{(USE_SSL ? 'https' : 'http')}://#{sprintf(config[:asset_domain],self.calculate_host_id(file))}.#{config[:domain]}/#{filename}}
78
82
  path = config[:use_ssl] ? 'https://' : 'http://'
79
- path << sprintf(config[:asset_domain],self.calculate_host_id(filename)) << ".#{config[:domain]}"
83
+ path << sprintf(config[:asset_domain],self.calculate_host_id(filename)) << "." if config[:asset_domain]
84
+ path << config[:domain]
80
85
  path << "/" if filename.index('/') != 0
81
86
  path << filename
82
87
  end
@@ -239,4 +244,4 @@ module Merb
239
244
  end
240
245
 
241
246
  end
242
- end
247
+ end
@@ -8,6 +8,25 @@ module Merb
8
8
  # assets.
9
9
 
10
10
 
11
+ # This tests whether a random query string shall be appended to a url.
12
+ # Basically, you tell it your intention and if it's ok to use default
13
+ # config values, and it will either use your intention or the value
14
+ # set in Merb::Config[:reload_templates]
15
+ #
16
+ # ==== Parameters
17
+ # intention<Boolean>: true if a random string shall be appended
18
+ # allow_default<Boolean>: true if it's ok to use Merb::Config[:reload_templates]
19
+ #
20
+ # ==== Returns
21
+ # <Boolean> true if a random query string shall be appended
22
+ #
23
+ # ==== Examples
24
+ # Merb::AssetsMixin.append_random_query_string?(options[:reload])
25
+ # Merb::AssetsMixin.append_random_query_string?(options[:reload], !absolute)
26
+ def self.append_random_query_string?(intention, allow_default = true)
27
+ intention.nil? && allow_default ? Merb::Config[:reload_templates] : intention
28
+ end
29
+
11
30
  # ==== Parameters
12
31
  # none
13
32
  #
@@ -24,29 +43,72 @@ module Merb
24
43
  # namespace/controller/action.(css|js)
25
44
  #
26
45
  def auto_link
27
- html = ""
28
- prefix = ""
29
- (controller_name / action_name).split("/").each do |path|
30
- path = prefix + path
31
-
32
- css_path = path + ".css"
33
- if File.exists? Merb.root / "public" / "stylesheets" / css_path
34
- html << %{<link rel="stylesheet" type="text/css" href="/stylesheets/#{css_path}" /> }
35
- end
46
+ [auto_link_css, auto_link_js].join("\n")
47
+ end
36
48
 
37
- js_path = path + ".js"
38
- if File.exists? Merb.root / "public" / "javascripts" / js_path
39
- html << %{<script type="text/javascript" language="javascript" src="/javascripts/#{js_path}"></script>}
40
- end
49
+ # ==== Parameters
50
+ # none
51
+ #
52
+ # ==== Returns
53
+ # html<String>
54
+ #
55
+ # ==== Examples
56
+ # We want all possible matches in the file system upto the action name
57
+ # for CSS. The reason for separating auto_link for CSS and JS is
58
+ # performance concerns with page loading. See Yahoo performance rules
59
+ # (http://developer.yahoo.com/performance/rules.html)
60
+ def auto_link_css
61
+ auto_link_paths.map do |path|
62
+ asset_exists?(:stylesheet, path) ? css_include_tag(path) : nil
63
+ end.compact.join("\n")
64
+ end
41
65
 
42
- #Update the prefix for the next iteration
43
- prefix += path / ""
44
- end
66
+ # ==== Parameters
67
+ # none
68
+ #
69
+ # ==== Returns
70
+ # html<String>
71
+ #
72
+ # ==== Examples
73
+ # We want all possible matches in the file system upto the action name
74
+ # for JS. The reason for separating auto_link for CSS and JS is
75
+ # performance concerns with page loading. See Yahoo performance rules
76
+ # (http://developer.yahoo.com/performance/rules.html)
77
+ def auto_link_js
78
+ auto_link_paths.map do |path|
79
+ asset_exists?(:javascript, path) ? js_include_tag(path) : nil
80
+ end.compact.join("\n")
81
+ end
45
82
 
46
- #Return the generated HTML
47
- html
83
+ # ==== Parameters
84
+ # asset_type<Symbol>: A symbol representing the type of the asset.
85
+ # asset_path<String>: The path to the asset
86
+ #
87
+ # ==== Returns
88
+ # exists?<Boolean>
89
+ #
90
+ # ==== Examples
91
+ # This tests whether a give asset exists in the file system.
92
+ def asset_exists?(asset_type, asset_path)
93
+ File.exists?(Merb.root / asset_path(asset_type, asset_path, true))
48
94
  end
49
95
 
96
+ # ==== Parameters
97
+ # none
98
+ #
99
+ # ==== Returns
100
+ # paths<Array>
101
+ #
102
+ # ==== Examples
103
+ # This is an auxiliary method which returns an array of all possible asset
104
+ # paths for the current controller/action.
105
+ def auto_link_paths
106
+ paths = (controller_name / action_name).split('/')
107
+ first = paths.shift
108
+ paths.inject( [first] ) do |memo, val|
109
+ memo.push [memo.last, val].join('/')
110
+ end
111
+ end
50
112
 
51
113
  # ==== Parameters
52
114
  # name<~to_s>:: The text of the link.
@@ -77,6 +139,9 @@ module Merb
77
139
  # Sets the path prefix for the image. Defaults to "/images/" or whatever
78
140
  # is specified in Merb::Config. This is ignored if img is an absolute
79
141
  # path or full URL.
142
+ # :reload<Boolean>::
143
+ # Override the Merb::Config[:reload_templates] value. If true, a random query param will be appended
144
+ # to the image url
80
145
  #
81
146
  # All other options set HTML attributes on the tag.
82
147
  #
@@ -98,23 +163,24 @@ module Merb
98
163
  # image_tag('/dynamic/charts')
99
164
  # # => <img src="/dynamic/charts">
100
165
  def image_tag(img, opts={})
166
+ return "" if img.blank?
101
167
  if img[0].chr == '/'
102
- opts[:src] = img
168
+ opts[:src] = "#{Merb::Config[:path_prefix]}#{img}"
103
169
  else
104
170
  opts[:path] ||=
105
171
  if img =~ %r{^https?://}
172
+ absolute = true
106
173
  ''
107
174
  else
108
- if Merb::Config[:path_prefix]
109
- Merb::Config[:path_prefix] + '/images/'
110
- else
111
- '/images/'
112
- end
175
+ "#{Merb::Config[:path_prefix]}/images/"
113
176
  end
114
177
  opts[:src] ||= opts.delete(:path) + img
115
178
  end
116
- random = opts.delete(:reload) || Merb::Config[:reload_templates]
117
- opts[:src] += opts[:src].include?('?') ? "&#{random_query_string}" : "?#{random_query_string}" if random
179
+
180
+ if AssetsMixin.append_random_query_string?(opts.delete(:reload), !absolute)
181
+ opts[:src] += opts[:src].include?('?') ? "&#{random_query_string}" : "?#{random_query_string}"
182
+ end
183
+
118
184
  %{<img #{ opts.to_xml_attributes } />}
119
185
  end
120
186
 
@@ -405,33 +471,53 @@ module Merb
405
471
  # will be added to them.
406
472
  #
407
473
  # ==== Options
474
+ # :charset<~to_s>::
475
+ # Charset which will be used as value for charset attribute
408
476
  # :bundle<~to_s>::
409
477
  # The name of the bundle the scripts should be combined into.
478
+ # :prefix<~to_s>::
479
+ # prefix to add to include tag, overrides any set in Merb::Plugins.config[:asset_helpers][:js_prefix]
480
+ # :suffix<~to_s>::
481
+ # suffix to add to include tag, overrides any set in Merb::Plugins.config[:asset_helpers][:js_suffix]
482
+ # :reload<Boolean>::
483
+ # Override the Merb::Config[:reload_templates] value. If true, a random query param will be appended
484
+ # to the js url
410
485
  #
411
486
  # ==== Returns
412
487
  # String:: The JavaScript include tag(s).
413
488
  #
414
489
  # ==== Examples
415
490
  # js_include_tag 'jquery'
416
- # # => <script src="/javascripts/jquery.js" type="text/javascript"></script>
491
+ # # => <script src="/javascripts/jquery.js" type="text/javascript" charset="utf-8"></script>
492
+ #
493
+ # js_include_tag 'jquery', :charset => 'iso-8859-1'
494
+ # # => <script src="/javascripts/jquery.js" type="text/javascript" charset="iso-8859-1"></script>
417
495
  #
418
496
  # js_include_tag 'moofx.js', 'upload'
419
- # # => <script src="/javascripts/moofx.js" type="text/javascript"></script>
420
- # # <script src="/javascripts/upload.js" type="text/javascript"></script>
497
+ # # => <script src="/javascripts/moofx.js" type="text/javascript" charset="utf-8"></script>
498
+ # # <script src="/javascripts/upload.js" type="text/javascript" charset="utf-8"></script>
421
499
  #
422
500
  # js_include_tag :effects
423
- # # => <script src="/javascripts/effects.js" type="text/javascript"></script>
501
+ # # => <script src="/javascripts/effects.js" type="text/javascript" charset="utf-8"></script>
424
502
  #
425
503
  # js_include_tag :jquery, :validation
426
- # # => <script src="/javascripts/jquery.js" type="text/javascript"></script>
427
- # # <script src="/javascripts/validation.js" type="text/javascript"></script>
504
+ # # => <script src="/javascripts/jquery.js" type="text/javascript" charset="utf-8"></script>
505
+ # # <script src="/javascripts/validation.js" type="text/javascript" charset="utf-8"></script>
428
506
  #
507
+ # js_include_tag :application, :validation, :prefix => "http://cdn.example.com"
508
+ # # => <script src="http://cdn.example.com/javascripts/application.js" type="text/javascript" charset="utf-8"></script>
509
+ # # <script src="http://cdn.example.com/javascripts/validation.js" type="text/javascript" charset="utf-8"></script>
510
+ #
511
+ # js_include_tag :application, :validation, :suffix => ".#{MyApp.version}"
512
+ # # => <script src="/javascripts/application.1.0.3.js" type="text/javascript" charset="utf-8"></script>
513
+ # # <script src="/javascripts/validation.1.0.3.js" type="text/javascript" charset="utf-8"></script>
429
514
  def js_include_tag(*scripts)
430
515
  options = scripts.last.is_a?(Hash) ? scripts.pop : {}
431
516
  return nil if scripts.empty?
432
-
433
- reload = options[:reload] || Merb::Config[:reload_templates]
434
517
 
518
+ js_prefix = options[:prefix] || Merb::Plugins.config[:asset_helpers][:js_prefix]
519
+ js_suffix = options[:suffix] || Merb::Plugins.config[:asset_helpers][:js_suffix]
520
+
435
521
  if (bundle_name = options[:bundle]) && Merb::Assets.bundle? && scripts.size > 1
436
522
  bundler = Merb::Assets::JavascriptAssetBundler.new(bundle_name, *scripts)
437
523
  bundled_asset = bundler.bundle!
@@ -441,11 +527,21 @@ module Merb
441
527
  tags = ""
442
528
 
443
529
  for script in scripts
444
- src = asset_path(:javascript, script)
445
- src += src.include?('?') ? "&#{random_query_string}" : "?#{random_query_string}" if reload
530
+ src = js_prefix.to_s + asset_path(:javascript, script)
531
+
532
+ if js_suffix
533
+ ext_length = ASSET_FILE_EXTENSIONS[:javascript].length + 1
534
+ src.insert(-ext_length,js_suffix)
535
+ end
536
+
537
+ if AssetsMixin.append_random_query_string?(options[:reload])
538
+ src += src.include?('?') ? "&#{random_query_string}" : "?#{random_query_string}"
539
+ end
540
+
446
541
  attrs = {
447
542
  :src => src,
448
- :type => "text/javascript"
543
+ :type => "text/javascript",
544
+ :charset => options[:charset] || "utf-8"
449
545
  }
450
546
  tags << %Q{<script #{attrs.to_xml_attributes}></script>}
451
547
  end
@@ -460,10 +556,19 @@ module Merb
460
556
  # names, it will be added to them.
461
557
  #
462
558
  # ==== Options
559
+ # :charset<~to_s>::
560
+ # Charset which will be used as value for charset attribute
463
561
  # :bundle<~to_s>::
464
562
  # The name of the bundle the stylesheets should be combined into.
465
563
  # :media<~to_s>::
466
564
  # The media attribute for the generated link element. Defaults to :all.
565
+ # :prefix<~to_s>::
566
+ # prefix to add to include tag, overrides any set in Merb::Plugins.config[:asset_helpers][:css_prefix]
567
+ # :suffix<~to_s>::
568
+ # suffix to add to include tag, overrides any set in Merb::Plugins.config[:asset_helpers][:css_suffix]
569
+ # :reload<Boolean>::
570
+ # Override the Merb::Config[:reload_templates] value. If true, a random query param will be appended
571
+ # to the css url
467
572
  #
468
573
  # ==== Returns
469
574
  # String:: The CSS include tag(s).
@@ -488,11 +593,18 @@ module Merb
488
593
  #
489
594
  # css_include_tag :style, :charset => 'iso-8859-1'
490
595
  # # => <link href="/stylesheets/style.css" media="print" rel="Stylesheet" type="text/css" charset="iso-8859-1" />
596
+ #
597
+ # css_include_tag :style, :prefix => "http://static.example.com"
598
+ # # => <link href="http://static.example.com/stylesheets/style.css" media="print" rel="Stylesheet" type="text/css" />
599
+ #
600
+ # css_include_tag :style, :suffix => ".#{MyApp.version}"
601
+ # # => <link href="/stylesheets/style.1.0.0.css" media="print" rel="Stylesheet" type="text/css" />
491
602
  def css_include_tag(*stylesheets)
492
603
  options = stylesheets.last.is_a?(Hash) ? stylesheets.pop : {}
493
604
  return nil if stylesheets.empty?
494
605
 
495
- reload = options[:reload] || Merb::Config[:reload_templates]
606
+ css_prefix = options[:prefix] || Merb::Plugins.config[:asset_helpers][:css_prefix]
607
+ css_suffix = options[:suffix] || Merb::Plugins.config[:asset_helpers][:css_suffix]
496
608
 
497
609
  if (bundle_name = options[:bundle]) && Merb::Assets.bundle? && stylesheets.size > 1
498
610
  bundler = Merb::Assets::StylesheetAssetBundler.new(bundle_name, *stylesheets)
@@ -503,13 +615,22 @@ module Merb
503
615
  tags = ""
504
616
 
505
617
  for stylesheet in stylesheets
506
- href = asset_path(:stylesheet, stylesheet)
507
- href += href.include?('?') ? "&#{random_query_string}" : "?#{random_query_string}" if reload
618
+ href = css_prefix.to_s + asset_path(:stylesheet, stylesheet)
619
+
620
+ if css_suffix
621
+ ext_length = ASSET_FILE_EXTENSIONS[:stylesheet].length + 1
622
+ href.insert(-ext_length,css_suffix)
623
+ end
624
+
625
+ if AssetsMixin.append_random_query_string?(options[:reload])
626
+ href += href.include?('?') ? "&#{random_query_string}" : "?#{random_query_string}"
627
+ end
628
+
508
629
  attrs = {
509
630
  :href => href,
510
631
  :type => "text/css",
511
632
  :rel => "Stylesheet",
512
- :charset => options[:charset] || 'utf-8',
633
+ :charset => options[:charset] || "utf-8",
513
634
  :media => options[:media] || :all
514
635
  }
515
636
  tags << %Q{<link #{attrs.to_xml_attributes} />}
@@ -542,7 +663,7 @@ module Merb
542
663
  # #=>"http://assets1.my-awesome-domain.com/images/hostsexypicture.jpg"
543
664
  def uniq_path(*assets)
544
665
  paths = []
545
- assets.collect.flatten.each do |filename|
666
+ assets.flatten.each do |filename|
546
667
  paths.push(Merb::Assets::UniqueAssetPath.build(filename))
547
668
  end
548
669
  paths.length > 1 ? paths : paths.first
@@ -564,7 +685,7 @@ module Merb
564
685
  # "http://assets1.my-awesome-domain.com/javascripts/home/signup.js"]
565
686
  def uniq_js_path(*assets)
566
687
  paths = []
567
- assets.collect.flatten.each do |filename|
688
+ assets.flatten.each do |filename|
568
689
  paths.push(Merb::Assets::UniqueAssetPath.build(asset_path(:javascript,filename)))
569
690
  end
570
691
  paths.length > 1 ? paths : paths.first
@@ -586,7 +707,7 @@ module Merb
586
707
  # "http://assets1.my-awesome-domain.com/stylesheets/home/signup.css"]
587
708
  def uniq_css_path(*assets)
588
709
  paths = []
589
- assets.collect.flatten.each do |filename|
710
+ assets.flatten.each do |filename|
590
711
  paths.push(Merb::Assets::UniqueAssetPath.build(asset_path(:stylesheet,filename)))
591
712
  end
592
713
  paths.length > 1 ? paths : paths.first
@@ -644,6 +765,5 @@ module Merb
644
765
  def random_query_string
645
766
  Time.now.strftime("%m%d%H%M%S#{rand(99)}")
646
767
  end
647
-
648
768
  end
649
- end
769
+ end
@@ -0,0 +1,5 @@
1
+ module Merb
2
+ module Assets
3
+ VERSION = '1.1.0.pre'.freeze
4
+ end
5
+ end
data/lib/merb-assets.rb CHANGED
@@ -10,5 +10,17 @@ Merb::Plugins.config[:asset_helpers] = {
10
10
  :max_hosts => 4,
11
11
  :asset_domain => "assets%s",
12
12
  :domain => "my-awesome-domain.com",
13
- :use_ssl => false
13
+ :use_ssl => false,
14
+
15
+ # Global prefix/suffix for css/js include tags, overridable in js_include_tag and css_include_tag
16
+ #
17
+ # :js_prefix => "http://cdn.example.com"
18
+ # require_js :application # => "http://cdn.example.com/javascripts/application.js"
19
+ #
20
+ # :js_suffix => "_#{MyApp.version}"
21
+ # require_js :application # => "/javascripts/application_0.2.2.js"
22
+ :js_prefix => nil,
23
+ :js_suffix => nil,
24
+ :css_prefix => nil,
25
+ :css_suffix => nil
14
26
  } if Merb::Plugins.config[:asset_helpers].nil?
@@ -1,4 +1,5 @@
1
- require File.dirname(__FILE__) + '/spec_helper'
1
+ require 'spec_helper'
2
+
2
3
  include Merb::AssetsMixin
3
4
 
4
5
  describe "Accessing Assets" do
@@ -58,7 +59,127 @@ describe "Accessing Assets" do
58
59
  result = image_tag('foo.gif', :reload => true)
59
60
  result.should match(%r{<img src="/images/foo.gif\?\d+" />})
60
61
  end
62
+
63
+ it "should not create image tag with nil image" do
64
+ image_tag(nil).should == ""
65
+ end
66
+
67
+ it "should not create image tag with empty string" do
68
+ image_tag('').should == ""
69
+ end
70
+ end
71
+
72
+ describe "With Merb::Config[:path_prefix] set," do
73
+ before(:all) do
74
+ Merb::Config[:path_prefix] = "/myapp"
75
+ end
76
+ after(:all) do
77
+ Merb::Config[:path_prefix] = nil
78
+ end
79
+
80
+ describe "create an image tag" do
81
+ it "with a relative url" do
82
+ image_tag('foo.gif').should ==
83
+ "<img src=\"/myapp/images/foo.gif\" />"
84
+ end
85
+
86
+ it "with an absolute url" do
87
+ image_tag('/foo.gif').should ==
88
+ "<img src=\"/myapp/foo.gif\" />"
89
+ end
90
+
91
+ it "with an external url" do
92
+ image_tag('http://example.com/foo.gif').should ==
93
+ "<img src=\"http://example.com/foo.gif\" />"
94
+ end
95
+ end
96
+
97
+ describe "create a stylesheet include tag" do
98
+ it "with a relative url" do
99
+ result = css_include_tag('bar.css')
100
+ result.should match(%r{^<link})
101
+ result.should match(%r{media="all"})
102
+ result.should match(%r{type="text/css"})
103
+ result.should match(%r{href="/myapp/stylesheets/bar.css"})
104
+ result.should match(%r{charset="utf-8"})
105
+ result.should match(%r{rel="Stylesheet"})
106
+ end
107
+
108
+ it "with an absolute url" do
109
+ result = css_include_tag('/bar.css')
110
+ result.should match(%r{^<link})
111
+ result.should match(%r{media="all"})
112
+ result.should match(%r{type="text/css"})
113
+ result.should match(%r{href="/myapp/bar.css"})
114
+ result.should match(%r{charset="utf-8"})
115
+ result.should match(%r{rel="Stylesheet"})
116
+ end
117
+
118
+ it "with an external url" do
119
+ result = css_include_tag('http://example.com/bar.css')
120
+ result.should match(%r{^<link})
121
+ result.should match(%r{media="all"})
122
+ result.should match(%r{type="text/css"})
123
+ result.should match(%r{href="http://example.com/bar.css"})
124
+ result.should match(%r{charset="utf-8"})
125
+ result.should match(%r{rel="Stylesheet"})
126
+ end
127
+ end
128
+
129
+ describe "create a javascript include tag" do
130
+ it "with a relative url" do
131
+ result = js_include_tag("bar.js")
132
+ result.should match(%r{^<script}); result.should match(%r{</script>$})
133
+ result.should match(%r{type="text/javascript"})
134
+ result.should match(%r{src="/myapp/javascripts/bar.js"})
135
+ result.should match(%r{charset="utf-8"})
136
+ end
137
+
138
+ it "with an absolute url" do
139
+ result = js_include_tag("/bar.js")
140
+ result.should match(%r{^<script}); result.should match(%r{</script>$})
141
+ result.should match(%r{type="text/javascript"})
142
+ result.should match(%r{src="/myapp/bar.js"})
143
+ end
144
+
145
+ it "with an external url" do
146
+ result = js_include_tag("http://example.com/bar.js")
147
+ result.should match(%r{^<script}); result.should match(%r{</script>$})
148
+ result.should match(%r{type="text/javascript"})
149
+ result.should match(%r{src="http://example.com/bar.js"})
150
+ end
151
+
152
+ it "with a specific charset option" do
153
+ result = js_include_tag("bar.js", :charset => 'iso-8859-1')
154
+ result.should match(%r{^<script}); result.should match(%r{</script>$})
155
+ result.should match(%r{type="text/javascript"})
156
+ result.should match(%r{src="/myapp/javascripts/bar.js"})
157
+ result.should match(%r{charset="iso-8859-1"})
158
+ end
159
+ end
160
+ end
161
+
162
+ describe "With Merb::Config[:reload_templates] set," do
163
+ before(:all) do
164
+ Merb::Config[:reload_templates] = true
165
+ end
166
+ after(:all) do
167
+ Merb::Config[:reload_templates] = false
168
+ end
61
169
 
170
+ it "should create image tag with absolute url" do
171
+ image_tag('http://example.com/foo.gif').should ==
172
+ "<img src=\"http://example.com/foo.gif\" />"
173
+ end
174
+
175
+ it "should create image tag with absolute url and random string if :reload option is set" do
176
+ image_tag('http://example.com/foo.gif', :reload => true).should =~
177
+ %r{<img src="http://example.com/foo.gif\?\d+" />}
178
+ end
179
+
180
+ it "should create image tag with relative url" do
181
+ image_tag('foo.gif').should =~ %r{<img src="/images/foo.gif\?\d+" />}
182
+ end
62
183
  end
63
184
 
64
185
  describe "JavaScript related functions" do
@@ -145,13 +266,17 @@ describe "External JavaScript and Stylesheets" do
145
266
  end
146
267
 
147
268
  it "should create a js include tag with the extension specified" do
148
- js_include_tag('jquery.js').should ==
149
- "<script type=\"text/javascript\" src=\"/javascripts/jquery.js\"></script>"
269
+ result = js_include_tag('jquery.js')
270
+ result.scan(/<script/).should have(1).things
271
+ result.should match(%r{src="/javascripts/jquery.js"})
272
+ result.should match(%r{type="text/javascript"})
150
273
  end
151
274
 
152
275
  it "should create a js include tag and and the extension" do
153
- js_include_tag('jquery').should ==
154
- "<script type=\"text/javascript\" src=\"/javascripts/jquery.js\"></script>"
276
+ result =js_include_tag('jquery')
277
+ result.scan(/<script/).should have(1).things
278
+ result.should match(%r{src="/javascripts/jquery.js"})
279
+ result.should match(%r{type="text/javascript"})
155
280
  end
156
281
 
157
282
  it "should create a js include tag for multiple includes" do
@@ -244,8 +369,10 @@ describe "External JavaScript and Stylesheets" do
244
369
  end
245
370
 
246
371
  it "should create a uniq js tag for a single js file" do
247
- uniq_js_tag("my").should ==
248
- "<script type=\"text/javascript\" src=\"http://assets2.my-awesome-domain.com/javascripts/my.js\"></script>"
372
+ result = uniq_js_tag("my")
373
+ result.scan(/<script/).should have(1).things
374
+ result.should match(%r{src="http://assets2.my-awesome-domain.com/javascripts/my.js"})
375
+ result.should match(%r{type="text/javascript"})
249
376
  end
250
377
 
251
378
  it "should create a uniq js tag for each js file specified" do
@@ -271,4 +398,66 @@ describe "External JavaScript and Stylesheets" do
271
398
  result.should match(%r{/stylesheets/style.css})
272
399
  result.should match(%r{/stylesheets/layout.css})
273
400
  end
401
+
402
+ it 'should create a js include tag with a prefix' do
403
+ result = js_include_tag('jquery.js', :effects, :prefix => "http://cdn.example.com")
404
+ result.scan(/<script/).should have(2).things
405
+ result.should match(%r{http://cdn.example.com/javascripts/jquery.js})
406
+ result.should match(%r{http://cdn.example.com/javascripts/effects.js})
407
+ end
408
+
409
+ it 'should create a js include tag with a suffix' do
410
+ @js_version = "3.0.1"
411
+ result = js_include_tag('jquery.js', :effects, :suffix => ".#{@js_version}")
412
+ result.scan(/<script/).should have(2).things
413
+ result.should match(%r{/javascripts/jquery.3.0.1.js})
414
+ result.should match(%r{/javascripts/effects.3.0.1.js})
415
+ end
416
+
417
+ it 'should create a css include tag with a prefix' do
418
+ result = css_include_tag('style.css', :layout, :prefix => "http://cdn.example.com")
419
+ result.scan(/<link/).should have(2).things
420
+ result.should match(%r{http://cdn.example.com/stylesheets/style.css})
421
+ result.should match(%r{http://cdn.example.com/stylesheets/layout.css})
422
+ end
423
+
424
+ it 'should create a css include tag with a suffix' do
425
+ @css_version = "0.1.3"
426
+ result = css_include_tag('style.css', :layout, :suffix => ".#{@css_version}")
427
+ result.scan(/<link/).should have(2).things
428
+ result.should match(%r{/stylesheets/style.0.1.3.css})
429
+ result.should match(%r{/stylesheets/layout.0.1.3.css})
430
+ end
431
+ end
432
+
433
+ describe "using assets unique assets helper in localhost environment" do
434
+ before(:all) do
435
+ Merb::Plugins.config[:asset_helpers][:asset_domain] = nil
436
+ Merb::Plugins.config[:asset_helpers][:domain] = "localhost:4000"
437
+ end
438
+
439
+ after(:all) do
440
+ Merb::Plugins.config[:asset_helpers][:asset_domain] = "assets%d"
441
+ Merb::Plugins.config[:asset_helpers][:domain] = "my-awesome-domain.com"
442
+ end
443
+
444
+ it "should return a js path for a single js file" do
445
+ uniq_js_path("my").should ==
446
+ "http://localhost:4000/javascripts/my.js"
447
+ end
448
+
449
+ it "should return a js path for multiple js files" do
450
+ uniq_js_path(["admin/secrets","home/signup"]).should ==
451
+ ["http://localhost:4000/javascripts/admin/secrets.js", "http://localhost:4000/javascripts/home/signup.js"]
452
+ end
453
+
454
+ it "should return a css path for a single css file" do
455
+ uniq_css_path("my").should ==
456
+ "http://localhost:4000/stylesheets/my.css"
457
+ end
458
+
459
+ it "should return a css path for multiple css files" do
460
+ uniq_css_path(["admin/secrets","home/signup"]).should ==
461
+ ["http://localhost:4000/stylesheets/admin/secrets.css", "http://localhost:4000/stylesheets/home/signup.css"]
462
+ end
274
463
  end
data/spec/spec.opts ADDED
@@ -0,0 +1,2 @@
1
+ --format specdoc
2
+ --colour
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,15 @@
1
- $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
2
1
  require "rubygems"
3
- require "merb-core"
2
+
3
+ # Use current merb-core sources if running from a typical dev checkout.
4
+ lib = File.expand_path('../../../merb-core/lib', __FILE__)
5
+ $LOAD_PATH.unshift(lib) if File.directory?(lib)
6
+ require 'merb-core'
7
+
8
+ # The lib under test
4
9
  require "merb-assets"
5
- # require File.dirname(__FILE__) / "controllers" / "action-args"
6
- require "spec"
10
+
11
+ # Satisfies Autotest and anyone else not using the Rake tasks
12
+ require 'spec'
7
13
 
8
14
  Merb.start :environment => 'test'
9
15
 
@@ -11,7 +17,6 @@ Merb::Plugins.config[:asset_helpers][:max_hosts] = 4
11
17
  Merb::Plugins.config[:asset_helpers][:asset_domain] = "assets%d"
12
18
  Merb::Plugins.config[:asset_helpers][:domain] = "my-awesome-domain.com"
13
19
 
14
-
15
20
  Spec::Runner.configure do |config|
16
21
  config.include Merb::Test::RequestHelper
17
- end
22
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: merb-assets
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.15
4
+ version: 1.1.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ezra Zygmuntowicz
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-04 00:00:00 +00:00
12
+ date: 2010-02-20 00:00:00 +00:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,35 +20,47 @@ dependencies:
20
20
  requirements:
21
21
  - - ~>
22
22
  - !ruby/object:Gem::Version
23
- version: 1.0.15
23
+ version: 1.1.0.pre
24
24
  version:
25
- description: Merb plugin that provides the helpers for assets and asset bundling
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.2.9
34
+ version:
35
+ description: Merb plugin for supporting assets
26
36
  email: ez@engineyard.com
27
37
  executables: []
28
38
 
29
39
  extensions: []
30
40
 
31
41
  extra_rdoc_files:
32
- - README
33
42
  - LICENSE
43
+ - README
34
44
  - TODO
35
45
  files:
36
46
  - LICENSE
37
47
  - README
38
48
  - Rakefile
39
49
  - TODO
50
+ - lib/merb-assets.rb
40
51
  - lib/merb-assets/assets.rb
41
52
  - lib/merb-assets/assets_mixin.rb
42
- - lib/merb-assets.rb
53
+ - lib/merb-assets/version.rb
43
54
  - spec/merb-assets_spec.rb
55
+ - spec/spec.opts
44
56
  - spec/spec_helper.rb
45
57
  has_rdoc: true
46
- homepage: http://merbivore.com
58
+ homepage: http://merbivore.com/
47
59
  licenses: []
48
60
 
49
61
  post_install_message:
50
- rdoc_options: []
51
-
62
+ rdoc_options:
63
+ - --charset=UTF-8
52
64
  require_paths:
53
65
  - lib
54
66
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -59,16 +71,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
59
71
  version:
60
72
  required_rubygems_version: !ruby/object:Gem::Requirement
61
73
  requirements:
62
- - - ">="
74
+ - - ">"
63
75
  - !ruby/object:Gem::Version
64
- version: "0"
76
+ version: 1.3.1
65
77
  version:
66
78
  requirements: []
67
79
 
68
- rubyforge_project: merb
80
+ rubyforge_project:
69
81
  rubygems_version: 1.3.5
70
82
  signing_key:
71
83
  specification_version: 3
72
- summary: Merb plugin that provides the helpers for assets and asset bundling
84
+ summary: Merb plugin that provides helpers for assets and asset bundling
73
85
  test_files: []
74
86