dassets 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +56 -2
- data/bin/dassets +7 -0
- data/dassets.gemspec +9 -3
- data/lib/dassets/asset_file.rb +65 -0
- data/lib/dassets/cli.rb +109 -0
- data/lib/dassets/digests_file.rb +70 -0
- data/lib/dassets/root_path.rb +12 -0
- data/lib/dassets/runner/cache_command.rb +46 -0
- data/lib/dassets/runner/digest_command.rb +65 -0
- data/lib/dassets/runner.rb +42 -0
- data/lib/dassets/server/request.rb +48 -0
- data/lib/dassets/server/response.rb +36 -0
- data/lib/dassets/server.rb +37 -0
- data/lib/dassets/version.rb +1 -1
- data/lib/dassets.rb +32 -2
- data/test/helper.rb +3 -1
- data/test/support/app/assets/.digests +4 -0
- data/test/support/app/assets/public/file1.txt +1 -0
- data/test/support/app/assets/public/file2.txt +1 -0
- data/test/support/app/assets/public/grumpy_cat.jpg +0 -0
- data/test/support/app/assets/public/nested/file3.txt +0 -0
- data/test/support/app.rb +10 -0
- data/test/support/app_public/.gitkeep +0 -0
- data/test/support/config/assets.rb +7 -0
- data/test/support/example.digests +3 -0
- data/test/support/public/file1-daa05c683a4913b268653f7a7e36a5b4.txt +1 -0
- data/test/support/public/file2-9bbe1047cffbb590f59e0e5aeff46ae4.txt +1 -0
- data/test/support/public/grumpy_cat-b0d1f399a916f7a25c4c0f693c619013.jpg +0 -0
- data/test/support/public/nested/file3-d41d8cd98f00b204e9800998ecf8427e.txt +0 -0
- data/test/system/rack_tests.rb +78 -0
- data/test/unit/asset_file_tests.rb +76 -0
- data/test/unit/config_tests.rb +27 -0
- data/test/unit/dassets_tests.rb +49 -0
- data/test/unit/digests_file_tests.rb +90 -0
- data/test/unit/runner/cache_command_tests.rb +62 -0
- data/test/unit/runner/digest_command_tests.rb +83 -0
- data/test/unit/runner_tests.rb +29 -0
- data/test/unit/server/request_tests.rb +76 -0
- data/test/unit/server/response_tests.rb +70 -0
- data/test/unit/server_tests.rb +17 -0
- metadata +130 -10
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            file1.txt
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            file2.txt
         | 
| Binary file | 
| 
            File without changes
         | 
    
        data/test/support/app.rb
    ADDED
    
    
| 
            File without changes
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            file1.txt
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            file2.txt
         | 
| Binary file | 
| 
            File without changes
         | 
| @@ -0,0 +1,78 @@ | |
| 1 | 
            +
            require 'assert'
         | 
| 2 | 
            +
            require 'assert-rack-test'
         | 
| 3 | 
            +
            require 'test/support/app'
         | 
| 4 | 
            +
            require 'dassets/server'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module Dassets
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              class RackTests < Assert::Context
         | 
| 9 | 
            +
                include Assert::Rack::Test
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                desc "the middleware in a rack app"
         | 
| 12 | 
            +
                setup do
         | 
| 13 | 
            +
                  Dassets.init
         | 
| 14 | 
            +
                  app.use Dassets::Server
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
                teardown do
         | 
| 17 | 
            +
                  Dassets.reset
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def app
         | 
| 21 | 
            +
                  @app ||= SinatraApp
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              class SuccessTests < RackTests
         | 
| 27 | 
            +
                desc "requesting an existing asset file"
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                should "return a successful response" do
         | 
| 30 | 
            +
                  resp = get '/file1-daa05c683a4913b268653f7a7e36a5b4.txt'
         | 
| 31 | 
            +
                  assert_equal 200, resp.status
         | 
| 32 | 
            +
                  assert_equal Dassets['/file1.txt'].content, resp.body
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                should "return a successful response with no body on HEAD requests" do
         | 
| 36 | 
            +
                  resp = head '/file2-9bbe1047cffbb590f59e0e5aeff46ae4.txt'
         | 
| 37 | 
            +
                  assert_equal 200, resp.status
         | 
| 38 | 
            +
                  assert_equal Dassets['/file2.txt'].size.to_s, resp.headers['Content-Length']
         | 
| 39 | 
            +
                  assert_empty resp.body
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              class NotModifiedTests < RackTests
         | 
| 45 | 
            +
                desc "requesting an existing asset file that has not been modified"
         | 
| 46 | 
            +
                setup do
         | 
| 47 | 
            +
                  @resp = get('/file1-daa05c683a4913b268653f7a7e36a5b4.txt', {}, {
         | 
| 48 | 
            +
                    'HTTP_IF_MODIFIED_SINCE' => Dassets['/file1.txt'].mtime.to_s
         | 
| 49 | 
            +
                  })
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                should "return a successful response" do
         | 
| 53 | 
            +
                  assert_equal 304, @resp.status
         | 
| 54 | 
            +
                  assert_empty @resp.body
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
              class NotFoundTests < RackTests
         | 
| 60 | 
            +
                desc "requesting an non-existing asset file"
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                should "return a not found response" do
         | 
| 63 | 
            +
                  resp = get '/file1-daa05c683a4913b268.txt'
         | 
| 64 | 
            +
                  assert_equal 404, resp.status
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  get '/file1-.txt'
         | 
| 67 | 
            +
                  assert_equal 404, resp.status
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                  get '/file1.txt'
         | 
| 70 | 
            +
                  assert_equal 404, resp.status
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                  get '/something-not-found'
         | 
| 73 | 
            +
                  assert_equal 404, resp.status
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
              end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
            end
         | 
| @@ -0,0 +1,76 @@ | |
| 1 | 
            +
            require 'assert'
         | 
| 2 | 
            +
            require 'dassets/asset_file'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            class Dassets::AssetFile
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              class BaseTests < Assert::Context
         | 
| 7 | 
            +
                desc "Dassets::AssetFile"
         | 
| 8 | 
            +
                setup do
         | 
| 9 | 
            +
                  @asset_file = Dassets::AssetFile.new('file1.txt', 'abc123')
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
                subject{ @asset_file }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                should have_cmeths :from_abs_path
         | 
| 14 | 
            +
                should have_readers :path, :md5, :dirname, :extname, :basename
         | 
| 15 | 
            +
                should have_readers :files_path, :cache_path, :href
         | 
| 16 | 
            +
                should have_imeth :content, :mtime, :size, :mime_type, :exists?, :==
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                should "know its given path and md5" do
         | 
| 19 | 
            +
                  assert_equal 'file1.txt', subject.path
         | 
| 20 | 
            +
                  assert_equal 'abc123', subject.md5
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                should "know its dirname, extname, and basename" do
         | 
| 24 | 
            +
                  assert_equal '.',     subject.dirname
         | 
| 25 | 
            +
                  assert_equal '.txt',  subject.extname
         | 
| 26 | 
            +
                  assert_equal 'file1', subject.basename
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                should "build it's files_path from the path" do
         | 
| 30 | 
            +
                  assert_equal "#{Dassets.config.files_path}/file1.txt", subject.files_path
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  nested = Dassets::AssetFile.new('nested/file1.txt', 'abc123')
         | 
| 33 | 
            +
                  assert_equal "#{Dassets.config.files_path}/nested/file1.txt", nested.files_path
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                should "build it's cache_path from the path and the md5" do
         | 
| 37 | 
            +
                  assert_equal "file1-abc123.txt", subject.cache_path
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  nested = Dassets::AssetFile.new('nested/file1.txt', 'abc123')
         | 
| 40 | 
            +
                  assert_equal "nested/file1-abc123.txt", nested.cache_path
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                should "build it's href from the cache path" do
         | 
| 44 | 
            +
                  assert_equal "/file1-abc123.txt", subject.href
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                  nested = Dassets::AssetFile.new('nested/file1.txt', 'abc123')
         | 
| 47 | 
            +
                  assert_equal "/nested/file1-abc123.txt", nested.href
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                should "be created from absolute file paths and have md5 computed" do
         | 
| 51 | 
            +
                  abs_file_path = File.join(Dassets.config.files_path, 'file1.txt')
         | 
| 52 | 
            +
                  exp_md5 = 'daa05c683a4913b268653f7a7e36a5b4'
         | 
| 53 | 
            +
                  file = Dassets::AssetFile.from_abs_path(abs_file_path)
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  assert_equal 'file1.txt', file.path
         | 
| 56 | 
            +
                  assert_equal exp_md5, file.md5
         | 
| 57 | 
            +
                end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                should "know it's content, mtime, size, mime_type, and if it exists" do
         | 
| 60 | 
            +
                  assert_equal "file1.txt\n", subject.content
         | 
| 61 | 
            +
                  assert_equal File.mtime(subject.files_path).httpdate, subject.mtime
         | 
| 62 | 
            +
                  assert_equal File.size?(subject.files_path), subject.size
         | 
| 63 | 
            +
                  assert_equal "text/plain", subject.mime_type
         | 
| 64 | 
            +
                  assert subject.exists?
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  null_file = Dassets::AssetFile.new('', '')
         | 
| 67 | 
            +
                  assert_nil null_file.content
         | 
| 68 | 
            +
                  assert_nil null_file.mtime
         | 
| 69 | 
            +
                  assert_nil null_file.size
         | 
| 70 | 
            +
                  assert_nil null_file.mime_type
         | 
| 71 | 
            +
                  assert_not null_file.exists?
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
              end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
            end
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            require 'assert'
         | 
| 2 | 
            +
            require 'ns-options/assert_macros'
         | 
| 3 | 
            +
            require 'dassets'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            class Dassets::Config
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              class BaseTests < Assert::Context
         | 
| 8 | 
            +
                include NsOptions::AssertMacros
         | 
| 9 | 
            +
                desc "Dassets::Config"
         | 
| 10 | 
            +
                subject{ Dassets::Config }
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                should have_option  :root_path, Pathname, :required => true
         | 
| 13 | 
            +
                should have_options :files_path, :digests_file_path
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                should "should use `apps/assets/public` as the default files path" do
         | 
| 16 | 
            +
                  exp_path = Dassets.config.root_path.join("app/assets/public").to_s
         | 
| 17 | 
            +
                  assert_equal exp_path, subject.files_path
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                should "should use `app/assets/.digests` as the default digests file path" do
         | 
| 21 | 
            +
                  exp_path = Dassets.config.root_path.join("app/assets/.digests").to_s
         | 
| 22 | 
            +
                  assert_equal exp_path, subject.digests_file_path
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            end
         | 
| @@ -0,0 +1,49 @@ | |
| 1 | 
            +
            require 'assert'
         | 
| 2 | 
            +
            require 'fileutils'
         | 
| 3 | 
            +
            require 'dassets'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Dassets
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              class BaseTests < Assert::Context
         | 
| 8 | 
            +
                desc "Dassets"
         | 
| 9 | 
            +
                subject{ Dassets }
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                should have_imeths :config, :configure, :init, :digests, :[]
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                should "return its `Config` class with the `config` method" do
         | 
| 14 | 
            +
                  assert_same Config, subject.config
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                should "read/parse the digests on init" do
         | 
| 18 | 
            +
                  subject.reset
         | 
| 19 | 
            +
                  assert_empty subject.digests
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  subject.init
         | 
| 22 | 
            +
                  assert_not_empty subject.digests
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                should "return asset files given a their path using the index operator" do
         | 
| 26 | 
            +
                  subject.init
         | 
| 27 | 
            +
                  file = subject['nested/file3.txt']
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  assert_kind_of Dassets::AssetFile, file
         | 
| 30 | 
            +
                  assert_equal 'nested/file3.txt', file.path
         | 
| 31 | 
            +
                  assert_equal 'd41d8cd98f00b204e9800998ecf8427e', file.md5
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  subject.reset
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                should "return an asset file with no fingerprint if path not in digests" do
         | 
| 37 | 
            +
                  file = subject['path/not/found.txt']
         | 
| 38 | 
            +
                  assert_equal '', file.md5
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  subject.init
         | 
| 41 | 
            +
                  file = subject['path/not/found.txt']
         | 
| 42 | 
            +
                  assert_equal '', file.md5
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  subject.reset
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            end
         | 
| @@ -0,0 +1,90 @@ | |
| 1 | 
            +
            require 'assert'
         | 
| 2 | 
            +
            require 'fileutils'
         | 
| 3 | 
            +
            require 'dassets/digests_file'
         | 
| 4 | 
            +
            require 'dassets/asset_file'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            class Dassets::DigestsFile
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              class BaseTests < Assert::Context
         | 
| 9 | 
            +
                desc "Dassets::DigestsFile"
         | 
| 10 | 
            +
                setup do
         | 
| 11 | 
            +
                  @file_path = File.join(Dassets.config.root_path, 'example.digests')
         | 
| 12 | 
            +
                  @digests = Dassets::DigestsFile.new(@file_path)
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
                subject{ @digests }
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                should have_reader :path
         | 
| 17 | 
            +
                should have_imeths :asset_files, :asset_file, :to_hash, :save!
         | 
| 18 | 
            +
                should have_imeths :[], :[]=, :delete, :each, :keys, :values, :empty?
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                should "know its path" do
         | 
| 21 | 
            +
                  assert_equal @file_path, subject.path
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                should "know its asset files" do
         | 
| 25 | 
            +
                  assert_equal subject.keys.size, subject.asset_files.size
         | 
| 26 | 
            +
                  assert_kind_of Dassets::AssetFile, subject.asset_files.first
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                should "get a specific asset file from its data" do
         | 
| 30 | 
            +
                  file = subject.asset_file('/path/to/file1')
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  assert_kind_of Dassets::AssetFile, file
         | 
| 33 | 
            +
                  assert_equal '/path/to/file1', file.path
         | 
| 34 | 
            +
                  assert_equal subject['/path/to/file1'], file.md5
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                should "know whether it is empty or not" do
         | 
| 38 | 
            +
                  assert_not_empty subject
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                should "read values with the index operator" do
         | 
| 42 | 
            +
                  assert_equal 'abc123', subject['/path/to/file1']
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                should "write values with the index operator" do
         | 
| 46 | 
            +
                  subject['/path/to/test'] = 'testytest'
         | 
| 47 | 
            +
                  assert_equal 'testytest', subject['/path/to/test']
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                should "remove values with the delete method" do
         | 
| 51 | 
            +
                  assert_includes '/path/to/file1', subject.keys
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  subject.delete '/path/to/file1'
         | 
| 54 | 
            +
                  assert_not_includes '/path/to/file1', subject.keys
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                should "know its hash representation" do
         | 
| 58 | 
            +
                  exp_hash = {
         | 
| 59 | 
            +
                    "/path/to/file1" => "abc123",
         | 
| 60 | 
            +
                    "/path/to/file2" => "123abc",
         | 
| 61 | 
            +
                    "/path/to/file3" => "a1b2c3"
         | 
| 62 | 
            +
                  }
         | 
| 63 | 
            +
                  subject_to_hash = subject.to_hash
         | 
| 64 | 
            +
                  subject_internal_hash = subject.instance_variable_get("@hash")
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  assert_equal exp_hash, subject_to_hash
         | 
| 67 | 
            +
                  assert_not_equal subject_internal_hash.object_id, subject_to_hash.object_id
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
              end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
              class SaveTests < BaseTests
         | 
| 73 | 
            +
                desc "on save"
         | 
| 74 | 
            +
                setup do
         | 
| 75 | 
            +
                  FileUtils.mv(@file_path, "#{@file_path}.bak")
         | 
| 76 | 
            +
                end
         | 
| 77 | 
            +
                teardown do
         | 
| 78 | 
            +
                  FileUtils.mv("#{@file_path}.bak", @file_path)
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                should "write out the digests to the path" do
         | 
| 82 | 
            +
                  assert_not_file_exists subject.path
         | 
| 83 | 
            +
                  subject.save!
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                  assert_file_exists subject.path
         | 
| 86 | 
            +
                end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
              end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
            end
         | 
| @@ -0,0 +1,62 @@ | |
| 1 | 
            +
            require 'assert'
         | 
| 2 | 
            +
            require 'fileutils'
         | 
| 3 | 
            +
            require 'dassets/runner/cache_command'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            class Dassets::Runner::CacheCommand
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              class BaseTests < Assert::Context
         | 
| 8 | 
            +
                desc "Dassets::Runner::CacheCommand"
         | 
| 9 | 
            +
                setup do
         | 
| 10 | 
            +
                  @cache_root_path = File.join(Dassets.config.root_path, 'public')
         | 
| 11 | 
            +
                  FileUtils.mkdir_p @cache_root_path
         | 
| 12 | 
            +
                  @cmd = Dassets::Runner::CacheCommand.new(@cache_root_path)
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
                teardown do
         | 
| 15 | 
            +
                  # FileUtils.rm_rf @cache_root_path
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
                subject{ @cmd }
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                should have_readers :files_root_path, :cache_root_path, :digests_file, :asset_files
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                should "use the config's files path and its files root path" do
         | 
| 22 | 
            +
                  assert_equal Dassets.config.files_path, subject.files_root_path.to_s
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                should "know its given cache root path" do
         | 
| 26 | 
            +
                  assert_equal @cache_root_path, subject.cache_root_path.to_s
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                should "know it's digests file" do
         | 
| 30 | 
            +
                  assert_kind_of Dassets::DigestsFile, subject.digests_file
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                should "get it's asset files from the digests file" do
         | 
| 34 | 
            +
                  assert_equal 4, subject.digests_file.keys.size
         | 
| 35 | 
            +
                  assert_equal 4, subject.asset_files.size
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                should "use AssetFile objs for the asset files" do
         | 
| 39 | 
            +
                  assert_kind_of Dassets::AssetFile, subject.asset_files.first
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              class RunTests < BaseTests
         | 
| 45 | 
            +
                desc "on run"
         | 
| 46 | 
            +
                setup do
         | 
| 47 | 
            +
                  FileUtils.rm_rf(@cache_root_path)
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                should "create the cache root and write the cache files" do
         | 
| 51 | 
            +
                  assert_not_file_exists @cache_root_path.to_s
         | 
| 52 | 
            +
                  subject.run
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  assert_file_exists @cache_root_path.to_s
         | 
| 55 | 
            +
                  subject.asset_files.each do |file|
         | 
| 56 | 
            +
                    assert_file_exists File.join(@cache_root_path, file.cache_path)
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
            end
         | 
| @@ -0,0 +1,83 @@ | |
| 1 | 
            +
            require 'assert'
         | 
| 2 | 
            +
            require 'fileutils'
         | 
| 3 | 
            +
            require 'dassets/runner/digest_command'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            class Dassets::Runner::DigestCommand
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              class BaseTests < Assert::Context
         | 
| 8 | 
            +
                desc "Dassets::Runner::DigestCommand"
         | 
| 9 | 
            +
                setup do
         | 
| 10 | 
            +
                  @cmd = Dassets::Runner::DigestCommand.new([])
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
                subject{ @cmd }
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                should have_instance_methods :asset_files, :digests_file, :run
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                should "know it's digests file" do
         | 
| 17 | 
            +
                  assert_kind_of Dassets::DigestsFile, subject.digests_file
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                should "get it's asset files from the config path by default" do
         | 
| 21 | 
            +
                  assert_equal 4, subject.asset_files.size
         | 
| 22 | 
            +
                  assert_equal 4, subject.digests_file.keys.size
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                should "get it's asset files from the args if passed" do
         | 
| 26 | 
            +
                  path_string = File.join(Dassets.config.files_path, 'file*')
         | 
| 27 | 
            +
                  digest_cmd  = Dassets::Runner::DigestCommand.new([path_string])
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  assert_equal 2, digest_cmd.asset_files.size
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                should "use AssetFile objs for the asset files" do
         | 
| 33 | 
            +
                  assert_kind_of Dassets::AssetFile, subject.asset_files.first
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              class RunTests < BaseTests
         | 
| 39 | 
            +
                desc "on run"
         | 
| 40 | 
            +
                setup do
         | 
| 41 | 
            +
                  @cmd.run
         | 
| 42 | 
            +
                  @addfile = 'addfile.txt'
         | 
| 43 | 
            +
                  @rmfile  = 'file1.txt'
         | 
| 44 | 
            +
                  @updfile = 'file2.txt'
         | 
| 45 | 
            +
                  @addfile_path = File.join(File.join(Dassets.config.files_path, @addfile))
         | 
| 46 | 
            +
                  @rmfile_path  = File.join(File.join(Dassets.config.files_path, @rmfile))
         | 
| 47 | 
            +
                  @updfile_path = File.join(File.join(Dassets.config.files_path, @updfile))
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                  @rmfilecontents   = File.read(@rmfile_path)
         | 
| 50 | 
            +
                  @updfilecontents  = File.read(@updfile_path)
         | 
| 51 | 
            +
                  @orig_updfile_md5 = subject.digests_file[@updfile]
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  FileUtils.touch @addfile_path
         | 
| 54 | 
            +
                  FileUtils.rm @rmfile_path
         | 
| 55 | 
            +
                  File.open(@updfile_path, "w+"){ |f| f.write('an update') }
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
                teardown do
         | 
| 58 | 
            +
                  File.open(@updfile_path, "w"){ |f| f.write @updfilecontents }
         | 
| 59 | 
            +
                  File.open(@rmfile_path,  "w"){ |f| f.write @rmfilecontents }
         | 
| 60 | 
            +
                  FileUtils.rm @addfile_path
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                should "update the digests_file on run" do
         | 
| 64 | 
            +
                  assert_equal 4, subject.digests_file.keys.size
         | 
| 65 | 
            +
                  assert_not_includes @addfile, subject.digests_file.keys
         | 
| 66 | 
            +
                  assert_includes @rmfile, subject.digests_file.keys
         | 
| 67 | 
            +
                  assert_equal @orig_updfile_md5, subject.digests_file[@updfile]
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                  # recreate the cmd to reload asset files
         | 
| 70 | 
            +
                  @cmd = Dassets::Runner::DigestCommand.new([])
         | 
| 71 | 
            +
                  # run without writing the file
         | 
| 72 | 
            +
                  subject.run(false)
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                  # see the add, update and removal
         | 
| 75 | 
            +
                  assert_equal 4, subject.digests_file.keys.size
         | 
| 76 | 
            +
                  assert_includes @addfile, subject.digests_file.keys
         | 
| 77 | 
            +
                  assert_not_includes @rmfile, subject.digests_file.keys
         | 
| 78 | 
            +
                  assert_not_equal @orig_updfile_md5, subject.digests_file[@updfile]
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
              end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
            end
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            require 'assert'
         | 
| 2 | 
            +
            require 'pathname'
         | 
| 3 | 
            +
            require 'dassets/runner'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            class Dassets::Runner
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              class BaseTests < Assert::Context
         | 
| 8 | 
            +
                desc "Dassets::Runner"
         | 
| 9 | 
            +
                setup do
         | 
| 10 | 
            +
                  @runner = Dassets::Runner.new(['null', 1, 2], 'some' => 'opts')
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
                subject{ @runner }
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                should have_readers :cmd_name, :cmd_args, :opts
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                should "know its cmd, cmd_args, and opts" do
         | 
| 17 | 
            +
                  assert_equal 'null', subject.cmd_name
         | 
| 18 | 
            +
                  assert_equal [1,2],  subject.cmd_args
         | 
| 19 | 
            +
                  assert_equal 'opts', subject.opts['some']
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                should "complain about unknown cmds" do
         | 
| 23 | 
            +
                  runner = Dassets::Runner.new(['unknown'], {})
         | 
| 24 | 
            +
                  assert_raises(UnknownCmdError) { runner.run }
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            end
         | 
| @@ -0,0 +1,76 @@ | |
| 1 | 
            +
            require 'assert'
         | 
| 2 | 
            +
            require 'dassets/server/request'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            class Dassets::Server::Request
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              class BaseTests < Assert::Context
         | 
| 7 | 
            +
                desc "Dassets::Server::Request"
         | 
| 8 | 
            +
                setup do
         | 
| 9 | 
            +
                  Dassets.init
         | 
| 10 | 
            +
                  @req = file_request('GET', '/file1-daa05c683a4913b268653f7a7e36a5b4.txt')
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
                teardown do
         | 
| 13 | 
            +
                  Dassets.reset
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
                subject{ @req }
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                should have_imeths :for_asset_file?, :asset_path, :asset_file
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                should "know its asset_path" do
         | 
| 20 | 
            +
                  assert_equal 'file1.txt', subject.asset_path
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                should "know its asset_file" do
         | 
| 24 | 
            +
                  assert_equal Dassets['file1.txt'], subject.asset_file
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                should "know if it is for an asset file" do
         | 
| 28 | 
            +
                  # find nested path with matching md5
         | 
| 29 | 
            +
                  req = file_request('GET', '/nested/file3-d41d8cd98f00b204e9800998ecf8427e.txt')
         | 
| 30 | 
            +
                  assert req.for_asset_file?
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  # find not nested path with matching md5
         | 
| 33 | 
            +
                  req = file_request('HEAD', '/file1-daa05c683a4913b268653f7a7e36a5b4.txt')
         | 
| 34 | 
            +
                  assert req.for_asset_file?
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  # find even if md5 is *not* matching - just need to have any md5
         | 
| 37 | 
            +
                  req = file_request('GET', '/file1-d41d8cd98f00b204e9800998ecf8427e.txt')
         | 
| 38 | 
            +
                  assert req.for_asset_file?
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  # no find on invalid md5
         | 
| 41 | 
            +
                  req = file_request('GET', '/file1-daa05c683a4913b268653f7a7e36a.txt')
         | 
| 42 | 
            +
                  assert_not req.for_asset_file?
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  # no find on missing md5
         | 
| 45 | 
            +
                  req = file_request('HEAD', '/file1.txt')
         | 
| 46 | 
            +
                  assert_not req.for_asset_file?
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                  # no find on unknown file
         | 
| 49 | 
            +
                  req = file_request('GET', '/some-file.txt')
         | 
| 50 | 
            +
                  assert_not req.for_asset_file?
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  # no find on unknown file with an md5
         | 
| 53 | 
            +
                  req = file_request('GET', '/some-file-daa05c683a4913b268653f7a7e36a5b4.txt')
         | 
| 54 | 
            +
                  assert_not req.for_asset_file?
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                should "return an asset path and an empty asset file if request not for asset file" do
         | 
| 58 | 
            +
                  req = file_request('GET', '/some-file.txt')
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                  assert_equal '', req.asset_path
         | 
| 61 | 
            +
                  assert_equal Dassets::AssetFile.new('', ''), req.asset_file
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                protected
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                def file_request(method, path_info)
         | 
| 67 | 
            +
                  require 'dassets/server/request'
         | 
| 68 | 
            +
                  Dassets::Server::Request.new({
         | 
| 69 | 
            +
                    'REQUEST_METHOD' => method,
         | 
| 70 | 
            +
                    'PATH_INFO'      => path_info
         | 
| 71 | 
            +
                  })
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
              end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
            end
         |