web_resource_bundler 0.0.13 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -5,6 +5,7 @@ Content:
5
5
  2. Functional description
6
6
  3. Installation
7
7
  4. Usage
8
+ 5. Recommendations
8
9
 
9
10
  =================== 1. Purpose ===============================================
10
11
 
@@ -98,7 +99,6 @@ use <%= web_resource_bundler_process do %>
98
99
 
99
100
  And as result you'll have
100
101
 
101
-
102
102
  <link href="/cache/base64_style_d880a502addaa493b889c0970616430b.css?1290594873" media="screen" rel="stylesheet" type="text/css" />
103
103
  <script src="/cache/script_275d311037da40e9c9b8c919a8c08b55.js?1290594873" type="text/javascript"></script>
104
104
 
@@ -107,7 +107,7 @@ And as result you'll have
107
107
  <![endif]-->
108
108
 
109
109
  <!--[if lte IE 7]>
110
- <link type="text/css" rel="stylesheet" href="/cache/base64_style_ad801w02addaa493b889c0970616430b"/>
110
+ <link type="text/css" rel="stylesheet" href="/cache/base64_style_ad801w02addaa493b889c0970616430b.css?1290594873"/>
111
111
  <![endif]-->
112
112
 
113
113
  !!!
@@ -116,3 +116,28 @@ Don't forget to clean your cache directory after deploy to clean old bundles
116
116
 
117
117
  To disable bundling and see raw results add no_bundler param
118
118
  mysite.com/?no_bundler=1
119
+ ================= 5. Recommendations ===================================
120
+
121
+ 1. Be mindful while organazing and linking your resource files
122
+ WebResourceBundler combines all resource file in one. This resulted file could be huge.
123
+ a. Don't link all resources in layouts!
124
+ Be sure to link resources (css\js) only for pages that using them, in other case your users will be forced
125
+ to download huge css\js files with unused content.
126
+ b. One css for one page.
127
+ Try to slice you css files - separate file for each particular page.
128
+ c. Separate bundle block for crucial resources
129
+ To make crucial resources (basic styles\scripts for user can see basic page layout ASAP) load first - just bundle them in separate web_resource_bundler_process block and put this block at the top of your head block.
130
+
131
+ 2. Don't set max_image_size to big values.
132
+ The main reason of using Base64 filter is to avoid unnecessary server requests and minimize load time,
133
+ but when encoded image is very big, traffic overhead time (encoded image base64 code is bigger for apprx. 30% than source image size) could be bigger than request time. In this case your site could be even slower than without a WebResourceBundler.
134
+ Recommended max_image_size value is 1..20kbytes
135
+
136
+ 3. Be careful with third party scripts.
137
+ Some third party javascript libs can load another script file on the fly, relative path for this file computed
138
+ on the client side. But your scripts are bundled and their relative path changed (cache folder), that's why such script
139
+ won't be able to compute loaded file path correctly. You should avoid bundling such tricky javascripts.
140
+
141
+ 4. Unexistent resources handling
142
+ a. Be sure to link in html only existent resource files, otherwise bundler won't work.
143
+ b. If you have unexistent images in css, bundler will work but you've got info messages in log.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.13
1
+ 0.0.14
@@ -5,24 +5,18 @@ module WebResourceBundler
5
5
  attr_reader :settings
6
6
 
7
7
  def initialize(settings, file_manager)
8
- @settings = Settings.new(settings)
8
+ @settings = settings
9
9
  @file_manager = file_manager
10
10
  end
11
11
 
12
12
  def set_settings(settings)
13
- @settings.set(settings)
13
+ @settings = settings
14
14
  end
15
15
 
16
16
  def apply(block_data = nil)
17
17
  #applies filter to block_data
18
18
  end
19
19
 
20
- #resource is hash {:css => ResourceBundle::Data, :js => ResourceBundle::Data}
21
- def change_resulted_files!(resource = nil)
22
- #this method changes resource file names to resulted files paths
23
- #used to determine if resulted files exist on disk
24
- end
25
-
26
20
  end
27
21
  end
28
22
  end
@@ -30,16 +30,16 @@ module WebResourceBundler::Filters::BundleFilter
30
30
 
31
31
  def get_md5(files)
32
32
  items = [(files.map {|f| f.path }).sort]
33
- items += @settings.md5_additional_data if @settings.md5_additional_data
33
+ items += @settings[:md5_additional_data] if @settings[:md5_additional_data]
34
34
  Digest::MD5.hexdigest(items.flatten.join('|'))
35
35
  end
36
36
 
37
37
  def bundle_filepath(type, files)
38
38
  unless files.empty?
39
39
  items = [type[:name] + '_' + get_md5(files)]
40
- items += @settings.filename_additional_data if @settings.filename_additional_data
40
+ items += @settings[:filename_additional_data] if @settings[:filename_additional_data]
41
41
  items << type[:ext]
42
- return File.join(@settings.cache_dir, items.join('.'))
42
+ return File.join(@settings[:cache_dir], items.join('.'))
43
43
  else
44
44
  return nil
45
45
  end
@@ -13,16 +13,16 @@ module WebResourceBundler::Filters::CdnFilter
13
13
  end
14
14
 
15
15
  def new_filepath(path)
16
- File.join(@settings.cache_dir, 'cdn_' + File.basename(path))
16
+ File.join(@settings[:cache_dir], 'cdn_' + File.basename(path))
17
17
  end
18
18
 
19
19
  #insures that image linked to one particular host
20
20
  def host_for_image(image_url)
21
21
  #hosts are different depending on protocol
22
- if @settings.protocol == 'https'
23
- hosts = @settings.https_hosts
22
+ if @settings[:protocol] == 'https'
23
+ hosts = @settings[:https_hosts]
24
24
  else
25
- hosts = @settings.http_hosts
25
+ hosts = @settings[:http_hosts]
26
26
  end
27
27
  #getting host based on image url hash
28
28
  host_index = image_url.hash % hosts.size
@@ -13,7 +13,7 @@ module WebResourceBundler
13
13
  end
14
14
 
15
15
  def set_settings(settings)
16
- @settings.set(settings)
16
+ @settings = settings
17
17
  end
18
18
 
19
19
  #construct mhtml head of css file with definition of image data in base64
@@ -24,7 +24,7 @@ module WebResourceBundler
24
24
  result << 'Content-Type: multipart/related; boundary="' << SEPARATOR << '"' << "\n\n"
25
25
  #each image found in css should be defined in header with base64 encoded content
26
26
  images.each_key do |key|
27
- result += images[key].construct_mhtml_image_data('--' + SEPARATOR)
27
+ result << images[key].construct_mhtml_image_data('--' + SEPARATOR)
28
28
  end
29
29
  result << "\n" << '--' << SEPARATOR << '--' << "\n"
30
30
  result << "*/"
@@ -34,7 +34,7 @@ module WebResourceBundler
34
34
 
35
35
  #creates mhtml link to use in css tags instead of image url
36
36
  def construct_mhtml_link(filepath)
37
- "#{@settings.protocol}://#{File.join(@settings.domain, filepath)}"
37
+ "#{@settings[:protocol]}://#{File.join(@settings[:domain], filepath)}"
38
38
  end
39
39
 
40
40
  #iterates through all tags found in css
@@ -46,8 +46,8 @@ module WebResourceBundler
46
46
  new_content = content.gsub!(PATTERN) do |s|
47
47
  tag, url = $1, $3
48
48
  #this constructor will write in log if image doesn't exist
49
- data = ImageData.new(url, @settings.resource_dir)
50
- if !url.empty? and data.exist and data.size <= @settings.max_image_size and block_given?
49
+ data = ImageData.new(url, @settings[:resource_dir])
50
+ if !url.empty? and data.exist and data.size <= @settings[:max_image_size] and block_given?
51
51
  #using image url as key to prevent one image be encoded many times
52
52
  images[data.url] = data unless images[data.path]
53
53
  #changing string using provided block
@@ -35,9 +35,9 @@ module WebResourceBundler
35
35
  def construct_mhtml_image_data(separator)
36
36
  if @exist
37
37
  result = separator + "\n"
38
- result += "Content-Location:" + @id + "\n"
39
- result += "Content-Transfer-Encoding:base64" + "\n\n"
40
- result += encoded + "\n\n"
38
+ result << 'Content-Location:' << @id << "\n"
39
+ result << 'Content-Transfer-Encoding:base64' << "\n\n"
40
+ result << encoded << "\n\n"
41
41
  end
42
42
  end
43
43
 
@@ -39,17 +39,17 @@ module WebResourceBundler::Filters::ImageEncodeFilter
39
39
 
40
40
  #path of a new file with images encoded
41
41
  def encoded_filepath(base_file_path)
42
- File.join(@settings.cache_dir, FILE_PREFIX + File.basename(base_file_path))
42
+ File.join(@settings[:cache_dir], FILE_PREFIX + File.basename(base_file_path))
43
43
  end
44
44
 
45
45
  #path of a new file for IE with images encoded
46
46
  def encoded_filepath_for_ie(base_file_path)
47
- File.join(@settings.cache_dir, IE_FILE_PREFIX + File.basename(base_file_path))
47
+ File.join(@settings[:cache_dir], IE_FILE_PREFIX + File.basename(base_file_path))
48
48
  end
49
49
 
50
50
  #filepath of mhtml file for IE
51
51
  def mhtml_filepath(base_file_path)
52
- File.join(@settings.cache_dir, MHTML_FILE_PREFIX + File.basename(base_file_path))
52
+ File.join(@settings[:cache_dir], MHTML_FILE_PREFIX + File.basename(base_file_path))
53
53
  end
54
54
 
55
55
  end
@@ -4,7 +4,6 @@ require 'content_management/block_data'
4
4
  require 'content_management/css_url_rewriter'
5
5
  require 'content_management/resource_file'
6
6
 
7
- require 'settings'
8
7
  require 'file_manager'
9
8
  require 'logger'
10
9
  require 'filters'
@@ -26,7 +25,7 @@ module WebResourceBundler
26
25
  def initialize
27
26
  @filters = {}
28
27
  @settings = nil
29
- @file_manager = nil
28
+ @file_manager = FileManager.new('','')
30
29
  @parser = BlockParser.new
31
30
  @@logger = nil
32
31
  @settings_correct = false
@@ -36,22 +35,28 @@ module WebResourceBundler
36
35
  def set_settings(settings)
37
36
  #all methods user call from rails should not raise any exception
38
37
  begin
39
- @settings = Settings.new settings
40
- if @settings.resource_dir
41
- @@logger = create_logger(@settings)
42
- unless @settings.cache_dir
43
- @settings.cache_dir = 'cache'
38
+ @settings = settings
39
+ if @settings[:resource_dir]
40
+
41
+ #creating default log file in rails log directory called web_resource_bundler.log
42
+ unless @settings[:log_path]
43
+ log_dir = File.expand_path('../log', @settings[:resource_dir])
44
+ log_name = 'web_resource_bundler.log'
45
+ @settings[:log_path] = File.join(log_dir, log_name)
46
+ Dir.mkdir(log_dir) unless File.exist?(log_dir)
44
47
  end
45
- #if file manager is nil it should be created
46
- unless @file_manager
47
- @file_manager = FileManager.new(@settings.resource_dir, @settings.cache_dir)
48
- else
49
- #if manager already exist than its settings chaged
50
- @file_manager.resource_dir, @file_manager.cache_dir = @settings.resource_dir, @settings.cache_dir
48
+ @@logger = create_logger(@settings[:log_path]) unless @@logger
49
+
50
+ unless @settings[:cache_dir]
51
+ @settings[:cache_dir] = 'cache'
51
52
  end
53
+
54
+ @file_manager.resource_dir, @file_manager.cache_dir = @settings[:resource_dir], @settings[:cache_dir]
52
55
  set_filters(@settings, @file_manager)
53
56
  #used to determine if bundler in correct state and could be used
54
57
  @settings_correct = true
58
+ else
59
+ @settings_correct = false
55
60
  end
56
61
  rescue Exception => e
57
62
  @@logger.error("Incorrect settings initialization, #{settings}\n#{e.to_s}") if @@logger
@@ -61,30 +66,32 @@ module WebResourceBundler
61
66
 
62
67
  #main method to process html text block
63
68
  def process(block)
64
- begin
65
- filters = filters_array
66
- #parsing html text block, creating BlockData instance
67
- block_data = @parser.parse(block)
68
- #if filters set and no bundle files exists we should process block data
69
- unless filters.empty? or bundle_upto_date?(block_data)
70
- #reading files content and populating block_data
71
- read_resources!(block_data)
72
- #applying filters to block_data
69
+ if @settings_correct
70
+ begin
71
+ filters = filters_array
72
+ #parsing html text block, creating BlockData instance
73
+ block_data = @parser.parse(block)
74
+ #if filters set and no bundle files exists we should process block data
75
+ unless filters.empty? or bundle_upto_date?(block_data)
76
+ #reading files content and populating block_data
77
+ read_resources!(block_data)
78
+ #applying filters to block_data
79
+ block_data.apply_filters(filters)
80
+ #writing resulted files with filtered content on disk
81
+ write_files_on_disk(block_data)
82
+ @@logger.info("files written on disk")
83
+ return block_data
84
+ end
85
+ #bundle up to date, returning existing block with modified file names
73
86
  block_data.apply_filters(filters)
74
- #writing resulted files with filtered content on disk
75
- write_files_on_disk(block_data)
76
- @@logger.info("files written on disk")
77
87
  return block_data
88
+ rescue Exceptions::WebResourceBundlerError => e
89
+ @@logger.error(e.to_s)
90
+ return nil
91
+ rescue Exception => e
92
+ @@logger.error(e.backtrace.join("\n") + "Unknown error occured: " + e.to_s)
93
+ return nil
78
94
  end
79
- #bundle up to date, returning existing block with modified file names
80
- block_data.apply_filters(filters)
81
- return block_data
82
- rescue Exceptions::WebResourceBundlerError => e
83
- @@logger.error(e.to_s)
84
- return nil
85
- rescue Exception => e
86
- @@logger.error(e.backtrace.join("\n") + "Unknown error occured: " + e.to_s)
87
- return nil
88
95
  end
89
96
  end
90
97
 
@@ -94,7 +101,7 @@ module WebResourceBundler
94
101
  def filters_array
95
102
  filters = []
96
103
  %w{bundle_filter base64_filter cdn_filter}.each do |key|
97
- filters << @filters[key.to_sym] if @filters[key.to_sym]
104
+ filters << @filters[key.to_sym] if @settings[key.to_sym][:use] and @filters[key.to_sym]
98
105
  end
99
106
  filters
100
107
  end
@@ -103,46 +110,36 @@ module WebResourceBundler
103
110
  def set_filters(settings, file_manager)
104
111
  #common settings same for all filters
105
112
  common_sets = {
106
- :resource_dir => settings.resource_dir,
107
- :cache_dir => settings.cache_dir
113
+ :resource_dir => settings[:resource_dir],
114
+ :cache_dir => settings[:cache_dir]
108
115
  }
109
- #used to craete filters
116
+ #used to create filters
110
117
  filters_data = {
111
118
  :bundle_filter => 'BundleFilter',
112
119
  :base64_filter => 'ImageEncodeFilter',
113
120
  :cdn_filter => 'CdnFilter'
114
121
  }
115
- filters_data.each_pair do |key, filter_class|
116
- if settings[key] and settings[key][:use]
117
- filter_settings = settings[key].merge(common_sets)
118
- if @filters[key]
122
+ filters_data.each_pair do |key, filter_class|
123
+ if settings[key] and settings[key][:use]
124
+ filter_settings = settings[key].merge(common_sets)
125
+ if @filters[key]
119
126
  @filters[key].set_settings(filter_settings)
120
127
  else
121
128
  #creating filter instance with settings
122
129
  @filters[key] = eval("Filters::" + filter_class + "::Filter").new(filter_settings, file_manager)
123
130
  end
124
- else
125
- #this filter turned off in settings so should be deleted
126
- @filters.delete(key)
127
131
  end
128
132
  end
129
133
  @filters
130
134
  end
131
135
 
132
- def create_logger(settings)
136
+ def create_logger(logfile_path)
133
137
  begin
134
- #creating default log file in rails log directory called web_resource_bundler.log
135
- unless settings.log_path
136
- log_dir = File.expand_path('../log', settings.resource_dir)
137
- log_name = 'web_resource_bundler.log'
138
- settings[:log_path] = File.join(log_dir, log_name)
139
- Dir.mkdir(log_dir) unless File.exist?(log_dir)
140
- end
141
- file = File.open(settings.log_path, File::WRONLY | File::APPEND | File::CREAT)
138
+ file = File.open(logfile_path, File::WRONLY | File::APPEND | File::CREAT)
142
139
  logger = Logger.new(file)
143
140
  rescue Exception => e
144
141
  logger = Logger.new(STDOUT)
145
- logger.error("Can't create log file, check log path: #{settings.log_path}\n#{e.to_s}")
142
+ logger.error("Can't create log file, check log path: #{logfile_path}\n#{e.to_s}")
146
143
  end
147
144
  logger
148
145
  end
@@ -158,7 +155,7 @@ module WebResourceBundler
158
155
  block_data_copy.apply_filters(filters_array)
159
156
  #cheking if resulted files exist on disk in cache folder
160
157
  block_data_copy.files.each do |file|
161
- return false unless File.exist?(File.join(@settings.resource_dir, file.path))
158
+ return false unless File.exist?(File.join(@settings[:resource_dir], file.path))
162
159
  end
163
160
  true
164
161
  end
@@ -182,7 +179,7 @@ module WebResourceBundler
182
179
  def write_files_on_disk(block_data)
183
180
  @file_manager.create_cache_dir
184
181
  block_data.files.each do |file|
185
- File.open(File.join(@settings.resource_dir, file.path), "w") do |f|
182
+ File.open(File.join(@settings[:resource_dir], file.path), "w") do |f|
186
183
  f.print(file.content)
187
184
  end
188
185
  end
@@ -34,7 +34,7 @@ class SampleBlockHelper
34
34
  if content
35
35
  resource_file.content = content
36
36
  else
37
- resource_file.content = File.read(File.join(@settings.resource_dir, file))
37
+ resource_file.content = File.read(File.join(@settings[:resource_dir], file))
38
38
  end
39
39
  resource_file
40
40
  end
data/spec/spec_helper.rb CHANGED
@@ -20,10 +20,6 @@ def scripts
20
20
  end
21
21
 
22
22
  def settings
23
- Settings.new(settings_hash)
24
- end
25
-
26
- def settings_hash
27
23
  {
28
24
  :resource_dir => File.join(File.dirname(__FILE__), '/public'),
29
25
  :cache_dir => 'cache',
@@ -48,19 +44,19 @@ def settings_hash
48
44
  end
49
45
 
50
46
  def bundle_settings
51
- settings.bundle_filter.merge(common_settings)
47
+ settings[:bundle_filter].merge(common_settings)
52
48
  end
53
49
 
54
50
  def cdn_settings
55
- settings.cdn_filter.merge(common_settings)
51
+ settings[:cdn_filter].merge(common_settings)
56
52
  end
57
53
 
58
54
  def base64_settings
59
- settings.base64_filter.merge(common_settings)
55
+ settings[:base64_filter].merge(common_settings)
60
56
  end
61
57
 
62
58
  def common_settings
63
- {:resource_dir => settings.resource_dir, :cache_dir => settings.cache_dir}
59
+ {:resource_dir => settings[:resource_dir], :cache_dir => settings[:cache_dir]}
64
60
  end
65
61
 
66
62
 
@@ -74,8 +70,8 @@ Spec::Runner.configure do |config|
74
70
  end
75
71
 
76
72
  config.after(:all) do
77
- File.delete(settings.log_path) if File.exist?(settings.log_path)
78
- log_path = File.expand_path('../log', settings.resource_dir)
73
+ File.delete(settings[:log_path]) if File.exist?(settings[:log_path])
74
+ log_path = File.expand_path('../log', settings[:resource_dir])
79
75
  FileUtils.rm_rf(log_path) if File.exist?(log_path)
80
76
  clean_cache_dir
81
77
  end
@@ -3,7 +3,8 @@ module WebResourceBundler
3
3
  describe BlockParser do
4
4
 
5
5
  before(:each) do
6
- @file_manager = FileManager.new(settings.resource_dir, settings.cache_dir)
6
+ @settings = settings
7
+ @file_manager = FileManager.new(@settings[:resource_dir], @settings[:cache_dir])
7
8
  @block_parser = BlockParser.new
8
9
  end
9
10
 
@@ -5,27 +5,27 @@ describe WebResourceBundler::FileManager do
5
5
  end
6
6
 
7
7
  def create_stub_file(name)
8
- File.open(File.join(@settings.resource_dir, name), "w") do |file|
8
+ File.open(File.join(@settings[:resource_dir], name), "w") do |file|
9
9
  file.print "hi there"
10
10
  end
11
11
  end
12
12
 
13
13
  before(:each) do
14
- temp_dir = File.join(@settings.resource_dir, 'temp')
14
+ temp_dir = File.join(@settings[:resource_dir], 'temp')
15
15
  Dir.mkdir(temp_dir) unless File.exist?(temp_dir)
16
16
  @bundle_url = 'temp/bundle.dat'
17
- @bundle_path = File.join(@settings.resource_dir, @bundle_url)
17
+ @bundle_path = File.join(@settings[:resource_dir], @bundle_url)
18
18
  create_stub_file(@bundle_url)
19
- @manager = FileManager.new(@settings.resource_dir, @settings.cache_dir)
19
+ @manager = FileManager.new(@settings[:resource_dir], @settings[:cache_dir])
20
20
  end
21
21
 
22
22
  after(:each) do
23
- FileUtils.rm_rf(File.join(@settings.resource_dir, 'temp'))
23
+ FileUtils.rm_rf(File.join(@settings[:resource_dir], 'temp'))
24
24
  end
25
25
 
26
26
  describe "#create_cache_dir" do
27
27
  it "creates cache dir if it doesn't exists" do
28
- dir_path = File.join(@settings.resource_dir, @settings.cache_dir)
28
+ dir_path = File.join(@settings[:resource_dir], @settings[:cache_dir])
29
29
  FileUtils.rm_rf(dir_path)
30
30
  @manager.create_cache_dir
31
31
  File.exist?(dir_path).should == true
@@ -4,16 +4,16 @@ describe WebResourceBundler::Filters::BundleFilter::Filter do
4
4
  clean_cache_dir
5
5
  @settings = settings
6
6
  @bundle_settings = bundle_settings
7
- @filter = Filters::BundleFilter::Filter.new(@bundle_settings, FileManager.new(@settings.resource_dir, @settings.cache_dir))
7
+ @filter = Filters::BundleFilter::Filter.new(@bundle_settings, FileManager.new(@settings[:resource_dir], @settings[:cache_dir]))
8
8
  @block_data = @sample_block_helper.sample_block_data
9
9
  css_type = ResourceFileType::CSS
10
10
  js_type = ResourceFileType::JS
11
11
  items = [@block_data.styles.map {|f| f.path}.sort] + @bundle_settings[:md5_additional_data]
12
12
  @css_md5_value = Digest::MD5.hexdigest(items.flatten.join('|'))
13
- @css_bundle_file = File.join(@settings.cache_dir, [css_type[:name] + '_' + @css_md5_value, 'en', css_type[:ext]].join('.'))
13
+ @css_bundle_file = File.join(@settings[:cache_dir], [css_type[:name] + '_' + @css_md5_value, 'en', css_type[:ext]].join('.'))
14
14
  items = [@block_data.scripts.map {|f| f.path}.sort] + @bundle_settings[:md5_additional_data]
15
15
  js_md5_value = Digest::MD5.hexdigest(items.flatten.join('|'))
16
- @js_bundle_file = File.join(@settings.cache_dir, [js_type[:name] + '_' + js_md5_value, 'en', js_type[:ext]].join('.'))
16
+ @js_bundle_file = File.join(@settings[:cache_dir], [js_type[:name] + '_' + js_md5_value, 'en', js_type[:ext]].join('.'))
17
17
  end
18
18
 
19
19
  describe "#apply" do
@@ -3,10 +3,10 @@ require 'digest/md5'
3
3
  describe WebResourceBundler::Filters::BundleFilter::ResourcePackager do
4
4
  before(:each) do
5
5
  @settings = settings
6
- file_manager = FileManager.new(@settings.resource_dir, @settings.cache_dir)
6
+ file_manager = FileManager.new(@settings[:resource_dir], @settings[:cache_dir])
7
7
  @file_packager = Filters::BundleFilter::ResourcePackager.new(@settings, file_manager)
8
8
  @file_paths = styles.map do |url|
9
- File.join(@settings.resource_dir, url)
9
+ File.join(@settings[:resource_dir], url)
10
10
  end
11
11
  end
12
12
 
@@ -7,7 +7,7 @@ describe WebResourceBundler::Filters::CdnFilter do
7
7
  @cdn_settings[:https_hosts] = ['http://froogle.com']
8
8
  @settings[:cdn_filter][:http_hosts] = @cdn_settings[:http_hosts]
9
9
  @settings[:cdn_filter][:https_hosts] = @cdn_settings[:https_hosts]
10
- @file_manager = FileManager.new(@settings.resource_dir, @settings.cache_dir)
10
+ @file_manager = FileManager.new(@settings[:resource_dir], @settings[:cache_dir])
11
11
  @filter = Filters::CdnFilter::Filter.new(@cdn_settings, @file_manager)
12
12
  end
13
13
 
@@ -68,7 +68,7 @@ describe WebResourceBundler::Filters::CdnFilter do
68
68
  block_data = BlockData.new
69
69
  block_data.files = [file]
70
70
  @filter.apply!(block_data)
71
- block_data.files.first.path.should == File.join(@settings.cache_dir, 'cdn_temp.css')
71
+ block_data.files.first.path.should == File.join(@settings[:cache_dir], 'cdn_temp.css')
72
72
  block_data.files.first.content.should == "background: url('http://boogle.com/images/1.png');background-image: url('http://boogle.com/images/1.png');"
73
73
  end
74
74
  end
@@ -2,8 +2,8 @@ require File.expand_path(File.join(File.dirname(__FILE__), "../../../spec_helper
2
2
  module WebResourceBundler::Filters::ImageEncodeFilter
3
3
  describe CssGenerator do
4
4
  before(:each) do
5
- @settings = Settings.new base64_settings
6
- @generator = CssGenerator.new(@settings, FileManager.new(@settings.resource_dir, @settings.cache_dir))
5
+ @settings = base64_settings
6
+ @generator = CssGenerator.new(@settings, FileManager.new(@settings[:resource_dir], @settings[:cache_dir]))
7
7
  end
8
8
 
9
9
  describe "#pattern" do
@@ -28,14 +28,14 @@ module WebResourceBundler::Filters::ImageEncodeFilter
28
28
  describe "#encode_images_basic" do
29
29
 
30
30
  before(:each) do
31
- @content = "background-image: url('images/logo.jpg'); background: url('images/logo.jpg');"
31
+ @content = "background-image: url('images/ligo.jpg'); background: url('images/logo.jpg');"
32
32
  @images = @generator.encode_images_basic!(@content) do |image_data, tag|
33
33
  tag + image_data.extension
34
34
  end
35
35
  end
36
36
 
37
37
  it "substitute each image tag (image should exist and has proper size) with result of a yield" do
38
- @content.should == "background-image: jpg; background: jpg;"
38
+ @content.should == "background-image: url('images/ligo.jpg'); background: jpg;"
39
39
  end
40
40
 
41
41
  it "returns hash of images found and with proper size" do
@@ -87,8 +87,8 @@ module WebResourceBundler::Filters::ImageEncodeFilter
87
87
  describe "#encode_images_for_ie" do
88
88
  it "changes urls to mhtml link" do
89
89
  @generator.encode_images_for_ie!(@content, 'cache/1.mhtml')
90
- @content.include?("mhtml:#{@settings.protocol}://#{@settings.domain}/cache/1.mhtml!").should be_true
91
- @content.include?("background: #eeeeee url(mhtml:").should be_true
90
+ @content.include?("mhtml:#{@settings[:protocol]}://#{@settings[:domain]}/cache/1.mhtml!").should be_true
91
+ @content.include?("*background: #eeeeee url(mhtml:").should be_true
92
92
  @content.include?("repeat-x 0 100%").should be_true
93
93
  end
94
94
  end
@@ -96,7 +96,7 @@ module WebResourceBundler::Filters::ImageEncodeFilter
96
96
 
97
97
  describe "#construct_mhtml_link" do
98
98
  it "should create link without public folder" do
99
- @generator.construct_mhtml_link("temp.css").should == "http://#{@settings.domain}/temp.css"
99
+ @generator.construct_mhtml_link("temp.css").should == "http://#{@settings[:domain]}/temp.css"
100
100
  end
101
101
  end
102
102
  end
@@ -6,21 +6,21 @@ describe WebResourceBundler::Filters::ImageEncodeFilter::Filter do
6
6
  @base64_settings = base64_settings
7
7
  @file_prefix = Filters::ImageEncodeFilter::Filter::FILE_PREFIX
8
8
  @ie_file_prefix = Filters::ImageEncodeFilter::Filter::IE_FILE_PREFIX
9
- @file_manager = FileManager.new(@settings.resource_dir, @settings.cache_dir)
9
+ @file_manager = FileManager.new(@settings[:resource_dir], @settings[:cache_dir])
10
10
  @filter = Filters::ImageEncodeFilter::Filter.new(@base64_settings, @file_manager)
11
11
  end
12
12
 
13
13
  describe "#encoded_filepath" do
14
14
  it "should return new filename for css for all browsers except IE" do
15
15
  filename = "mycss.css"
16
- @filter.encoded_filepath(filename).should == File.join(@settings.cache_dir, @file_prefix + filename)
16
+ @filter.encoded_filepath(filename).should == File.join(@settings[:cache_dir], @file_prefix + filename)
17
17
  end
18
18
  end
19
19
 
20
20
  describe "#new_filepath_for_ie" do
21
21
  it "should return new filename for css for IE" do
22
22
  filename = "2.css"
23
- @filter.encoded_filepath_for_ie(filename).should == File.join(@settings.cache_dir, @ie_file_prefix + filename)
23
+ @filter.encoded_filepath_for_ie(filename).should == File.join(@settings[:cache_dir], @ie_file_prefix + filename)
24
24
  end
25
25
  end
26
26
 
@@ -41,8 +41,8 @@ describe WebResourceBundler::Filters::ImageEncodeFilter::Filter do
41
41
  @bundler_filter.apply!(block_data)
42
42
  @filter.apply!(block_data)
43
43
  generated_files = block_data.files.map {|f| f.path}
44
- generated_files.include?(File.join(@settings.cache_dir, @file_prefix + File.basename(bundle_filepath))).should be_true
45
- generated_files.include?(File.join(@settings.cache_dir, @ie_file_prefix + File.basename(bundle_filepath))).should be_true
44
+ generated_files.include?(File.join(@settings[:cache_dir], @file_prefix + File.basename(bundle_filepath))).should be_true
45
+ generated_files.include?(File.join(@settings[:cache_dir], @ie_file_prefix + File.basename(bundle_filepath))).should be_true
46
46
  end
47
47
 
48
48
  end
@@ -62,8 +62,8 @@ describe WebResourceBundler::Filters::ImageEncodeFilter::Filter do
62
62
  generated_files = @block_data.styles.map {|f| f.path}
63
63
  generated_files.size.should == 2*@files.size
64
64
  @files.each do |file|
65
- generated_files.include?(File.join(@settings.cache_dir, @ie_file_prefix + File.basename(file))).should be_true
66
- generated_files.include?(File.join(@settings.cache_dir, @file_prefix + File.basename(file))).should be_true
65
+ generated_files.include?(File.join(@settings[:cache_dir], @ie_file_prefix + File.basename(file))).should be_true
66
+ generated_files.include?(File.join(@settings[:cache_dir], @file_prefix + File.basename(file))).should be_true
67
67
  end
68
68
  end
69
69
 
@@ -15,7 +15,7 @@ module WebResourceBundler::Filters::ImageEncodeFilter
15
15
 
16
16
  context "with existent small enough file" do
17
17
  before(:each) do
18
- @data = ImageData.new(image_path("logo.jpg"), settings.resource_dir)
18
+ @data = ImageData.new(image_path("logo.jpg"), settings[:resource_dir])
19
19
  end
20
20
 
21
21
  it "should exist" do
@@ -32,7 +32,7 @@ module WebResourceBundler::Filters::ImageEncodeFilter
32
32
  end
33
33
 
34
34
  it "should have unique id" do
35
- new_data = ImageData.new(image_path("good.jpg"), settings.resource_dir)
35
+ new_data = ImageData.new(image_path("good.jpg"), settings[:resource_dir])
36
36
  new_data.exist.should be_true
37
37
  @data.id.should_not equal(new_data.id)
38
38
  end
@@ -3,13 +3,44 @@ module WebResourceBundler
3
3
  describe Bundler do
4
4
 
5
5
  before(:each) do
6
- @s = Settings.new settings_hash
6
+ @s = settings
7
7
  @bundler = WebResourceBundler::Bundler.instance
8
8
  end
9
9
 
10
+ describe "#set_settings" do
11
+ it "sets settings_correct property to false if resource dir not specified" do
12
+ @bundler.set_settings({})
13
+ @bundler.settings_correct.should be_false
14
+ end
15
+ it "sets settings_correct property to true if resource dir specified" do
16
+ @bundler.set_settings({:resource_dir => @s[:resource_dir]})
17
+ @bundler.settings_correct.should be_true
18
+ end
19
+ end
20
+
21
+
22
+ describe "#filters_array" do
23
+ it "returns array of filters that has :use => true in settings" do
24
+ @bundler.set_settings(@s)
25
+ filters = @bundler.send("filters_array")
26
+ filters.size.should == 3
27
+ @bundler.filters.size.should == 3
28
+ i = 2
29
+ %w{cdn_filter bundle_filter base64_filter}.each do |s|
30
+ @s[s.to_sym][:use] = false
31
+ @bundler.set_settings(@s)
32
+ filters = @bundler.send("filters_array")
33
+ filters.size.should == i
34
+ @bundler.filters.size.should == 3
35
+ i -= 1
36
+ end
37
+ end
38
+ end
39
+
10
40
  describe "#set_filters" do
11
41
  before(:each) do
12
- @file_manager = FileManager.new(@s.resource_dir, @s.cache_dir)
42
+ @file_manager = FileManager.new(@s[:resource_dir], @s[:cache_dir])
43
+ @bundler.instance_eval "@filters={}"
13
44
  end
14
45
  it "inits filters if no filters were initialized before" do
15
46
  @bundler.filters.should == {}
@@ -18,38 +49,44 @@ module WebResourceBundler
18
49
  end
19
50
  it "sets filters settings if filters already inited" do
20
51
  @bundler.send("set_filters", @s, @file_manager)
21
- @bundler.filters[:base64_filter].settings.max_image_size.should == @s[:base64_filter][:max_image_size]
52
+ @bundler.filters[:base64_filter].settings[:max_image_size].should == @s[:base64_filter][:max_image_size]
22
53
  @s[:base64_filter][:max_image_size] = 90
23
54
  @bundler.send("set_filters", @s, @file_manager)
24
- @bundler.filters[:base64_filter].settings.max_image_size.should == 90
55
+ @bundler.filters[:base64_filter].settings[:max_image_size].should == 90
25
56
  end
26
57
  end
27
-
28
- describe "#initialize" do
29
- it "set instance to nil if resource_dir ins't specified" do
58
+ describe "#initialize" do
59
+ it "set instance to nil if resource_dir ins't specified" do
30
60
  @bundler.set_settings({})
31
61
  @bundler.settings_correct.should be_false
32
62
  end
33
63
  it "correctly inits cache dir, and log path with defaults if resource_dir specified" do
34
- res_dir = settings_hash[:resource_dir]
64
+ res_dir = settings[:resource_dir]
35
65
  @bundler.set_settings({:resource_dir => res_dir })
36
66
  @bundler.settings_correct.should be_true
37
- @bundler.settings.cache_dir.should == 'cache'
38
- @bundler.settings.log_path.should == File.expand_path('../log/web_resource_bundler.log', res_dir)
67
+ @bundler.settings[:cache_dir].should == 'cache'
68
+ @bundler.settings[:log_path].should == File.expand_path('../log/web_resource_bundler.log', res_dir)
69
+ end
70
+ it "creates log directory if it's unexistent" do
71
+ @bundler.set_settings({:resource_dir => @s[:resource_dir]})
72
+ log_dir_path = File.expand_path('../log', @s[:resource_dir])
73
+ File.exist?(log_dir_path).should be_true
74
+ Dir.delete(log_dir_path)
39
75
  end
40
76
  end
41
77
 
42
78
  describe "#create_logger" do
43
79
  it "sets log_path in settings if it isn't specified" do
44
- sets = Settings.new({:resource_dir => @s.resource_dir })
45
- @bundler.send("create_logger", sets)
46
- @bundler.settings.log_path.should == File.expand_path('../log/web_resource_bundler.log', sets.resource_dir)
80
+ path = File.expand_path('../web_resource_bundler.log', @s[:resource_dir])
81
+ @bundler.send("create_logger", path)
82
+ File.exist?(path).should be_true
83
+ File.delete(path)
47
84
  end
48
85
  end
49
86
 
50
87
  describe "#process" do
51
88
  it "returns the same filenames when bundling or just computing resulted files" do
52
- @bundler.set_settings(settings_hash)
89
+ @bundler.set_settings(settings)
53
90
  clean_cache_dir
54
91
  block_text = @sample_block_helper.sample_block
55
92
  block_data = @bundler.process(block_text)
@@ -63,7 +100,7 @@ module WebResourceBundler
63
100
 
64
101
  describe "#bundle_upto_date?" do
65
102
  it "returns true if block was already bundled and resulted files exist" do
66
- @bundler.set_settings(settings_hash)
103
+ @bundler.set_settings(settings)
67
104
  clean_cache_dir
68
105
  block_text = @sample_block_helper.sample_block
69
106
  block_data = BlockParser.new.parse(block_text.dup)
@@ -76,12 +113,12 @@ module WebResourceBundler
76
113
 
77
114
  describe "#read_resources!" do
78
115
  it "populates block_data resource files structure with files content" do
79
- @bundler.set_settings(settings_hash)
116
+ @bundler.set_settings(settings)
80
117
  block_data = @sample_block_helper.sample_block_data
81
118
  @bundler.send("read_resources!", block_data)
82
119
  all_files = block_data.styles + block_data.scripts + block_data.child_blocks[0].styles + block_data.child_blocks[0].scripts
83
120
  all_files.each do |file|
84
- CssUrlRewriter::rewrite_content_urls!(file.path, File.read(File.join(@s.resource_dir, file.path))).should == file.content
121
+ CssUrlRewriter::rewrite_content_urls!(file.path, File.read(File.join(@s[:resource_dir], file.path))).should == file.content
85
122
  end
86
123
  end
87
124
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{web_resource_bundler}
8
- s.version = "0.0.13"
8
+ s.version = "0.0.14"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["gregolsen"]
12
- s.date = %q{2010-12-04}
12
+ s.date = %q{2010-12-13}
13
13
  s.description = %q{this lib could bundle you css/js files in single file, encode images in base64, rewrite images urls to your cdn hosts}
14
14
  s.email = %q{anotheroneman@yahoo.com}
15
15
  s.extra_rdoc_files = [
@@ -39,7 +39,6 @@ Gem::Specification.new do |s|
39
39
  "lib/web_resource_bundler/filters/image_encode_filter/css_generator.rb",
40
40
  "lib/web_resource_bundler/filters/image_encode_filter/image_data.rb",
41
41
  "lib/web_resource_bundler/rails_app_helpers.rb",
42
- "lib/web_resource_bundler/settings.rb",
43
42
  "lib/web_resource_bundler/web_resource_bundler_init.rb",
44
43
  "spec/public/foo.css",
45
44
  "spec/public/images/good.jpg",
@@ -68,7 +67,6 @@ Gem::Specification.new do |s|
68
67
  "spec/web_resource_bundler/filters/image_encode_filter/css_generator_spec.rb",
69
68
  "spec/web_resource_bundler/filters/image_encode_filter/filter_spec.rb",
70
69
  "spec/web_resource_bundler/filters/image_encode_filter/image_data_spec.rb",
71
- "spec/web_resource_bundler/settings_spec.rb",
72
70
  "spec/web_resource_bundler/web_resource_bundler_spec.rb",
73
71
  "web_resource_bundler.gemspec"
74
72
  ]
@@ -86,7 +84,6 @@ Gem::Specification.new do |s|
86
84
  "spec/web_resource_bundler/filters/bundle_filter/resource_packager_spec.rb",
87
85
  "spec/web_resource_bundler/web_resource_bundler_spec.rb",
88
86
  "spec/web_resource_bundler/file_manager_spec.rb",
89
- "spec/web_resource_bundler/settings_spec.rb",
90
87
  "spec/web_resource_bundler/content_management/css_url_rewriter_spec.rb",
91
88
  "spec/web_resource_bundler/content_management/block_data_spec.rb",
92
89
  "spec/web_resource_bundler/content_management/resource_file_spec.rb",
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 13
9
- version: 0.0.13
8
+ - 14
9
+ version: 0.0.14
10
10
  platform: ruby
11
11
  authors:
12
12
  - gregolsen
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-12-04 00:00:00 +02:00
17
+ date: 2010-12-13 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -64,7 +64,6 @@ files:
64
64
  - lib/web_resource_bundler/filters/image_encode_filter/css_generator.rb
65
65
  - lib/web_resource_bundler/filters/image_encode_filter/image_data.rb
66
66
  - lib/web_resource_bundler/rails_app_helpers.rb
67
- - lib/web_resource_bundler/settings.rb
68
67
  - lib/web_resource_bundler/web_resource_bundler_init.rb
69
68
  - spec/public/foo.css
70
69
  - spec/public/images/good.jpg
@@ -93,7 +92,6 @@ files:
93
92
  - spec/web_resource_bundler/filters/image_encode_filter/css_generator_spec.rb
94
93
  - spec/web_resource_bundler/filters/image_encode_filter/filter_spec.rb
95
94
  - spec/web_resource_bundler/filters/image_encode_filter/image_data_spec.rb
96
- - spec/web_resource_bundler/settings_spec.rb
97
95
  - spec/web_resource_bundler/web_resource_bundler_spec.rb
98
96
  - web_resource_bundler.gemspec
99
97
  has_rdoc: true
@@ -137,7 +135,6 @@ test_files:
137
135
  - spec/web_resource_bundler/filters/bundle_filter/resource_packager_spec.rb
138
136
  - spec/web_resource_bundler/web_resource_bundler_spec.rb
139
137
  - spec/web_resource_bundler/file_manager_spec.rb
140
- - spec/web_resource_bundler/settings_spec.rb
141
138
  - spec/web_resource_bundler/content_management/css_url_rewriter_spec.rb
142
139
  - spec/web_resource_bundler/content_management/block_data_spec.rb
143
140
  - spec/web_resource_bundler/content_management/resource_file_spec.rb
@@ -1,46 +0,0 @@
1
- module WebResourceBundler
2
- class Settings
3
- @@defaults = {
4
- :cache_dir => 'cache',
5
- :base64_filter => {
6
- :max_image_size => 23, #kbytes
7
- :protocol => 'http',
8
- :domain => 'localhost:3000'
9
- },
10
- :bundle_filter => {
11
- :md5_additional_data => []
12
- },
13
- :cdn_filter => {
14
- :http_hosts => ['http://localhost:3000'],
15
- :https_hosts => ['https://localhost:3000']
16
- }
17
- }
18
-
19
- def initialize(hash = {})
20
- @settings = hash
21
- end
22
-
23
- def set(hash)
24
- @settings.merge!(hash)
25
- end
26
-
27
- def [](i)
28
- @settings[i]
29
- end
30
-
31
- def []=(i , v)
32
- @settings[i] = v
33
- end
34
-
35
- def method_missing(m, *args, &block)
36
- m=m.to_s
37
- if /.*=\z/.match(m)
38
- @settings[m[0..-2].to_sym] = args[0]
39
- else
40
- @settings[m.to_sym]
41
- end
42
- end
43
-
44
-
45
- end
46
- end
@@ -1,45 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "../spec_helper"))
2
- module WebResourceBundler
3
- describe Settings do
4
-
5
- before(:each) do
6
- @settings_hash = settings_hash
7
- @s = Settings.new(@settings_hash)
8
- end
9
-
10
- it "should contain proper defaults after initialization" do
11
- @settings_hash.each_key do |k|
12
- @s[k].should == @settings_hash[k]
13
- @s.send(k).should == @settings_hash[k]
14
- end
15
- end
16
-
17
- it "should set proper values using unexistent setters" do
18
- @s.domain = "new_domain"
19
- @s[:domain].should == "new_domain"
20
- end
21
-
22
- it "returns values while calling keys as methods" do
23
- @settings_hash.each_key do |k|
24
- @s.send(k).should == @settings_hash[k]
25
- end
26
- end
27
-
28
- it "returns nil on unexistent key" do
29
- @s.send("unexistent_key".to_sym).should be_nil
30
- @s["unexistent_key".to_sym].should be_nil
31
- end
32
-
33
- describe "#set" do
34
- it "merges current settings with passed hash" do
35
- @settings_hash[:domain] = "new_value"
36
- @s.set({:domain => "new_value"})
37
- @settings_hash.each do |k, v|
38
- @s.send(k).should == v
39
- end
40
- end
41
- end
42
-
43
- end
44
- end
45
-