bootscale 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f2615cfa3045596f9aa3a2bd9c21f1b3e1717d89
4
- data.tar.gz: b45f97e35aa436245231cc881b5a0358bcfcbaae
3
+ metadata.gz: 08516aaf7096d27483c2fb2585ccfcb8e391621b
4
+ data.tar.gz: f60f2071672f182b20fb27b0d198d4b5ea9e0f1a
5
5
  SHA512:
6
- metadata.gz: e28f7899d153123d7aa14f7099c2fda813389aecb19767f16f1bab7bd0720784e98b64421f3c423e5027b20d78629e7f0cddecf5129467b18de40715d703c537
7
- data.tar.gz: b90f7ed719bd071bac1ad8519030490437759b36fb6bbfa83796247d82bd3499cf87c18867089ac0025256a41205a863a0395bdee48e05094d0ca7a143833326
6
+ metadata.gz: a6671a28791b4c9f0876c5fd944798b72d9530c8d094768ea81bf217048100826854ed61edb6a046131188a6db40f692bfbf7d28f1078b647b047a183bbe5ac2
7
+ data.tar.gz: ab3afc79b67b5935522f84327565ce460912a88c9b0ad7047079072b647617a09695535687053ce28db6ef5d120a5c40004f13a0129616cc0c4b0016b334848a
data/README.md CHANGED
@@ -14,7 +14,14 @@ And then execute:
14
14
 
15
15
  $ bundle
16
16
 
17
- Then you need to add `require 'bootscale'` right after `require 'bundler/setup'`.
17
+ Then you need to add right after `require 'bundler/setup'`:
18
+
19
+ ```ruby
20
+ require 'bundler/setup'
21
+ require 'bootscale'
22
+ Bootscale.setup(cache_directory: '/path/to/cache/directory')
23
+ ```
24
+
18
25
  If your application is a Rails application, you will find this in `config/boot.rb`.
19
26
 
20
27
  ### Important
@@ -46,3 +53,4 @@ but for bigger applications (300+ gems) it can make the application boot up to 3
46
53
 
47
54
  Bug reports and pull requests are welcome on GitHub at https://github.com/byroot/bootscale.
48
55
 
56
+ Thanks to Aaron Patterson for the idea of converting relative paths to absolute paths.
data/bootscale.gemspec CHANGED
@@ -17,5 +17,7 @@ Gem::Specification.new do |spec|
17
17
  spec.bindir = 'exe'
18
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
19
  spec.require_paths = ['lib']
20
+
20
21
  spec.required_ruby_version = '>= 1.9.3'
22
+ spec.add_runtime_dependency 'msgpack', '~> 0.6.2'
21
23
  end
@@ -0,0 +1,14 @@
1
+ module Bootscale
2
+ class CacheBuilder
3
+ attr_reader :entries
4
+
5
+ def initialize
6
+ @entries = {}
7
+ end
8
+
9
+ def generate(load_path)
10
+ ordered_entries = load_path.map { |path| entries.fetch(path) { entries[path] = Entry.new(path) } }
11
+ Hash[ordered_entries.reverse.flat_map(&:features)]
12
+ end
13
+ end
14
+ end
@@ -1,13 +1,9 @@
1
1
  module Bootscale
2
- DL_EXTENSIONS = [
3
- RbConfig::CONFIG['DLEXT'],
4
- RbConfig::CONFIG['DLEXT2'],
5
- ].reject(&:empty?).map { |ext| ".#{ext}"}
6
-
7
- DOT_SO = '.so'.freeze
8
- DOT_RB = '.rb'.freeze
9
-
10
2
  class Entry
3
+ DL_EXTENSIONS = [
4
+ RbConfig::CONFIG['DLEXT'],
5
+ RbConfig::CONFIG['DLEXT2'],
6
+ ].reject(&:empty?).map { |ext| ".#{ext}"}
11
7
  FEATURE_FILES = "**/*{#{DOT_RB},#{DL_EXTENSIONS.join(',')}}"
12
8
  NORMALIZE_NATIVE_EXTENSIONS = !DL_EXTENSIONS.include?(DOT_SO)
13
9
  ALTERNATIVE_NATIVE_EXTENSIONS_PATTERN = /\.(o|bundle|dylib)\z/
@@ -0,0 +1,24 @@
1
+ require 'digest/md5'
2
+ require 'msgpack'
3
+
4
+ module Bootscale
5
+ class FileStorage
6
+ def initialize(directory)
7
+ @directory = directory
8
+ end
9
+
10
+ def load(load_path)
11
+ path = cache_path(load_path)
12
+ MessagePack.load(File.read(path)) if File.exist?(path)
13
+ end
14
+
15
+ def dump(load_path, cache)
16
+ File.open(cache_path(load_path), 'wb+') { |f| f.write(MessagePack.dump(cache)) }
17
+ end
18
+
19
+ def cache_path(load_path)
20
+ hash = Digest::MD5.hexdigest((load_path + [RUBY_VERSION, Bootscale::VERSION, MessagePack::VERSION]).join('|'))
21
+ File.join(@directory, "bootscale-#{hash}.msgpack")
22
+ end
23
+ end
24
+ end
@@ -1,6 +1,6 @@
1
1
  module Kernel
2
2
  def require_with_cache(path)
3
- require_without_cache(Bootscale[path])
3
+ require_without_cache(Bootscale[path] || path)
4
4
  end
5
5
 
6
6
  alias_method :require_without_cache, :require
@@ -9,7 +9,7 @@ end
9
9
 
10
10
  class << Kernel
11
11
  def require_with_cache(path)
12
- require_without_cache(Bootscale[path])
12
+ require_without_cache(Bootscale[path] || path)
13
13
  end
14
14
 
15
15
  alias_method :require_without_cache, :require
@@ -18,7 +18,7 @@ end
18
18
 
19
19
  class Module
20
20
  def autoload_with_cache(const, path)
21
- autoload_without_cache(const, Bootscale[path])
21
+ autoload_without_cache(const, Bootscale[path] || path)
22
22
  end
23
23
 
24
24
  alias_method :autoload_without_cache, :autoload
@@ -1,3 +1,3 @@
1
1
  module Bootscale
2
- VERSION = '0.1.1'
2
+ VERSION = '0.2.0'
3
3
  end
data/lib/bootscale.rb CHANGED
@@ -1,21 +1,60 @@
1
1
  require_relative 'bootscale/version'
2
- require_relative 'bootscale/entry'
3
- require_relative 'bootscale/cache'
4
2
 
5
3
  module Bootscale
4
+ DOT_SO = '.so'.freeze
5
+ DOT_RB = '.rb'.freeze
6
+
6
7
  class << self
7
8
  def [](path)
8
- cache[path.to_s] || path
9
+ path = path.to_s
10
+ if path.end_with?(DOT_RB) || path.end_with?(DOT_SO)
11
+ cache[path]
12
+ else
13
+ cache["#{path}#{DOT_RB}"] || cache["#{path}#{DOT_SO}"]
14
+ end
15
+ end
16
+
17
+ def setup(options = {})
18
+ self.cache_directory = options[:cache_directory]
19
+ require_relative 'bootscale/setup'
20
+ regenerate
9
21
  end
10
22
 
11
23
  def regenerate
12
- cache.regenerate
24
+ @cache = load_cache || save_cache(cache_builder.generate($LOAD_PATH))
13
25
  end
14
26
 
15
27
  def cache
16
- @cache ||= Cache.new
28
+ @cache ||= {}
29
+ end
30
+
31
+ def cache_builder
32
+ @cache_builder ||= CacheBuilder.new
33
+ end
34
+
35
+ def load_cache
36
+ return unless storage
37
+ storage.load($LOAD_PATH)
38
+ end
39
+
40
+ def save_cache(cache)
41
+ return cache unless storage
42
+ storage.dump($LOAD_PATH, cache)
43
+ cache
44
+ end
45
+
46
+ attr_accessor :storage
47
+
48
+ def cache_directory=(directory)
49
+ if directory
50
+ require_relative 'bootscale/file_storage'
51
+ self.storage = FileStorage.new(directory)
52
+ else
53
+ self.storage = nil
54
+ end
17
55
  end
18
56
  end
19
57
  end
20
58
 
21
- require_relative 'bootscale/setup'
59
+ require_relative 'bootscale/entry'
60
+ require_relative 'bootscale/cache_builder'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bootscale
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean Boussier
@@ -9,7 +9,21 @@ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
11
  date: 2015-08-23 00:00:00.000000000 Z
12
- dependencies: []
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: msgpack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.6.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.6.2
13
27
  description: Inspired by Aaron Patterson's talk on the subject
14
28
  email:
15
29
  - jean.boussier@gmail.com
@@ -26,8 +40,9 @@ files:
26
40
  - bin/setup
27
41
  - bootscale.gemspec
28
42
  - lib/bootscale.rb
29
- - lib/bootscale/cache.rb
43
+ - lib/bootscale/cache_builder.rb
30
44
  - lib/bootscale/entry.rb
45
+ - lib/bootscale/file_storage.rb
31
46
  - lib/bootscale/setup.rb
32
47
  - lib/bootscale/version.rb
33
48
  homepage: https://github.com/byroot/bootscale
@@ -1,25 +0,0 @@
1
- require 'benchmark'
2
-
3
- module Bootscale
4
- class Cache
5
- attr_reader :entries
6
-
7
- def initialize
8
- @entries = {}
9
- regenerate
10
- end
11
-
12
- def [](path)
13
- if path.end_with?(DOT_RB) || path.end_with?(DOT_SO)
14
- @cache[path]
15
- else
16
- @cache["#{path}#{DOT_RB}"] || @cache["#{path}#{DOT_SO}"]
17
- end
18
- end
19
-
20
- def regenerate
21
- ordered_entries = $LOAD_PATH.map { |path| entries.fetch(path) { entries[path] = Entry.new(path) } }
22
- @cache = Hash[ordered_entries.reverse.flat_map(&:features)]
23
- end
24
- end
25
- end