gluey 0.2.7 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/gluey.gemspec +1 -1
  3. data/lib/gluey.rb +10 -1
  4. data/lib/gluey/base/environment.rb +34 -0
  5. data/lib/gluey/base/exceptions.rb +5 -0
  6. data/lib/gluey/base/rack_mountable.rb +87 -0
  7. data/lib/gluey/base/version.rb +3 -0
  8. data/lib/gluey/tools/local_make.rb +83 -0
  9. data/lib/gluey/warehouse.rb +39 -39
  10. data/lib/gluey/warehouse/asset_retrieving.rb +31 -0
  11. data/lib/gluey/workshop.rb +29 -76
  12. data/lib/gluey/workshop/asset_processing.rb +52 -0
  13. data/lib/gluey/{dependencies → workshop/dependencies}/directory.rb +0 -0
  14. data/lib/gluey/{dependencies → workshop/dependencies}/handlebars_bundle.rb +1 -1
  15. data/lib/gluey/{dependencies → workshop/dependencies}/single_file.rb +0 -0
  16. data/lib/gluey/{dependencies → workshop/dependencies}/texts_bundle.rb +1 -1
  17. data/lib/gluey/{glues → workshop/glues}/base.rb +5 -3
  18. data/lib/gluey/{glues → workshop/glues}/copy.rb +0 -0
  19. data/lib/gluey/{glues → workshop/glues}/js_script.rb +15 -16
  20. data/lib/gluey/{glues → workshop/glues}/js_script/handlebars_addons.rb +1 -1
  21. data/lib/gluey/workshop/glues/js_script/uglifier_addons.rb +19 -0
  22. data/lib/gluey/{glues → workshop/glues}/sass.rb +9 -7
  23. data/lib/gluey/{glues → workshop/glues}/script.rb +2 -2
  24. data/lib/gluey/{material.rb → workshop/material.rb} +11 -13
  25. metadata +21 -19
  26. data/lib/gluey/exceptions/file_not_found.rb +0 -4
  27. data/lib/gluey/exceptions/item_not_listed.rb +0 -4
  28. data/lib/gluey/tools/local_build.rb +0 -86
  29. data/lib/gluey/tools/tools.rb +0 -19
  30. data/lib/gluey/url.rb +0 -9
  31. data/lib/gluey/version.rb +0 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 06efa92dcd6fd292dd71faf95ac07ce0dd921fdd
4
- data.tar.gz: ea74e55f880c37e08b24a0002c8c243a5839016a
3
+ metadata.gz: 48c9c7072ee094bafc30aaff125545851b59fecc
4
+ data.tar.gz: 33d09cc9e4f936ca60e63ea9d452dc8091d0865f
5
5
  SHA512:
6
- metadata.gz: 39c68be866dbfc940bb6841075474b39735174cf76048992827ce8b870d045881bf83b46304f0cc0a62bf4b4f7623d23301235b47fdc9d78ebb20af08b54b9a7
7
- data.tar.gz: 11c54bcc7c1c2875d54f2246c849216ef9a9c9889a6942881bf5d4188d9777a350e76372b52165c899b50cc57616ab427816615183941badfe9306d111e362d1
6
+ metadata.gz: 86ee61effd7c25c684611a43883fada8270262cfa1eb0685c0e63f2d7e712933cf91c3b97598d3853aa3643d32e8065f16b6bd9f5f56fbb121b48c2b0f3ce978
7
+ data.tar.gz: 56846446df80b66aaacf8a61ea41f2fd87c01430238bd98122b1de2d0cee762a4e5606d4bb0a3dd6ea5dac78d91e47bb548da103e265469eac045862ec15bf33
@@ -1,6 +1,6 @@
1
1
  lib = File.expand_path('../lib', __FILE__)
2
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require 'gluey/version'
3
+ require 'gluey/base/version'
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = 'gluey'
@@ -1,2 +1,11 @@
1
1
 
2
- require_relative 'gluey/version'
2
+ require_relative 'gluey/base/version'
3
+ require_relative 'gluey/base/exceptions'
4
+
5
+ # environments
6
+ require_relative 'gluey/base/environment'
7
+ require_relative 'gluey/workshop'
8
+ require_relative 'gluey/warehouse'
9
+
10
+ # addons
11
+ require_relative 'gluey/base/rack_mountable'
@@ -0,0 +1,34 @@
1
+ module Gluey
2
+
3
+ class Environment
4
+
5
+ attr_reader :root, :base_url, :path_prefix
6
+ attr_accessor :mark_versions
7
+
8
+ def initialize(**opts, &block)
9
+ opts = {
10
+ base_url: nil,
11
+ path_prefix: '/assets'
12
+ }.merge! opts
13
+
14
+ opts.each do |k, value|
15
+ next unless k.is_a? Symbol
16
+ instance_variable_set "@#{k}", value
17
+ end
18
+ instance_exec &block if block
19
+
20
+ root || raise('Root directory not defined!')
21
+ end
22
+
23
+ def asset_url(material, path)
24
+ "#{base_url}#{path_prefix}/#{material}/#{real_path material, path}"
25
+ end
26
+
27
+ def [](material, path, mark=nil)
28
+ fetch(material, path, mark)[0]
29
+ end
30
+ alias_method :find_asset_file, :[]
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,5 @@
1
+ module Gluey
2
+ class UnregisteredMaterial < StandardError; end
3
+ class FileNotFound < StandardError; end
4
+ class ListingError < StandardError; end
5
+ end
@@ -0,0 +1,87 @@
1
+ require 'rack/utils'
2
+
3
+ module Gluey
4
+ class RackMountable
5
+ ALLOWED_HEADERS = %w[GET HEAD].freeze
6
+ PATH_PARSER = %r_^/(\w+)/([^\.]+)\.(?:([a-f0-9]{32})\.)?\w+$_
7
+
8
+ def initialize(env, logger)
9
+ @environment = env
10
+ @logger = logger
11
+ end
12
+
13
+ def call(env)
14
+ material = nil
15
+ path = nil
16
+ start_time = Time.now.to_f
17
+ time_elapsed = lambda { ((Time.now.to_f - start_time) * 1000).to_i }
18
+
19
+ unless ALLOWED_HEADERS.include? env['REQUEST_METHOD']
20
+ return method_not_allowed_response
21
+ end
22
+
23
+ # Extract the path from everything after the leading slash
24
+ _, material, path, mark = env['PATH_INFO'].to_s.match(PATH_PARSER).to_a
25
+ unless path
26
+ return bat_path_response
27
+ end
28
+
29
+ file = @environment[material, path, mark]
30
+ unless file
31
+ @logger.info "Not found glued asset #{path} (material=#{material}) - 404 (#{time_elapsed.call}ms)"
32
+ return not_found_response
33
+ end
34
+
35
+ @logger.info "Served glued asset #{path} (material=#{material}) - 200 (#{time_elapsed.call}ms)"
36
+ ok_response file, (mark && @environment.mark_versions)
37
+
38
+ rescue => e
39
+ @logger.error "Error gluying asset #{path} (material=#{material}):"
40
+ @logger.error "#{e.class.name}: #{e.message}"
41
+ raise
42
+ end
43
+
44
+ def inspect
45
+ '#<Gluey::RackMountable>'
46
+ end
47
+
48
+ private
49
+
50
+ # Returns a 200 OK response tuple
51
+ def ok_response(file, to_cache)
52
+ headers = {
53
+ 'Content-Length' => File.stat(file).size,
54
+ 'Content-Type' => Rack::Mime.mime_type(File.extname(file), 'text/plain')
55
+ }
56
+ if to_cache
57
+ headers['Cache-Control'] = "public, max-age=31536000"
58
+ end
59
+
60
+ [200, headers, FileBody.new(file)]
61
+ end
62
+
63
+ def method_not_allowed_response
64
+ [405, {'Content-Type' => "text/plain", 'Content-Length' => "18"}, ['Method Not Allowed']]
65
+ end
66
+
67
+ def bat_path_response
68
+ [400, {'Content-Type' => "text/plain", 'Content-Length' => "8"}, ['Bad Path']]
69
+ end
70
+
71
+ # Returns a 404 Not Found response tuple
72
+ def not_found_response
73
+ [404, {'Content-Type' => "text/plain", 'Content-Length' => "9"}, ['Not found']]
74
+ end
75
+
76
+ class FileBody < Struct.new(:file_path)
77
+ def each
78
+ File.open(file_path, 'rb') do |file|
79
+ while chunk = file.read(16384)
80
+ yield chunk
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ end
87
+ end
@@ -0,0 +1,3 @@
1
+ module Gluey
2
+ VERSION = '0.3.3'
3
+ end
@@ -0,0 +1,83 @@
1
+
2
+ module Gluey::Tools
3
+
4
+ def self.make_into_assets_dir(workshop, warehouse)
5
+ made = []
6
+
7
+ warehouse.each_listed_asset workshop do |cache_file, path, material|
8
+ file = "#{warehouse.assets_path}/#{material.name}/#{path}"
9
+ next if File.exists? file
10
+
11
+ FileUtils.mkdir_p file[0..(file.rindex('/')-1)]
12
+ FileUtils.cp cache_file, file
13
+
14
+ made << file
15
+ puts "created #{file}"
16
+ end
17
+
18
+ made
19
+ end
20
+
21
+ # def self.clear_public_dir(workshop, warehouse, versions=3, public_dir='public/assets')
22
+ # public_dirs = workshop.materials.values.inject({}) do |h, m|
23
+ # h[m.name] = "#{workshop.root_path}/#{m.public_dir || public_dir}"
24
+ # h
25
+ # end
26
+ #
27
+ # # process existing files into assets
28
+ # eas_regexp = /^#{workshop.root_path}\/(.+)$/
29
+ # assets = public_dirs.values.uniq.map{|dir| Dir["#{dir}/**/*.*.*"]}.flatten.
30
+ # map{|f| Asset.try_create f[eas_regexp, 1], f}.compact
31
+ # assets = assets.inject({}){|h, asset| (h[asset.path] ||= []) << asset; h }
32
+ #
33
+ # # items not on list
34
+ # on_list = []
35
+ # warehouse.assets.each do |type, mater_assets|
36
+ # mater_assets.each do |_, real_path|
37
+ # file = "#{public_dirs[type]}/#{real_path}"
38
+ # asset = Asset.try_create file[eas_regexp, 1], f
39
+ # on_list << asset
40
+ # end
41
+ # end
42
+ # on_list.map! &:path
43
+ # assets.delete_if do |path, asseets_arr|
44
+ # unless on_list.include? path
45
+ # asseets_arr.each do |some_asset|
46
+ # file = "#{workshop.root_path}/#{some_asset.orig_path}"
47
+ # File.delete file
48
+ # puts "deleted unknown #{file}"
49
+ # end
50
+ # true
51
+ # end
52
+ # false
53
+ # end
54
+ #
55
+ # # older versions
56
+ # assets.values.select{|arr| arr.length > versions}.
57
+ # map{|arr| arr.sort.slice 0..(-versions-1) }.compact.flatten.each do |old_asset|
58
+ # file = "#{workshop.root_path}/#{old_asset.orig_path}"
59
+ # File.delete file
60
+ # puts "deleted old #{file}"
61
+ # end
62
+ # end
63
+ #
64
+ # class Asset < Struct.new(:path, :time_stamp)
65
+ #
66
+ # def self.try_create(path, file)
67
+ # path.match /^([^\.]+)\.(?:[a-f0-9]{32}\.)?(\w+)$/ do |m|
68
+ # new "#{m[1]}.#{m[2]}", File.mtime(file).to_i
69
+ # end
70
+ # end
71
+ #
72
+ # def <=>(other)
73
+ # time_stamp <=> other.time_stamp
74
+ # end
75
+ #
76
+ # def orig_path
77
+ # ret = path.dup
78
+ # ret.insert ret.rindex('.'), ".#{time_stamp}"
79
+ # end
80
+ #
81
+ # end
82
+
83
+ end
@@ -1,52 +1,52 @@
1
- require_relative '../gluey'
2
- require_relative 'url'
3
- require_relative 'exceptions/item_not_listed'
4
1
  require 'json'
2
+ require_relative 'warehouse/asset_retrieving'
5
3
 
6
- class Gluey::Warehouse
7
- include Gluey::Url
4
+ module Gluey
5
+ class Warehouse < Environment
6
+ include ::Gluey::AssetRetrieving
8
7
 
9
- attr_reader :assets
8
+ attr_reader :listing
10
9
 
11
- def initialize(root, listing_file='assets/gluey_listing.json')
12
- @listing_file = "#{root}/#{listing_file}"
13
- read_listing
14
- end
15
-
16
- def real_path(asset_type, path, mark=nil)
17
- listing = @assets[asset_type]
18
- unless listing
19
- raise ::Gluey::ItemNotListed.new("Asset type #{asset_type} is not defined! (listing file problem?)")
10
+ def initialize(root, listing_path='assets/gluey_listing.json', **opts, &block)
11
+ super opts.merge!(
12
+ root: root,
13
+ listing_file: "#{root}/#{listing_path}",
14
+ ), &block
15
+ @assets_path = "#{root}/#{@assets_path.chomp '/'}#{path_prefix}" if @assets_path && @assets_path[0]!='/'
16
+ read_listing
20
17
  end
21
18
 
22
- real_path = listing[path]
23
- unless real_path
24
- raise ::Gluey::ItemNotListed.new("Unknown asset: #{path}, type=#{asset_type}! (listing file problem?)")
19
+ def read_listing
20
+ @listing = if File.exists? @listing_file
21
+ @listing = JSON.parse File.read(@listing_file) rescue nil
22
+ unless @listing.is_a? Hash
23
+ raise ::Gluey::ListingError.new("Corrupted listing file at #{@listing_file} !")
24
+ end
25
+ Hash[@listing.map{|k, v| [k.to_sym, v]}]
26
+ else
27
+ {}
28
+ end
25
29
  end
26
30
 
27
- real_path
28
- end
29
-
30
- def read_listing
31
- assets = if File.exists? @listing_file
32
- JSON.parse File.read(@listing_file) rescue {}
33
- else
34
- {}
35
- end
36
- raise "corrupted listing file at #{@listing_file}" unless assets.is_a? Hash
37
- @assets = assets.keys.inject({}){|h, asset_type| h[asset_type.to_sym] = assets[asset_type]; h }
38
- end
31
+ def write_listing(workshop)
32
+ @listing = workshop.materials.values.inject({}) do |listing, material|
33
+ list = material.list_all_items.inject({}) do |h, path|
34
+ h[path] = workshop.real_path material.name, path
35
+ h
36
+ end
37
+ listing[material.name] = list
38
+ listing
39
+ end
40
+ File.write @listing_file, JSON.pretty_generate(@listing)
41
+ end
39
42
 
40
- def write_listing(workshop)
41
- @assets = workshop.materials.values.inject({}) do |listing, material|
42
- list = material.list_all_items.inject({}) do |h, path|
43
- h[path] = workshop.real_path material.name, path, true
44
- h
43
+ def each_listed_asset(workshop)
44
+ @listing.each do |asset_type, list|
45
+ list.each do |path, real_path|
46
+ yield workshop[asset_type, path], real_path, workshop.material(asset_type)
47
+ end
45
48
  end
46
- listing[material.name.to_sym] = list
47
- listing
48
49
  end
49
- File.write @listing_file, JSON.pretty_generate(@assets)
50
- end
51
50
 
51
+ end
52
52
  end
@@ -0,0 +1,31 @@
1
+ module Gluey
2
+ module AssetRetrieving
3
+ MARK_PARSER = %r_^[^\.]+\.(?:([a-f0-9]{32})\.)?\w+$_
4
+
5
+ def real_path(asset_type, path)
6
+ list = @listing[asset_type]
7
+ raise ::Gluey::ListingError.new("Asset type #{asset_type} is not defined!") unless list
8
+
9
+ real_path = list[path]
10
+ raise ::Gluey::ListingError.new("Unknown asset: #{path}, type=#{asset_type}!") unless real_path
11
+
12
+ real_path
13
+ end
14
+
15
+ def fetch(asset_type, path, mark=nil)
16
+ extant_path = real_path asset_type, path
17
+ return unless mark == extant_path.match(MARK_PARSER)[1]
18
+
19
+ file = "#{assets_path}/#{asset_type}/#{extant_path}"
20
+ file if File.exists? file
21
+
22
+ rescue ::Gluey::ListingError
23
+ nil
24
+ end
25
+
26
+ def assets_path
27
+ @assets_path ||= "#{root}/public#{path_prefix}"
28
+ end
29
+
30
+ end
31
+ end
@@ -1,87 +1,40 @@
1
1
  require 'digest'
2
- require_relative '../gluey'
3
- require_relative 'url'
4
-
5
- require_relative 'exceptions/item_not_listed'
6
-
7
- require_relative 'material'
8
- require_relative 'glues/base'
9
-
10
- class Gluey::Workshop
11
- include Gluey::Url
12
-
13
- attr_reader :root_path, :tmp_path, :materials, :cache
14
- attr_accessor :base_url
15
-
16
- def initialize(root, tmp_dir='tmp/gluey')
17
- @root_path = root
18
- @tmp_path = "#{root}/#{tmp_dir}"
19
- Dir.mkdir @tmp_path unless Dir.exists? @tmp_path
20
- @materials = {}
21
- @cache = {}
22
- end
23
-
24
- def register_material(name, glue=::Gluey::Glues::Base, &block)
25
- name = name.to_sym
26
- material = ::Gluey::Material.new name, glue, self, &block
27
- material.items << :any if material.items.empty?
28
- @materials[name] = material
29
- end
30
-
31
- def fetch_file(material, path)
32
- # check cache
33
- cache_key = chache_asset_key material, path
34
- file, dependencies = @cache[cache_key]
35
- if file && File.exists?(file) && !dependencies.any?{|d| d.changed?}
36
- return file
2
+ require_relative 'workshop/material'
3
+ require_relative 'workshop/glues/base'
4
+ require_relative 'workshop/asset_processing'
5
+
6
+ module Gluey
7
+ class Workshop < Environment
8
+ include ::Gluey::AssetProcessing
9
+
10
+ attr_reader :cache_path, :cache, :materials
11
+
12
+ def initialize(root, cache_path='tmp/gluey', **opts, &block)
13
+ super opts.merge!(
14
+ root: root,
15
+ cache_path: "#{root}/#{cache_path}",
16
+ materials: {},
17
+ cache: {}
18
+ ), &block
19
+ FileUtils.mkdir_p @cache_path
37
20
  end
38
21
 
39
- # prepare for processing
40
- material = @materials[material.to_sym]
41
- base_file = material.find_base_file path
42
- file = "#{@tmp_path}/#{path}.#{material.asset}"
43
- dependencies = [::Gluey::Dependencies::SingleFile.new(base_file).actualize]
44
- # process
45
- glue = material.glue.new self, material
46
- FileUtils.mkdir_p file[0..(file.rindex('/')-1)]
47
- glue.make file, base_file, dependencies
22
+ def material(name)
23
+ @materials[name.to_sym] || raise(UnregisteredMaterial.new "Unknown material #{name}.")
24
+ end
48
25
 
49
- # save and return
50
- @cache[cache_key] = [file, dependencies]
51
- file
52
- end
26
+ def register_material(name, glue=::Gluey::Glues::Base, &block)
27
+ name = name.to_sym
28
+ raise "Material #{name} already registered!" if @materials[name]
53
29
 
54
- def real_path(material, path, digest_mark=false)
55
- material = @materials[material.to_sym]
56
- file = material.find_base_file path
57
- unless material.is_listed? path, file
58
- raise ::Gluey::ItemNotListed.new("#{material.to_s} doesn't have enlisted item #{path} (file=#{file}).")
59
- end
60
- if digest_mark
61
- fetch_file material.name, path
62
- cache_key = chache_asset_key material.name, path
63
- file, dependencies = @cache[cache_key]
64
- digested_mark = Digest::MD5.new.digest dependencies.map(&:mark).join
65
- "#{path}.#{Digest.hexencode digested_mark}.#{material.asset}"
66
- else
67
- "#{path}.#{material.asset}"
30
+ material = ::Gluey::Material.new name, glue, self, &block
31
+ material.items << :any if material.items.empty?
32
+ @materials[name] = material
68
33
  end
69
- end
70
34
 
71
- def try_real_path(path)
72
- path.match /^(.+)\.(?:[a-f0-9]{32}\.)(\w+)$/ do |m|
73
- yield m[1], m[2]
35
+ def get_binding
36
+ binding
74
37
  end
75
- end
76
38
 
77
- def get_binding
78
- binding
79
39
  end
80
-
81
- private
82
-
83
- def chache_asset_key(material, path)
84
- "lump:#{material}:#{path}"
85
- end
86
-
87
40
  end
@@ -0,0 +1,52 @@
1
+ module Gluey
2
+ module AssetProcessing
3
+
4
+ def fetch(material, path, mark=nil)
5
+ material = material.is_a?(::Gluey::Material) ? material : self.material(material)
6
+ raise("Unknown material #{material}!") unless material
7
+ cache_key = "lump:#{material}:#{path}"
8
+
9
+ # check cache
10
+ file, dependencies = @cache[cache_key]
11
+ if file && File.exists?(file) && !dependencies.any?{|d| d.changed?}
12
+ return file, dependencies
13
+ end
14
+
15
+ # make / remake
16
+ file, dependencies = make_asset material, path
17
+ cache[cache_key] = [file, dependencies]
18
+ return file, dependencies
19
+ end
20
+
21
+ def real_path(material_name, path)
22
+ material = self.material material_name
23
+
24
+ file = material.find_base_file path
25
+ unless material.is_listed? path, file
26
+ msg = "#{material.to_s} doesn't have enlisted item #{path} (#{file})."
27
+ raise ::Gluey::ListingError.new(msg)
28
+ end
29
+
30
+ if mark_versions
31
+ _, dependencies = fetch material, path
32
+ digested_mark = Digest::MD5.new.digest dependencies.map(&:mark).join
33
+ "#{path}.#{Digest.hexencode digested_mark}.#{material.asset_extension}"
34
+ else
35
+ "#{path}.#{material.asset_extension}"
36
+ end
37
+ end
38
+
39
+ def make_asset(material, path)
40
+ # prepare for processing
41
+ base_file = material.find_base_file path
42
+ file = "#{cache_path}/#{path}.#{material.asset_extension}"
43
+ dependencies = [::Gluey::Dependencies::SingleFile.new(base_file).actualize]
44
+ # process
45
+ glue = material.glue.new self, material
46
+ FileUtils.mkdir_p file[0..(file.rindex('/')-1)]
47
+ glue.make file, base_file, dependencies
48
+ return file, dependencies
49
+ end
50
+
51
+ end
52
+ end
@@ -5,7 +5,7 @@ module Gluey::Dependencies
5
5
  class Handlebars_bundle < SingleFile
6
6
 
7
7
  def initialize(dir, logical_path, context)
8
- tmp_dir = "#{context.tmp_path}/.texts_bundle"
8
+ tmp_dir = "#{context.cache_path}/.texts_bundle"
9
9
  Dir.mkdir tmp_dir unless Dir.exists? tmp_dir
10
10
  @cache_path = "#{tmp_dir}/#{logical_path.gsub '/', '-'}"
11
11
  Dir.mkdir @cache_path unless Dir.exists? @cache_path
@@ -12,7 +12,7 @@ module Gluey::Dependencies
12
12
  }
13
13
 
14
14
  def initialize(dir, logical_path, context)
15
- tmp_dir = "#{context.tmp_path}/.texts_bundle"
15
+ tmp_dir = "#{context.cache_path}/.texts_bundle"
16
16
  Dir.mkdir tmp_dir unless Dir.exists? tmp_dir
17
17
  @cache_path = "#{tmp_dir}/#{logical_path.gsub '/', '-'}"
18
18
  Dir.mkdir @cache_path unless Dir.exists? @cache_path
@@ -22,10 +22,12 @@ module Gluey::Glues
22
22
  end
23
23
 
24
24
  def self.load(name, *addons_names)
25
- require_relative name
26
- addons_names.flatten.each{|an| require_relative "#{name}/#{an}_addons" }
25
+ glue = File.expand_path("../#{name}", __FILE__)
26
+ require glue
27
+ addons_names.flatten.each{|an| require "#{glue}/#{an}_addons" }
28
+ ::Gluey::Glues.const_get name.split('_').map(&:capitalize).join
27
29
  rescue LoadError => e
28
- raise e.message
30
+ raise "#{e.message}\n -- missing dependency? (are you using Gemfile?)"
29
31
  end
30
32
 
31
33
  end
@@ -31,23 +31,22 @@ module Gluey::Glues
31
31
  @output = "(function(){\n#{@output}\n}())"
32
32
  end
33
33
 
34
- end
35
-
36
- def pre_replace_with_texts_bundle(args)
37
- dir = File.expand_path("../#{args[1]}", @base_file)
38
- raise "cannot find relative path #{args[1]} for script=#{@base_file}" unless dir && Dir.exists?(dir)
39
-
40
- logical_path = dir[/(?:^#{@context.root_path}\/)?(.+)$/, 1]
41
- key = "dep:txt_bundle:#{logical_path}:#{@material.name}"
42
- hb_dep = @context.cache[key]
43
- unless hb_dep
44
- hb_dep = ::Gluey::Dependencies::TextsBundle.new dir, logical_path, @context
45
- @context.cache[key] = hb_dep
34
+ def pre_replace_with_texts_bundle(args)
35
+ dir = File.expand_path("../#{args[1]}", @base_file)
36
+ raise "cannot find relative path #{args[1]} for script=#{@base_file}" unless dir && Dir.exists?(dir)
37
+
38
+ logical_path = dir[/(?:^#{@context.root}\/)?(.+)$/, 1]
39
+ key = "dep:txt_bundle:#{logical_path}:#{@material.name}"
40
+ hb_dep = @context.cache[key]
41
+ unless hb_dep
42
+ hb_dep = ::Gluey::Dependencies::TextsBundle.new dir, logical_path, @context
43
+ @context.cache[key] = hb_dep
44
+ end
45
+
46
+ hb_dep.actualize if hb_dep.changed?
47
+ @dependencies << hb_dep
48
+ @script.gsub! /"%#{args[0]}%"/, File.read(hb_dep.file)
46
49
  end
47
50
 
48
- hb_dep.actualize if hb_dep.changed?
49
- @dependencies << hb_dep
50
- @script.gsub! /"%#{args[0]}%"/, File.read(hb_dep.file)
51
51
  end
52
-
53
52
  end
@@ -7,7 +7,7 @@ module Gluey::Glues
7
7
  dir = File.expand_path("../#{args[1]}", @base_file)
8
8
  raise "cannot find dir containing handlebars templates for script=#{@base_file}" unless dir && Dir.exists?(dir)
9
9
 
10
- logical_path = dir[/(?:^#{@context.root_path}\/)?(.+)$/, 1]
10
+ logical_path = dir[/(?:^#{@context.root}\/)?(.+)$/, 1]
11
11
  key = "dep:hb_bundle:#{logical_path}:#{@material.name}"
12
12
  hb_dep = @context.cache[key]
13
13
  unless hb_dep
@@ -0,0 +1,19 @@
1
+ require 'uglifier'
2
+
3
+ module Gluey::Glues
4
+ class JsScript < Script
5
+
6
+ def self.set_uglifier_options(**opts)
7
+ @uglifier_options = {copyright: :none}.merge! opts
8
+ end
9
+
10
+ def self.uglifier
11
+ @uglifier ||= ::Uglifier.new(@uglifier_options || set_uglifier_options)
12
+ end
13
+
14
+ def process(base_file, deps)
15
+ JsScript.uglifier.compile super
16
+ end
17
+
18
+ end
19
+ end
@@ -1,18 +1,20 @@
1
1
  require 'sass'
2
2
  require_relative 'script'
3
- require_relative '../dependencies/single_file'
4
3
 
5
4
  module Gluey::Glues
6
5
  class Sass < Script
7
6
 
7
+ class << self
8
+ attr_accessor :engine_opts
9
+ end
10
+ self.engine_opts = {line_comments: true}
11
+
8
12
  def process(base_file, deps)
9
- opts = {
10
- syntax: @material.file_extension.to_sym,
13
+ opts = self.class.engine_opts.merge syntax: @material.file_extension.to_sym,
11
14
  load_paths: [File.expand_path('..', base_file)],
12
- cache_store: ::Sass::CacheStores::Filesystem.new("#{@context.tmp_path}/.sass"),
13
- filename: base_file,
14
- line_comments: true
15
- }
15
+ cache_store: ::Sass::CacheStores::Filesystem.new("#{@context.cache_path}/.sass"),
16
+ filename: base_file
17
+
16
18
  engine = ::Sass::Engine.new super(base_file, deps), opts
17
19
  output = engine.render
18
20
 
@@ -64,13 +64,13 @@ module Gluey::Glues
64
64
  end
65
65
 
66
66
  def get_nested_piece(file)
67
- path = file[/(?:^#{@context.root_path}\/)?(.+)$/, 1]
67
+ path = file[/(?:^#{@context.root}\/)?(.+)$/, 1]
68
68
  key = "script_piece:#{@material.name}:#{path}"
69
69
  cache_file, dependencies = @context.cache[key]
70
70
  return cache_file, dependencies if cache_file && File.exists?(cache_file) && !dependencies.any?{|dep| dep.changed?}
71
71
 
72
72
  glue = self.class.new @context, @material
73
- cache_dir = "#{@context.tmp_path}/.script"
73
+ cache_dir = "#{@context.cache_path}/.script"
74
74
  Dir.mkdir cache_dir unless Dir.exists? cache_dir
75
75
  cache_file = "#{cache_dir}/#{path}.#{@material.name}"
76
76
  dependencies = [::Gluey::Dependencies::SingleFile.new(file).actualize]
@@ -1,27 +1,25 @@
1
- require_relative 'exceptions/file_not_found'
2
1
 
3
2
  class Gluey::Material
4
3
 
5
4
  attr_reader :name, :glue, :paths, :items
6
- attr_accessor :asset, :file_extension, :public_dir
5
+ attr_accessor :asset_extension, :file_extension
7
6
 
8
7
  def initialize(name, glue, context)
9
8
  @name = name.to_sym
10
9
  @glue = glue
11
10
  @context = context
12
- @asset = name.to_s
13
- @paths = []
14
- @items = []
15
- yield self if block_given?
16
- @file_extension ||= @asset.dup
17
- end
18
11
 
19
- def add_path(path)
20
- @paths << path
12
+ set({asset_extension: name.to_s, paths: [], items: []})
13
+ yield self if block_given?
14
+ @file_extension ||= @asset_extension.dup
21
15
  end
22
16
 
23
- def add_item(declaration)
24
- @items << declaration
17
+ def set(**opts)
18
+ allowed_options = %i(paths items asset_extension file_extension)
19
+ opts.each do |k, value|
20
+ next unless allowed_options.include? k
21
+ instance_variable_set "@#{k}", value
22
+ end
25
23
  end
26
24
 
27
25
  def is_listed?(path, file)
@@ -71,7 +69,7 @@ class Gluey::Material
71
69
  private
72
70
 
73
71
  def full_paths
74
- @paths.map{|p| "#{@context.root_path}/#{p}"}
72
+ @paths.map{|p| "#{@context.root}/#{p}"}
75
73
  end
76
74
 
77
75
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gluey
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.7
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - doooby
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-10 00:00:00.000000000 Z
11
+ date: 2015-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,25 +52,27 @@ files:
52
52
  - Rakefile
53
53
  - gluey.gemspec
54
54
  - lib/gluey.rb
55
- - lib/gluey/dependencies/directory.rb
56
- - lib/gluey/dependencies/handlebars_bundle.rb
57
- - lib/gluey/dependencies/single_file.rb
58
- - lib/gluey/dependencies/texts_bundle.rb
59
- - lib/gluey/exceptions/file_not_found.rb
60
- - lib/gluey/exceptions/item_not_listed.rb
61
- - lib/gluey/glues/base.rb
62
- - lib/gluey/glues/copy.rb
63
- - lib/gluey/glues/js_script.rb
64
- - lib/gluey/glues/js_script/handlebars_addons.rb
65
- - lib/gluey/glues/sass.rb
66
- - lib/gluey/glues/script.rb
67
- - lib/gluey/material.rb
68
- - lib/gluey/tools/local_build.rb
69
- - lib/gluey/tools/tools.rb
70
- - lib/gluey/url.rb
71
- - lib/gluey/version.rb
55
+ - lib/gluey/base/environment.rb
56
+ - lib/gluey/base/exceptions.rb
57
+ - lib/gluey/base/rack_mountable.rb
58
+ - lib/gluey/base/version.rb
59
+ - lib/gluey/tools/local_make.rb
72
60
  - lib/gluey/warehouse.rb
61
+ - lib/gluey/warehouse/asset_retrieving.rb
73
62
  - lib/gluey/workshop.rb
63
+ - lib/gluey/workshop/asset_processing.rb
64
+ - lib/gluey/workshop/dependencies/directory.rb
65
+ - lib/gluey/workshop/dependencies/handlebars_bundle.rb
66
+ - lib/gluey/workshop/dependencies/single_file.rb
67
+ - lib/gluey/workshop/dependencies/texts_bundle.rb
68
+ - lib/gluey/workshop/glues/base.rb
69
+ - lib/gluey/workshop/glues/copy.rb
70
+ - lib/gluey/workshop/glues/js_script.rb
71
+ - lib/gluey/workshop/glues/js_script/handlebars_addons.rb
72
+ - lib/gluey/workshop/glues/js_script/uglifier_addons.rb
73
+ - lib/gluey/workshop/glues/sass.rb
74
+ - lib/gluey/workshop/glues/script.rb
75
+ - lib/gluey/workshop/material.rb
74
76
  homepage:
75
77
  licenses:
76
78
  - MIT
@@ -1,4 +0,0 @@
1
- module Gluey
2
- class FileNotFound < StandardError
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module Gluey
2
- class ItemNotListed < StandardError
3
- end
4
- end
@@ -1,86 +0,0 @@
1
- require_relative 'tools'
2
-
3
- module Gluey::Tools
4
-
5
- def self.build_into_public_dir(workshop, warehouse, public_dir='public/assets', **builders)
6
- public_dirs = workshop.materials.values.inject({}) do |h, m|
7
- h[m.name] = "#{workshop.root_path}/#{m.public_dir || public_dir}"
8
- h
9
- end
10
-
11
- built = []
12
- move_it = -> (cache_file, file) { FileUtils.mv cache_file, file }
13
- self.each_asset_file workshop, warehouse do |cache_file, type, path|
14
- file = "#{public_dirs[type]}/#{path}"
15
- next if File.exists? file
16
- FileUtils.mkdir_p file[0..(file.rindex('/')-1)]
17
- (builders[type] || move_it)[cache_file, file]
18
- built << file
19
- puts "created #{file}"
20
- end
21
- return built
22
- end
23
-
24
- def self.clear_public_dir(workshop, warehouse, versions=2, public_dir='public/assets')
25
- public_dirs = workshop.materials.values.inject({}) do |h, m|
26
- h[m.name] = "#{workshop.root_path}/#{m.public_dir || public_dir}"
27
- h
28
- end
29
-
30
- # process existing files into assets
31
- eas_regexp = /^#{workshop.root_path}\/(.+)$/
32
- assets = public_dirs.values.uniq.map{|dir| Dir["#{dir}/**/*.*.*"]}.flatten.
33
- map{|f| Asset.try_create f[eas_regexp, 1]}.compact
34
- assets = assets.inject({}){|h, asset| (h[asset.path] ||= []) << asset; h }
35
-
36
- # items not on list
37
- on_list = []
38
- warehouse.assets.each do |type, mater_assets|
39
- mater_assets.each do |_, real_path|
40
- file = "#{public_dirs[type]}/#{real_path}"
41
- asset = Asset.try_create file[eas_regexp, 1]
42
- on_list << asset
43
- end
44
- end
45
- on_list.map! &:path
46
- assets.delete_if do |path, asseets_arr|
47
- unless on_list.include? path
48
- asseets_arr.each do |some_asset|
49
- file = "#{workshop.root_path}/#{some_asset.orig_path}"
50
- File.delete file
51
- puts "deleted unknown #{file}"
52
- end
53
- true
54
- end
55
- false
56
- end
57
-
58
- # older versions
59
- assets.values.select{|arr| arr.length > versions}.
60
- map{|arr| arr.sort.slice 0..(-versions-1) }.compact.flatten.each do |old_asset|
61
- file = "#{workshop.root_path}/#{old_asset.orig_path}"
62
- File.delete file
63
- puts "deleted old #{file}"
64
- end
65
- end
66
-
67
- class Asset < Struct.new(:path, :time_stamp)
68
-
69
- def self.try_create(file)
70
- file.match /^([^\.]+)\.(\d+)\.(\w+)$/ do |m|
71
- new "#{m[1]}.#{m[3]}", m[2]
72
- end
73
- end
74
-
75
- def <=>(other)
76
- time_stamp <=> other.time_stamp
77
- end
78
-
79
- def orig_path
80
- ret = path.dup
81
- ret.insert ret.rindex('.'), ".#{time_stamp}"
82
- end
83
-
84
- end
85
-
86
- end
@@ -1,19 +0,0 @@
1
- require 'gluey/warehouse'
2
-
3
- module Gluey::Tools
4
-
5
- def self.each_asset_file(workshop, warehouse)
6
- warehouse.assets.each do |type, assets|
7
- assets.each do |path, real_path|
8
- cache_file = workshop.fetch_file type, path
9
- yield cache_file, type, real_path
10
- end
11
- end
12
- end
13
-
14
- def self.create_uglifier_builder(**opts)
15
- require 'uglifier'
16
- ->(a, b){File.write b, ::Uglifier.new(opts.merge! copyright: :none).compile(File.read a)}
17
- end
18
-
19
- end
@@ -1,9 +0,0 @@
1
- module Gluey::Url
2
-
3
- attr_accessor :base_url
4
-
5
- def asset_url(material, path, mark=false)
6
- "#{base_url}/#{material}/#{real_path material, path, mark}"
7
- end
8
-
9
- end
@@ -1,3 +0,0 @@
1
- module Gluey
2
- VERSION = '0.2.7'
3
- end