hairballs 0.1.1 → 0.1.2

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: d1465ffb77e5a3cca642251d686e9a764ece6c02
4
- data.tar.gz: 5cb9166c6199254d83dab384669178216a554680
3
+ metadata.gz: 9b451d9dca035b8a31711f51857d34261b6289a1
4
+ data.tar.gz: 7e9a82d17a90212e503183b3218fb7abba4d051c
5
5
  SHA512:
6
- metadata.gz: 2653b127751f63dd739dc0fe08fe088b89fe5f798c7d0658ea29aefb73278647ad2bd8ea5eea7d1088c5bb5e66c88c6ea48ff6cd75346ba6f59e8dee144c1ef8
7
- data.tar.gz: 27bdc77f19a8737921fd7f0e6649b24d33beb67c140a2a250b56539a130122e7f7a40994c64ef85f942a10fd6ab949711d988ea370f86c6d520d5fc473e91b03
6
+ metadata.gz: 94b9f0bd9412d2f17f2eb9e138298a9e02538c4c26e250856dc8c4de8a2c93fa7b5837a73d7c24a35cdcc3363d371da7e84f941fdb66ab637b8a37851a5e1ffc
7
+ data.tar.gz: ab973a795b79ab3b37e62fdbd45842a39b1a84754b3922d8c66f9566bba03221c7e7fec7350bad057ee11afa3629c37e673d04cf847783ce4f14a82a9866bbe3
data/.gitignore CHANGED
@@ -12,3 +12,5 @@
12
12
  *.o
13
13
  *.a
14
14
  mkmf.log
15
+
16
+ tags
data/.rubocop.yml ADDED
@@ -0,0 +1,24 @@
1
+ Metrics/MethodLength:
2
+ Max: 20
3
+
4
+ Style/AsciiComments:
5
+ Enabled: false
6
+
7
+ Style/ClassCheck:
8
+ Exclude:
9
+ - lib/hairballs/plugin.rb
10
+ - lib/hairballs/plugins/object_ri.rb
11
+
12
+ Style/Documentation:
13
+ Exclude:
14
+ - lib/hairballs/version.rb
15
+
16
+ Style/DotPosition:
17
+ Enabled: false
18
+
19
+ Style/RescueModifier:
20
+ Exclude:
21
+ - lib/hairballs/plugins/colorize_json.rb
22
+
23
+ Style/SpaceAroundEqualsInParameterDefault:
24
+ Enabled: false
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - ruby-2.2.0
data/History.md CHANGED
@@ -1,3 +1,15 @@
1
+ ### 0.1.2 / 2015-04-13
2
+
3
+ * Improvements
4
+ * Used Rubocop for static analysis and clean-up.
5
+ * Started running tests on travis-ci.
6
+ * Bug Fixes
7
+ * [#4](https://github.com/turboladen/hairballs/issues/4) Fixed installing of
8
+ missing plugin/theme dependencies.
9
+ * [#5](https://github.com/turboladen/hairballs/issues/5) Fixed bad use of
10
+ `Hairballs.project_name` everywhere.
11
+ * Fixed bad link to my .irbrc in the README.
12
+
1
13
  ### 0.1.1 / 2015-04-06
2
14
 
3
15
  * Bug Fixes
data/README.md CHANGED
@@ -185,7 +185,7 @@ Check out the Hairballs::Plugin docs and existing plugins under
185
185
  lib/hairballs/plugins/ for more details and ideas.
186
186
 
187
187
  I've got my `.irbrc` (using Hairballs) stored on the interwebs
188
- [here](https://github.com/turboladen/config_files/blob/master/.irbrc) if
188
+ [here](https://github.com/turboladen/config_files/blob/master/ruby/irbrc) if
189
189
  that's of any help or interest.
190
190
 
191
191
  But whyyyy?
data/Rakefile CHANGED
@@ -2,3 +2,5 @@ require 'bundler/gem_tasks'
2
2
  require 'rspec/core/rake_task'
3
3
 
4
4
  RSpec::Core::RakeTask.new
5
+
6
+ task default: :spec
data/lib/hairballs.rb CHANGED
@@ -6,28 +6,28 @@ require 'hairballs/configuration'
6
6
  class Hairballs
7
7
  # @return [Hairballs::Configuration]
8
8
  def self.config
9
- @@config ||= Hairballs::Configuration.new
9
+ @config ||= Hairballs::Configuration.new
10
10
  end
11
11
 
12
12
  class << self
13
13
  extend Forwardable
14
14
 
15
15
  def_delegators :config,
16
- :themes,
17
- :add_theme,
18
- :current_theme,
19
- :use_theme,
16
+ :themes,
17
+ :add_theme,
18
+ :current_theme,
19
+ :use_theme,
20
20
 
21
- :plugins,
22
- :load_plugin,
23
- :loaded_plugins,
24
- :add_plugin,
21
+ :plugins,
22
+ :load_plugin,
23
+ :loaded_plugins,
24
+ :add_plugin,
25
25
 
26
- :completion_procs,
26
+ :completion_procs,
27
27
 
28
- :project_name,
29
- :project_root,
30
- :version,
31
- :rails?
28
+ :project_name,
29
+ :project_root,
30
+ :version,
31
+ :rails?
32
32
  end
33
33
  end
@@ -8,6 +8,8 @@ require 'hairballs/plugin'
8
8
  require 'hairballs/version'
9
9
 
10
10
  class Hairballs
11
+ # The base-level +Hairballs+ class maintains an object of this type, which
12
+ # contains the current configuration.
11
13
  class Configuration
12
14
  # @return [Array<Hairballs::Theme>]
13
15
  attr_reader :themes
@@ -54,14 +56,14 @@ class Hairballs
54
56
  #
55
57
  # @return [Boolean]
56
58
  def rails?
57
- ENV.has_key?('RAILS_ENV') || !!defined?(Rails)
59
+ ENV.key?('RAILS_ENV') || Kernel.const_defined?(:Rails)
58
60
  end
59
61
 
60
62
  # Name of the project, if it can be determined. If not, defaults to "irb".
61
63
  #
62
64
  # @return [String]
63
65
  def project_name
64
- @project_name ||= project_root ? project_root.basename : nil
66
+ @project_name ||= project_root ? project_root.basename.to_s : nil
65
67
  end
66
68
 
67
69
  # @return [Pathname]
@@ -96,7 +98,7 @@ class Hairballs
96
98
  # @param [Symbol] theme_name The name of the Theme to use/switch to.
97
99
  def use_theme(theme_name)
98
100
  switch_to = themes.find { |theme| theme.name == theme_name }
99
- fail ThemeUseFailure.new(theme_name) unless switch_to
101
+ fail ThemeUseFailure, theme_name unless switch_to
100
102
  vputs "Switched to theme: #{theme_name}"
101
103
 
102
104
  switch_to.use!
@@ -126,7 +128,7 @@ class Hairballs
126
128
  # @param plugin_name [Symbol]
127
129
  def load_plugin(plugin_name, **options)
128
130
  plugin_to_use = plugins.find { |plugin| plugin.name == plugin_name }
129
- fail PluginNotFound.new(plugin_name) unless plugin_to_use
131
+ fail PluginNotFound, plugin_name unless plugin_to_use
130
132
  vputs "Using plugin: #{plugin_name}"
131
133
 
132
134
  plugin_to_use.load!(options)
@@ -150,7 +152,7 @@ class Hairballs
150
152
  def root_by_git
151
153
  _stdin, stdout, _stderr = Open3.popen3('git rev-parse --show-toplevel')
152
154
  result = stdout.gets
153
-
155
+
154
156
  result.nil? ? nil : Pathname.new(result.strip)
155
157
  end
156
158
 
@@ -162,7 +164,11 @@ class Hairballs
162
164
  cwd.ascend do |dir|
163
165
  lib_dir = File.join(dir.to_s, 'lib')
164
166
 
165
- if dir.children.find { |c| c.to_s =~ /#{lib_dir}/ && File.exist?(lib_dir) }
167
+ child = dir.children.find do |c|
168
+ c.to_s =~ /#{lib_dir}/ && File.exist?(lib_dir)
169
+ end
170
+
171
+ if child
166
172
  root = Pathname.new(dir.to_s)
167
173
  break
168
174
  end
@@ -1,4 +1,5 @@
1
1
  class Hairballs
2
+ # Used when Hairballs tries to load a plugin, but the plugin cannot be found.
2
3
  class PluginNotFound < RuntimeError
3
4
  def initialize(plugin_name)
4
5
  message = "Plugin not found: :#{plugin_name}."
@@ -6,6 +7,8 @@ class Hairballs
6
7
  end
7
8
  end
8
9
 
10
+ # Used when Hairballs tries to load plugin, but the plugin could not be
11
+ # loaded.
9
12
  class PluginLoadFailure < RuntimeError
10
13
  def initialize(plugin_name)
11
14
  message = "Unable to load plugin: :#{plugin_name}."
@@ -13,6 +16,7 @@ class Hairballs
13
16
  end
14
17
  end
15
18
 
19
+ # Used when Hairballs tries to load theme, but the theme could not be loaded.
16
20
  class ThemeUseFailure < RuntimeError
17
21
  def initialize(theme_name)
18
22
  message = "Theme not found: :#{theme_name}."
@@ -1,3 +1,4 @@
1
+ # Adding #vputs.
1
2
  module Kernel
2
3
  # Does a puts only if IRB is in verbose mode.
3
4
  def vputs(*messages)
@@ -8,10 +8,10 @@ class Hairballs
8
8
  return @libraries if @libraries && libs.nil?
9
9
 
10
10
  @libraries = if libs
11
- libs
12
- else
13
- yield([])
14
- end
11
+ libs
12
+ else
13
+ yield([])
14
+ end
15
15
  end
16
16
 
17
17
  # Requires #libraries on load. If they're not installed, install them. If
@@ -19,25 +19,18 @@ class Hairballs
19
19
  def require_libraries
20
20
  return if @libraries.nil?
21
21
 
22
- @libraries.each do |lib|
23
- retry_count = 0
22
+ install_threads = []
23
+ require_threads = []
24
+ require_queue = Queue.new
24
25
 
26
+ @libraries.each do |lib|
25
27
  begin
26
- next if retry_count == 2
27
28
  vputs "Requiring library: #{lib}"
28
29
  require lib
29
30
  rescue LoadError
30
31
  puts "#{lib} not installed; installing now..."
31
- Gem.install lib
32
-
33
- if Hairballs.rails?
34
- installed_gem = find_latest_gem(lib)
35
- $LOAD_PATH.unshift("#{installed_gem}/lib")
36
- end
37
-
38
- require lib
39
- retry_count += 1
40
- retry
32
+ install_threads << start_install_thread(lib, require_queue)
33
+ require_threads << start_require_thread(require_queue)
41
34
  end
42
35
  end
43
36
  end
@@ -45,7 +38,7 @@ class Hairballs
45
38
  # Path to the highest version of the gem with the given gem.
46
39
  #
47
40
  # @param [String] gem_name
48
- # @return [String]
41
+ # @return [String] The path to the latest install of +gem_name+.
49
42
  def find_latest_gem(gem_name)
50
43
  the_gem = Dir.glob("#{Gem.dir}/gems/#{gem_name}-*")
51
44
 
@@ -84,5 +77,42 @@ class Hairballs
84
77
  vputs 'Bundler not defined. Skipping.'
85
78
  end
86
79
  end
80
+
81
+ #--------------------------------------------------------------------------
82
+ # Privates
83
+ #--------------------------------------------------------------------------
84
+
85
+ private
86
+
87
+ # @param [String] lib Gem to install.
88
+ # @param [Queue] require_queue Queue to push library names onto so the
89
+ # require thread can do its requiring.
90
+ # @return [Thread]
91
+ def start_install_thread(lib, require_queue)
92
+ Thread.new do
93
+ result = Gem.install(lib)
94
+
95
+ if result.empty?
96
+ puts "Unable to install gem '#{lib}'. Moving on..."
97
+ else
98
+ require_queue << lib
99
+ end
100
+ end
101
+ end
102
+
103
+ # @param [Queue] require_queue
104
+ # @return [Thread]
105
+ def start_require_thread(require_queue)
106
+ Thread.new do
107
+ lib = require_queue.pop
108
+
109
+ if Hairballs.config.rails?
110
+ installed_gem = find_latest_gem(lib)
111
+ $LOAD_PATH.unshift("#{installed_gem}/lib")
112
+ end
113
+
114
+ require lib
115
+ end.join
116
+ end
87
117
  end
88
118
  end
@@ -7,13 +7,13 @@ class Hairballs
7
7
  # be.
8
8
  #
9
9
  # One benefit of making a simple plugin for requiring other deps is
10
- # Hairballs::LibraryHelpers#require_libraries method. When used in conjunction with
11
- # Hairballs::LibraryHelpers#libraries, you don't have to worry about installing the
12
- # gems before using IRB. This is particularly helpful when using a Ruby
13
- # manager (RVM, rbenv, etc) and you install a new Ruby; if you don't think
14
- # ahead to install your IRB deps, your IRB session won't behave like you
15
- # want; well, not until you `exit` and fix the problem. This simple pattern
16
- # helps alleviate that small headache.
10
+ # Hairballs::LibraryHelpers#require_libraries method. When used in
11
+ # conjunction with Hairballs::LibraryHelpers#libraries, you don't have to
12
+ # worry about installing the gems before using IRB. This is particularly
13
+ # helpful when using a Ruby manager (RVM, rbenv, etc) and you install a new
14
+ # Ruby; if you don't think ahead to install your IRB deps, your IRB session
15
+ # won't behave like you want; well, not until you `exit` and fix the problem.
16
+ # This simple pattern helps alleviate that small headache.
17
17
  #
18
18
  # Next, Hairballs Plugins are lazily loaded; `require`ing their source files
19
19
  # doesn't mean the methods and such that you add there will do anything; it's
@@ -69,7 +69,7 @@ class Hairballs
69
69
  if @on_load.kind_of?(Proc)
70
70
  @on_load.call
71
71
  else
72
- fail PluginLoadFailure, self.name
72
+ fail PluginLoadFailure, name
73
73
  end
74
74
  end
75
75
  end
@@ -19,8 +19,10 @@ Hairballs.add_plugin(:colorize_json, color: :blue) do |plugin|
19
19
 
20
20
  if is_json
21
21
  vputs "[#{plugin.name}] Return value is JSON-like"
22
- printf @context.return_format,
23
- JSON.pretty_generate(JSON.parse(@context.last_value)).colorize(plugin.color)
22
+ the_json = JSON.pretty_generate(
23
+ JSON.parse(@context.last_value)
24
+ ).colorize(plugin.color)
25
+ printf @context.return_format, the_json
24
26
  else
25
27
  old_output_value
26
28
  end
@@ -1,6 +1,8 @@
1
1
  require 'hairballs'
2
2
 
3
- Hairballs.add_plugin(:irb_history, save_history: 1000, eval_history: 20, global_history_file: true) do |plugin|
3
+ Hairballs.add_plugin(:irb_history, save_history: 1000,
4
+ eval_history: 20,
5
+ global_history_file: true) do |plugin|
4
6
  plugin.libraries %w(irb/ext/save-history)
5
7
 
6
8
  plugin.on_load do
@@ -11,7 +13,7 @@ Hairballs.add_plugin(:irb_history, save_history: 1000, eval_history: 20, global_
11
13
  IRB.conf[:HISTORY_FILE] = "#{Dir.home}/.irb_history"
12
14
 
13
15
  if Hairballs.project_name
14
- IRB.conf[:HISTORY_FILE] << Hairballs.project_name.to_s
16
+ IRB.conf[:HISTORY_FILE] << Hairballs.project_name
15
17
  end
16
18
  end
17
19
 
@@ -12,7 +12,8 @@ require 'hairballs'
12
12
  # The +completion_append_character+ is really a Readline option that tells it
13
13
  # what to do when you tab-complete a term. It's set to not add anything to the
14
14
  # completed term, but you may find it suits you better to append a single space.
15
- Hairballs.add_plugin(:tab_completion_for_files, completion_append_character: nil) do |plugin|
15
+ Hairballs.add_plugin(:tab_completion_for_files,
16
+ completion_append_character: nil) do |plugin|
16
17
  plugin.on_load do
17
18
  Hairballs.completion_procs << proc do |string|
18
19
  Dir[string + '*'].grep(/^#{Regexp.escape(string)}/)
@@ -22,7 +23,7 @@ Hairballs.add_plugin(:tab_completion_for_files, completion_append_character: nil
22
23
  Hairballs.completion_procs << ::IRB::InputCompletor::CompletionProc
23
24
  end
24
25
 
25
- completion_proc = Proc.new do |string|
26
+ completion_proc = proc do |string|
26
27
  Hairballs.completion_procs.map do |proc|
27
28
  proc.call(string)
28
29
  end.flatten.uniq
@@ -17,12 +17,14 @@ Hairballs.add_theme(:turboladen) do |theme|
17
17
  else
18
18
  []
19
19
  end
20
+
21
+ libs_to_require
20
22
  end
21
23
 
22
24
  theme.prompt do |prompt|
23
25
  preface = proc do |status = ' '|
24
26
  if Hairballs.project_name
25
- "⟪#{Hairballs.project_name.to_s.light_blue}⟫#{status}%03n"
27
+ "⟪#{Hairballs.project_name.light_blue}⟫#{status}%03n"
26
28
  else
27
29
  "❨#{'irb'.light_blue}❩#{status}%03n"
28
30
  end
@@ -17,6 +17,8 @@ Hairballs.add_theme(:turboladen_rails) do |theme|
17
17
  else
18
18
  []
19
19
  end
20
+
21
+ libs_to_require
20
22
  end
21
23
 
22
24
  theme.extend_bundler = true
@@ -1,3 +1,4 @@
1
1
  class Hairballs
2
- VERSION = '0.1.1'
2
+ # @return [String]
3
+ VERSION = '0.1.2'
3
4
  end
@@ -97,7 +97,8 @@ RSpec.describe Hairballs::Configuration do
97
97
 
98
98
  context 'block given and name param is a Symbol' do
99
99
  before do
100
- expect(Hairballs::Plugin).to receive(:new).with(:test, {}).and_return plugin
100
+ expect(Hairballs::Plugin).to receive(:new).with(:test, {}).
101
+ and_return plugin
101
102
  end
102
103
 
103
104
  it 'yields the Plugin' do
@@ -165,22 +166,37 @@ RSpec.describe Hairballs::Configuration do
165
166
  end
166
167
 
167
168
  describe '.project_name' do
168
- subject { config.project_name }
169
- it { is_expected.to eq 'hairballs' }
170
- end
169
+ context '#project_root exists' do
170
+ let(:project_root) { Pathname.new('meow') }
171
+
172
+ before do
173
+ expect(subject).to receive(:project_root).and_return(project_root).
174
+ exactly(2).times
175
+ end
171
176
 
172
- describe '.project_root' do
173
- before do
174
- allow(Dir).to receive(:pwd).and_return '/meow/hairballs'
177
+ it 'is the name of the project root' do
178
+ expect(config.project_name).to eq 'meow'
179
+ end
175
180
  end
176
181
 
177
- subject { config.project_name }
182
+ context '#project_root does not exist' do
183
+ before { expect(subject).to receive(:project_root).and_return(nil) }
184
+
185
+ it 'is nil' do
186
+ expect(config.project_name).to be_nil
187
+ end
188
+ end
178
189
  end
179
190
 
180
191
  describe '.rails?' do
181
192
  subject { config.rails? }
182
193
 
183
194
  context 'not using Rails' do
195
+ before do
196
+ ENV.delete('RAILS_ENV')
197
+ Object.send(:remove_const, :Rails) if Kernel.const_defined? :Rails
198
+ end
199
+
184
200
  it { is_expected.to eq false }
185
201
  end
186
202
 
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'hairballs'
2
3
  require 'hairballs/library_helpers'
3
4
 
4
5
  RSpec.describe Hairballs::LibraryHelpers do
@@ -11,30 +12,30 @@ RSpec.describe Hairballs::LibraryHelpers do
11
12
  end
12
13
 
13
14
  it 'allows adding to the yielded array' do
14
- expect {
15
+ expect do
15
16
  subject.libraries do |libs|
16
17
  libs << 'meow'
17
18
  end
18
- }.to change { subject.instance_variable_get(:@libraries) }.
19
- from(nil).to(['meow'])
19
+ end.to change { subject.instance_variable_get(:@libraries) }.
20
+ from(nil).to(['meow'])
20
21
  end
21
22
  end
22
23
 
23
24
  context 'block not given' do
24
25
  it 'sets @libraries to the given param' do
25
- expect {
26
+ expect do
26
27
  subject.libraries(['meow'])
27
- }.to change { subject.instance_variable_get(:@libraries) }.
28
- from(nil).to(['meow'])
28
+ end.to change { subject.instance_variable_get(:@libraries) }.
29
+ from(nil).to(['meow'])
29
30
  end
30
31
  end
31
32
 
32
33
  context 'block AND param given' do
33
34
  it 'sets @libraries to the param value' do
34
- expect {
35
+ expect do
35
36
  subject.libraries(['meow'])
36
- }.to change { subject.instance_variable_get(:@libraries) }.
37
- from(nil).to(['meow'])
37
+ end.to change { subject.instance_variable_get(:@libraries) }.
38
+ from(nil).to(['meow'])
38
39
  end
39
40
  end
40
41
  end
@@ -47,18 +48,21 @@ RSpec.describe Hairballs::LibraryHelpers do
47
48
  end
48
49
 
49
50
  context '@libraries is not nil' do
51
+ let(:lib_name) { 'asdfqwer' }
52
+
50
53
  before do
51
- subject.instance_variable_set(:@libraries, %w(one))
54
+ subject.instance_variable_set(:@libraries, [lib_name])
52
55
  allow(subject).to receive(:vputs)
53
- Hairballs.define_singleton_method(:rails?) { nil }
54
56
  end
55
57
 
56
58
  context 'libraries are not installed' do
57
59
  it 'tries two times to require then Gem.install' do
58
- expect(subject).to receive(:require).with('one').exactly(2).times.and_raise LoadError
59
- expect(Gem).to receive(:install).with('one').exactly(1).times
60
+ expect(subject).to receive(:start_install_thread).
61
+ with(lib_name, instance_of(Queue))
62
+ expect(subject).to receive(:start_require_thread).
63
+ with(instance_of(Queue))
60
64
 
61
- expect { subject.require_libraries }.to raise_exception LoadError
65
+ subject.require_libraries
62
66
  end
63
67
  end
64
68
  end
@@ -69,4 +73,65 @@ RSpec.describe Hairballs::LibraryHelpers do
69
73
  expect(subject.find_latest_gem('rake')).to match %r{gems/rake}
70
74
  end
71
75
  end
76
+
77
+ describe '#start_install_thread' do
78
+ before { allow(Thread).to receive(:new).and_yield }
79
+ let(:require_queue) { instance_double 'Queue' }
80
+ let(:lib_name) { 'some lib' }
81
+
82
+ context 'gem exists' do
83
+ let(:gem) { double 'Gem::Specification' }
84
+
85
+ it 'puts the library name on the require_queue' do
86
+ expect(Gem).to receive(:install).with(lib_name).and_return([gem])
87
+ expect(require_queue).to receive(:<<).with(lib_name)
88
+
89
+ subject.send(:start_install_thread, lib_name, require_queue)
90
+ end
91
+ end
92
+
93
+ context 'gem does not exist' do
94
+ it 'does not put the library name on the require_queue' do
95
+ expect(Gem).to receive(:install).with(lib_name).and_return([])
96
+ expect(require_queue).to_not receive(:<<)
97
+
98
+ subject.send(:start_install_thread, lib_name, require_queue)
99
+ end
100
+ end
101
+ end
102
+
103
+ describe '#start_require_thread' do
104
+ let(:require_queue) { instance_double 'Queue' }
105
+ let(:lib_name) { 'test name' }
106
+ let(:thread) { instance_double('Thread', join: nil) }
107
+ before { allow(Thread).to receive(:new).and_yield.and_return(thread) }
108
+
109
+ context 'rails' do
110
+ before { expect(Hairballs.config).to receive(:rails?).and_return(true) }
111
+
112
+ it 'finds the latest gem and adds it to the load path' do
113
+ lib_path = 'path to lib'
114
+ expect(require_queue).to receive(:pop).and_return(lib_name)
115
+ expect(subject).to receive(:find_latest_gem).with(lib_name).
116
+ and_return(lib_path)
117
+ expect($LOAD_PATH).to receive(:unshift).with('path to lib/lib')
118
+ expect(subject).to receive(:require).with(lib_name)
119
+
120
+ subject.send(:start_require_thread, require_queue)
121
+ end
122
+ end
123
+
124
+ context 'not rails' do
125
+ before { expect(Hairballs.config).to receive(:rails?).and_return(false) }
126
+
127
+ it 'does not find the latest gem and add it to the load path' do
128
+ expect(require_queue).to receive(:pop).and_return(lib_name)
129
+ expect(subject).to_not receive(:find_latest_gem)
130
+ expect($LOAD_PATH).to_not receive(:unshift)
131
+ expect(subject).to receive(:require).with(lib_name)
132
+
133
+ subject.send(:start_require_thread, require_queue)
134
+ end
135
+ end
136
+ end
72
137
  end
@@ -22,10 +22,10 @@ RSpec.describe Hairballs::Plugin do
22
22
  let(:the_block) { proc { puts 'hi' } }
23
23
 
24
24
  it 'stores the given block' do
25
- expect {
25
+ expect do
26
26
  subject.on_load(&the_block)
27
- }.to change { subject.instance_variable_get(:@on_load) }.
28
- from(nil).to(the_block)
27
+ end.to change { subject.instance_variable_get(:@on_load) }.
28
+ from(nil).to(the_block)
29
29
  end
30
30
  end
31
31
 
@@ -51,7 +51,7 @@ RSpec.describe Hairballs::Plugin do
51
51
  end
52
52
 
53
53
  context 'with @on_load set to a Proc' do
54
- let(:on_load) { double 'Proc', :kind_of? => true }
54
+ let(:on_load) { double 'Proc', kind_of?: true }
55
55
  before { subject.instance_variable_set(:@on_load, on_load) }
56
56
 
57
57
  it 'calls the on_load Proc' do
@@ -61,7 +61,7 @@ RSpec.describe Hairballs::Plugin do
61
61
  end
62
62
 
63
63
  context 'with @on_load set to not a Proc' do
64
- let(:on_load) { double 'Proc', :kind_of? => false }
64
+ let(:on_load) { double 'Proc', kind_of?: false }
65
65
  before { subject.instance_variable_set(:@on_load, on_load) }
66
66
 
67
67
  it 'raises a PluginLoadFailure' do
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,4 @@
1
- $:.unshift(File.expand_path('../lib/hairballs', File.dirname(__FILE__)))
1
+ $LOAD_PATH.unshift(File.expand_path('../lib/hairballs', File.dirname(__FILE__)))
2
2
 
3
3
  RSpec.configure do |config|
4
4
  config.expect_with :rspec do |expectations|
@@ -19,8 +19,8 @@ RSpec.configure do |config|
19
19
  mocks.verify_partial_doubles = true
20
20
  end
21
21
 
22
- # The settings below are suggested to provide a good initial experience
23
- # with RSpec, but feel free to customize to your heart's content.
22
+ # The settings below are suggested to provide a good initial experience
23
+ # with RSpec, but feel free to customize to your heart's content.
24
24
  # These two settings work together to allow you to limit a spec run
25
25
  # to individual examples or groups you care about by tagging them with
26
26
  # `:focus` metadata. When nothing is tagged with `:focus`, all examples
@@ -28,8 +28,8 @@ RSpec.configure do |config|
28
28
  # config.filter_run :focus
29
29
  # config.run_all_when_everything_filtered = true
30
30
 
31
- # Limits the available syntax to the non-monkey patched syntax that is recommended.
32
- # For more details, see:
31
+ # Limits the available syntax to the non-monkey patched syntax that is
32
+ # recommended. For more details, see:
33
33
  # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
34
34
  # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
35
35
  # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hairballs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Loveless
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-07 00:00:00.000000000 Z
11
+ date: 2015-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -61,6 +61,8 @@ extra_rdoc_files: []
61
61
  files:
62
62
  - ".gitignore"
63
63
  - ".rspec"
64
+ - ".rubocop.yml"
65
+ - ".travis.yml"
64
66
  - Gemfile
65
67
  - History.md
66
68
  - LICENSE.txt
@@ -124,3 +126,4 @@ test_files:
124
126
  - spec/hairballs/theme_spec.rb
125
127
  - spec/hairballs_spec.rb
126
128
  - spec/spec_helper.rb
129
+ has_rdoc: