gluey 0.2.7 → 0.3.3

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.
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