pubba 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,5 +1,10 @@
1
1
  master
2
2
 
3
+ 0.4.0
4
+
5
+ * Extract page tag creation from asset processing
6
+ * Replace crappy before filter process in dev/test mode with fssm
7
+
3
8
  0.3.0
4
9
 
5
10
  * Include YUICompressor processing of stylesheets and javascripts
@@ -9,12 +9,6 @@ module Sinatra
9
9
  def self.registered(app)
10
10
  Site.configure(app)
11
11
 
12
- if app.settings.development? || app.settings.test?
13
- app.before do
14
- Site.process(app)
15
- end
16
- end
17
-
18
12
  app.helpers Sinatra::Pubba::HTML::Helpers
19
13
  end
20
14
  end # Pubba
@@ -4,12 +4,12 @@ module Sinatra
4
4
  module Pubba
5
5
  module Assets
6
6
  class Configuration
7
- attr_reader :yaml
8
- attr_reader :name
7
+ attr_reader :yaml, :name, :disclaimer
9
8
 
10
9
  def initialize(config_file)
11
- @name = File.basename(config_file)
12
10
  @yaml = Psych.load_file(config_file)
11
+ @name = File.basename(config_file)
12
+ @disclaimer = "// This file is automatically generated from the contents\n// in #{name}\n//\n"
13
13
  end
14
14
 
15
15
  def global_config!
@@ -0,0 +1,24 @@
1
+ require 'fssm'
2
+
3
+ module Sinatra
4
+ module Pubba
5
+ module Monitor
6
+ extend self
7
+
8
+ def do
9
+ start_monitor unless @running
10
+ end
11
+
12
+ def start_monitor
13
+ @running = Thread.new do
14
+ puts "Pubba is now monitoring: #{Site.asset_folder}"
15
+ FSSM.monitor(Site.asset_folder, '**/*', :directories => true) do
16
+ update {|base, relative, type| Site.process}
17
+ delete {|base, relative, type| Site.process}
18
+ create {|base, relative, type| Site.process}
19
+ end
20
+ end
21
+ end
22
+ end # Monitor
23
+ end # Pubba
24
+ end # Sinatra
@@ -14,14 +14,15 @@ module Sinatra
14
14
  @assets["styles"][key] = value.dup
15
15
  end
16
16
 
17
- @assets["scripts"]["head"] = global_configuration["scripts"]["head"] || []
18
- @assets["scripts"]["body"] = global_configuration["scripts"]["body"] || []
17
+ script_groups do |group|
18
+ @assets["scripts"][group] = global_configuration["scripts"][group] || []
19
+ end
19
20
  end
20
21
 
21
22
  def add_asset(type, section)
22
23
  if type == "styles"
23
- section.each do |section_name, hsh|
24
- hsh.each do |key, value|
24
+ section.each do |section_name, hash|
25
+ hash.each do |key, value|
25
26
  if key == "urls"
26
27
  @assets[type][section_name][key] += value
27
28
  else
@@ -30,8 +31,9 @@ module Sinatra
30
31
  end
31
32
  end
32
33
  else
33
- @assets["scripts"]["head"] += section["head"] if section["head"]
34
- @assets["scripts"]["body"] += section["body"] if section["body"]
34
+ script_groups do |group|
35
+ @assets["scripts"][group] += section[group] if section[group]
36
+ end
35
37
  end
36
38
  end
37
39
 
@@ -40,6 +42,20 @@ module Sinatra
40
42
  create_script_assets
41
43
  end
42
44
 
45
+ def tagify
46
+ style_groups do |group, hash|
47
+ style_urls(group) do |url|
48
+ add_style_tag(group, hash, url)
49
+ end
50
+ end
51
+
52
+ script_groups do |group|
53
+ script_urls(group) do |url|
54
+ add_script_tag(group, url)
55
+ end
56
+ end
57
+ end
58
+
43
59
  def method_missing(meth, *args)
44
60
  if Site.locale && (t = Site.locale.get(name, meth, *args))
45
61
  return t
@@ -56,55 +72,69 @@ module Sinatra
56
72
  end
57
73
 
58
74
  def create_style_assets
59
- @assets["styles"].each do |part, hsh|
75
+ style_groups do |group, hash|
60
76
  content = []
61
- @assets["styles"][part]["urls"].each do |url|
62
- add_style_tag(part, hsh, url)
77
+ style_urls(group) do |url|
63
78
  next if url.start_with?("http")
64
79
  content << "//= require #{url}.css"
65
80
  end
66
- write_asset(Site.style_asset_folder, part, "css", content.compact.join("\n"))
81
+ write_asset(Site.style_asset_folder, group, "css", content.compact.join("\n"))
67
82
  end
68
83
  end
69
84
 
70
85
  def create_script_assets
71
- ["head", "body"].each do |part|
86
+ script_groups do |group|
72
87
  content = []
73
- @assets["scripts"][part].each do |url|
74
- add_script_tag(part, url)
88
+ script_urls(group) do |url|
75
89
  next if url.start_with?("http")
76
90
  content << "//= require #{url}.js"
77
91
  end
78
- write_asset(Site.script_asset_folder, part, "js", content.compact.join("\n"))
92
+ write_asset(Site.script_asset_folder, group, "js", content.compact.join("\n"))
79
93
  end
80
94
  end
81
95
 
82
- def add_style_tag(part, hsh, url)
96
+ def style_groups
97
+ @assets["styles"].each{|group, hash| yield group, hash }
98
+ end
99
+
100
+ def style_urls(group)
101
+ @assets["styles"][group]["urls"].each{|url| yield url }
102
+ end
103
+
104
+ def script_groups
105
+ ["head", "body"].each{|group| yield group }
106
+ end
107
+
108
+ def script_urls(group)
109
+ @assets["scripts"][group].each{|url| yield url }
110
+ end
111
+
112
+ def add_style_tag(group, hash, url)
83
113
  h = { tag: 'link', type: 'text/css', rel: 'stylesheet' }
84
- h[:media] = hsh['media'] if hsh['media']
85
- h[:href] = url.start_with?("http") ? url : "/stylesheets/#{name}-#{part}.css"
114
+ h[:media] = hash['media'] if hash['media']
115
+ h[:href] = url.start_with?("http") ? url : "/stylesheets/#{name}-#{group}.css"
86
116
 
87
117
  maybe_add_tag(@head_tags, h, :href)
88
118
  end
89
119
 
90
- def add_script_tag(part, url)
120
+ def add_script_tag(group, url)
91
121
  h = { tag: 'script', type: "text/javascript" }
92
- h[:src] = url.start_with?("http") ? url : "/javascripts/#{name}-#{part}.js"
122
+ h[:src] = url.start_with?("http") ? url : "/javascripts/#{name}-#{group}.js"
93
123
 
94
- tag_set = (part == "head") ? @head_tags : @body_tags
124
+ tag_set = (group == "head") ? @head_tags : @body_tags
95
125
  maybe_add_tag(tag_set, h, :src)
96
126
  end
97
127
 
98
- def maybe_add_tag(tag_set, hsh, key)
128
+ def maybe_add_tag(tag_set, hash, key)
99
129
  found = false
100
- tag_set.each{|tag| found = true if tag[key] == hsh[key]}
101
- tag_set << hsh unless found
130
+ tag_set.each{|tag| found = true if tag[key] == hash[key]}
131
+ tag_set << hash unless found
102
132
  end
103
133
 
104
134
  def write_asset(dir, type, ext, content)
105
135
  fname = File.join(dir, "#{name}-#{type}.#{ext}")
106
136
  File.open(fname, 'w') do |f|
107
- f.write Site.disclaimer
137
+ f.write Site.asset_configuration.disclaimer
108
138
  f.write content
109
139
  end
110
140
  end
@@ -7,14 +7,19 @@ module Sinatra
7
7
  module Pubba
8
8
  module Site
9
9
  extend self
10
+ attr_reader :asset_folder
10
11
  attr_reader :script_asset_folder, :style_asset_folder
11
12
  attr_reader :script_public_folder, :style_public_folder
12
13
 
13
14
  attr_reader :asset_configuration, :asset_handler, :asset_minifier
14
- attr_reader :disclaimer, :locale, :r18n_folder, :r18n_locale
15
+ attr_reader :locale, :r18n_folder, :r18n_locale
15
16
 
16
17
 
17
18
  def configure(app)
19
+ return if @configured
20
+
21
+ puts "Configuring Pubba..."
22
+
18
23
  settings = app.settings
19
24
 
20
25
  validate_settings(settings)
@@ -26,8 +31,6 @@ module Sinatra
26
31
  # Load pubba_config
27
32
  @asset_configuration = Sinatra::Pubba::Assets::Configuration.new(settings.pubba_config)
28
33
 
29
- @disclaimer = "// This file is automatically generated from the contents\n// in #{@asset_configuration.name}\n//\n"
30
-
31
34
  # Set assset handler
32
35
  configure_asset_handler(settings)
33
36
 
@@ -38,19 +41,22 @@ module Sinatra
38
41
  asset_configuration.process do |p, config|
39
42
  add_page(p, config)
40
43
  end
41
- end
42
44
 
43
- def process(app)
44
- pages.each do |name, p|
45
- p.assetize
46
- end
45
+ if app.settings.development? || app.settings.test?
46
+ process
47
47
 
48
- # Write assets to public_folder
49
- compile_assets(app)
48
+ require_relative 'monitor'
49
+ Monitor.do
50
+ end
50
51
 
51
- minify_assets(app)
52
+ @configured = true
52
53
  end
53
54
 
55
+ def process
56
+ pages.each{|name, p| p.assetize }
57
+ compile_assets
58
+ minify_assets
59
+ end
54
60
 
55
61
  def validate_settings(settings)
56
62
  missing_settings = []
@@ -71,8 +77,9 @@ module Sinatra
71
77
  def set_folder_defaults(settings)
72
78
  @script_public_folder = File.join(settings.public_folder, 'javascripts')
73
79
  @style_public_folder = File.join(settings.public_folder, 'stylesheets')
74
- @script_asset_folder = File.join(settings.asset_folder, 'javascripts')
75
- @style_asset_folder = File.join(settings.asset_folder, 'stylesheets')
80
+ @asset_folder = settings.asset_folder
81
+ @script_asset_folder = File.join(@asset_folder, 'javascripts')
82
+ @style_asset_folder = File.join(@asset_folder, 'stylesheets')
76
83
  end
77
84
 
78
85
  def maybe_init_r18n(settings)
@@ -120,12 +127,14 @@ module Sinatra
120
127
  p.add_asset('styles', hsh['styles']) if hsh['styles']
121
128
  p.add_asset('scripts', hsh['scripts']) if hsh['scripts']
122
129
 
130
+ p.tagify
131
+
123
132
  pages[name] = p
124
133
  end
125
134
 
126
135
  private
127
136
 
128
- def compile_assets(app)
137
+ def compile_assets
129
138
  process_assets(script_asset_folder, script_public_folder)
130
139
  process_assets(style_asset_folder, style_public_folder)
131
140
  end
@@ -137,7 +146,7 @@ module Sinatra
137
146
  end
138
147
  end
139
148
 
140
- def minify_assets(app)
149
+ def minify_assets
141
150
  asset_minifier.minify(script_public_folder, :js)
142
151
  asset_minifier.minify(style_public_folder, :css)
143
152
  end
@@ -1,5 +1,5 @@
1
1
  module Pubba
2
2
  # Pubba version string
3
3
  # @api public
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.0'
5
5
  end
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
22
22
  s.add_runtime_dependency('sprockets', ['~> 2.1.2'])
23
23
  s.add_runtime_dependency('r18n-desktop', ['~> 0.4.13'])
24
24
  s.add_runtime_dependency('yui-compressor', ['>= 0.9.4'])
25
+ s.add_runtime_dependency('fssm', ['>= 0.2.7'])
25
26
 
26
27
  s.add_development_dependency('rake', ['>= 0.9.2'])
27
28
  s.add_development_dependency('sinatra', ['>= 1.3.1'])
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pubba
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-11 00:00:00.000000000 Z
12
+ date: 2011-12-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sprockets
16
- requirement: &2152383640 !ruby/object:Gem::Requirement
16
+ requirement: &2151925720 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.1.2
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2152383640
24
+ version_requirements: *2151925720
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: r18n-desktop
27
- requirement: &2152382760 !ruby/object:Gem::Requirement
27
+ requirement: &2151913100 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.4.13
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2152382760
35
+ version_requirements: *2151913100
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: yui-compressor
38
- requirement: &2152381900 !ruby/object:Gem::Requirement
38
+ requirement: &2151918540 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,21 @@ dependencies:
43
43
  version: 0.9.4
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2152381900
46
+ version_requirements: *2151918540
47
+ - !ruby/object:Gem::Dependency
48
+ name: fssm
49
+ requirement: &2151911280 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.2.7
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *2151911280
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: rake
49
- requirement: &2152381020 !ruby/object:Gem::Requirement
60
+ requirement: &2151799920 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ! '>='
@@ -54,10 +65,10 @@ dependencies:
54
65
  version: 0.9.2
55
66
  type: :development
56
67
  prerelease: false
57
- version_requirements: *2152381020
68
+ version_requirements: *2151799920
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: sinatra
60
- requirement: &2152380000 !ruby/object:Gem::Requirement
71
+ requirement: &2151804560 !ruby/object:Gem::Requirement
61
72
  none: false
62
73
  requirements:
63
74
  - - ! '>='
@@ -65,10 +76,10 @@ dependencies:
65
76
  version: 1.3.1
66
77
  type: :development
67
78
  prerelease: false
68
- version_requirements: *2152380000
79
+ version_requirements: *2151804560
69
80
  - !ruby/object:Gem::Dependency
70
81
  name: sinatra-contrib
71
- requirement: &2152379420 !ruby/object:Gem::Requirement
82
+ requirement: &2151803660 !ruby/object:Gem::Requirement
72
83
  none: false
73
84
  requirements:
74
85
  - - ! '>='
@@ -76,10 +87,10 @@ dependencies:
76
87
  version: 1.3.1
77
88
  type: :development
78
89
  prerelease: false
79
- version_requirements: *2152379420
90
+ version_requirements: *2151803660
80
91
  - !ruby/object:Gem::Dependency
81
92
  name: yard
82
- requirement: &2152378680 !ruby/object:Gem::Requirement
93
+ requirement: &2151802660 !ruby/object:Gem::Requirement
83
94
  none: false
84
95
  requirements:
85
96
  - - ! '>='
@@ -87,7 +98,7 @@ dependencies:
87
98
  version: '0'
88
99
  type: :development
89
100
  prerelease: false
90
- version_requirements: *2152378680
101
+ version_requirements: *2151802660
91
102
  description:
92
103
  email:
93
104
  - andy@stonean.com
@@ -111,6 +122,7 @@ files:
111
122
  - lib/sinatra/pubba/errors.rb
112
123
  - lib/sinatra/pubba/html/helpers.rb
113
124
  - lib/sinatra/pubba/locale.rb
125
+ - lib/sinatra/pubba/monitor.rb
114
126
  - lib/sinatra/pubba/page.rb
115
127
  - lib/sinatra/pubba/site.rb
116
128
  - lib/sinatra/pubba/version.rb