require_reloader 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -69,6 +69,8 @@ This gem is forked from Colin Young's [gem_reloader](https://github.com/colinyou
69
69
 
70
70
  ## Changelog
71
71
 
72
+ - v0.1.5: properly guess top-level module name based on gem name
73
+ pattern, only watch git repo if it's local.
72
74
  - v0.1.4: remove 'vendor/gems' from watchable_dirs & autoload_paths, as local gem path is already specified in Gemfile.
73
75
  - v0.1.3: Skip reload local gem if it's itself; added integration tests.
74
76
  - v0.1.2: Minor rephrase on gem's description and summary.
@@ -1,5 +1,6 @@
1
1
  require "require_reloader/version"
2
2
  require "require_reloader/railtie"
3
+ require "require_reloader/helper"
3
4
 
4
5
  module RequireReloader
5
6
  class << self
@@ -34,6 +35,7 @@ module RequireReloader
34
35
  gem = gem_name.to_s
35
36
  watchable_dir = expanded_gem_path(gem, opts[:path])
36
37
  watchable_exts = opts[:exts] ? Array(opts[:exts]) : [:rb]
38
+ helper = Helper.new
37
39
 
38
40
  app = Object.const_get(Rails.application.class.parent_name)
39
41
  app::Application.configure do
@@ -45,8 +47,7 @@ module RequireReloader
45
47
  # based on Tim Cardenas's solution:
46
48
  # http://timcardenas.com/automatically-reload-gems-in-rails-327-on-eve
47
49
  ActionDispatch::Callbacks.to_prepare do
48
- klass = gem.classify
49
- Object.send(:remove_const, klass) if Object.const_defined?(klass)
50
+ helper.remove_module_if_defined(gem)
50
51
  $".delete_if {|s| s.include?(gem)}
51
52
  require gem
52
53
  end
@@ -61,9 +62,11 @@ module RequireReloader
61
62
  local_gem ? File.expand_path(local_gem[:path]) : false
62
63
  end
63
64
 
65
+ # returns only local gems, local git repo
64
66
  def local_gems
65
67
  Bundler.definition.specs.
66
68
  select{|s| s.source.is_a?(Bundler::Source::Path) }.
69
+ delete_if{|s| s.source.is_a?(Bundler::Source::Git) && !s.source.send(:local?) }.
67
70
  map{|s| {:name => s.name, :path => s.source.path.to_s} }
68
71
  end
69
72
  end
@@ -0,0 +1,80 @@
1
+ module RequireReloader
2
+ # Methods copied from latest ActiveSupport::Inflector to support
3
+ # older Rails versions (e.g. 3.0) without these methods.
4
+ module ActionPackInfectorMethods
5
+ def deconstantize(path)
6
+ path.to_s[0...(path.rindex('::') || 0)] # implementation based on the one in facets' Module#spacename
7
+ end
8
+
9
+ def constantize(camel_cased_word)
10
+ names = camel_cased_word.split('::')
11
+ names.shift if names.empty? || names.first.empty?
12
+
13
+ constant = Object
14
+ names.each do |name|
15
+ constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
16
+ end
17
+ constant
18
+ end
19
+
20
+ def const_regexp(camel_cased_word) #:nodoc:
21
+ parts = camel_cased_word.split("::")
22
+ last = parts.pop
23
+
24
+ parts.reverse.inject(last) do |acc, part|
25
+ part.empty? ? acc : "#{part}(::#{acc})?"
26
+ end
27
+ end
28
+
29
+ def demodulize(path)
30
+ path = path.to_s
31
+ if i = path.rindex('::')
32
+ path[(i+2)..-1]
33
+ else
34
+ path
35
+ end
36
+ end
37
+
38
+ def safe_constantize(camel_cased_word)
39
+ begin
40
+ constantize(camel_cased_word)
41
+ rescue NameError => e
42
+ raise unless e.message =~ /(uninitialized constant|wrong constant name) #{const_regexp(camel_cased_word)}$/ ||
43
+ e.name.to_s == camel_cased_word.to_s
44
+ rescue ArgumentError => e
45
+ raise unless e.message =~ /not missing constant #{const_regexp(camel_cased_word)}\!$/
46
+ end
47
+ end
48
+ end
49
+
50
+ class Helper
51
+ include ActionPackInfectorMethods
52
+
53
+ def remove_module_if_defined(gem_name)
54
+ full_name = full_qualified_name(gem_name)
55
+ remove_module(full_name) if module_defined?(full_name)
56
+ end
57
+
58
+ def module_defined?(full_name)
59
+ !!safe_constantize(full_name)
60
+ end
61
+
62
+ def remove_module(full_name)
63
+ module_namespace = deconstantize(full_name)
64
+ module_name = demodulize(full_name)
65
+ parent_module = module_namespace == "" ? Object : constantize(module_namespace)
66
+ parent_module.send(:remove_const, module_name)
67
+ end
68
+
69
+ def full_qualified_name(gem_name)
70
+ return nil unless gem_name
71
+ gem_name.split("-").map{|token| camelcase(token)}.join("::")
72
+ end
73
+
74
+ def camelcase(str)
75
+ str.split("_").map{|token| token.capitalize }.join("")
76
+ end
77
+
78
+ end
79
+
80
+ end
@@ -1,3 +1,3 @@
1
1
  module RequireReloader
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.5"
3
3
  end
@@ -14,4 +14,6 @@ Gem::Specification.new do |gem|
14
14
  gem.name = "require_reloader"
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = RequireReloader::VERSION
17
+
18
+ gem.add_development_dependency "minitest"
17
19
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: require_reloader
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,8 +10,24 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-01-19 00:00:00.000000000 Z
14
- dependencies: []
13
+ date: 2013-01-30 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: minitest
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
15
31
  description: Auto-reload require files or local gems without restarting server during
16
32
  Rails development.
17
33
  email:
@@ -27,6 +43,7 @@ files:
27
43
  - README.md
28
44
  - Rakefile
29
45
  - lib/require_reloader.rb
46
+ - lib/require_reloader/helper.rb
30
47
  - lib/require_reloader/railtie.rb
31
48
  - lib/require_reloader/version.rb
32
49
  - require_reloader.gemspec