sashimi 0.1.7 → 0.2.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/CHANGELOG CHANGED
@@ -1,3 +1,69 @@
1
+ * *v0.2.0*
2
+
3
+ * Tagged v0.2.0
4
+
5
+ * Prepare for v0.2.0
6
+
7
+ * Ignored flunked test cases
8
+
9
+ * Massive changelog
10
+
11
+ * rdoc formatting
12
+
13
+ * Using, where possible, @@class_variable and cattr_reader instead of class methods. Documentation improvements.
14
+
15
+ * Don't try to remove the gem from working copy at the beginning of Rake install
16
+
17
+ * Print plugin name when execute uninstall command
18
+
19
+ * Aliased #cache_content with #list in order to clean up AbstractRepository from stdout formattin code. The code was moved to Commands::List
20
+
21
+ * Clean up for #with_path in test_helper.rb
22
+
23
+ * Removed with_path from #files_scheduled_for_add and #files_scheduled_for_remove because #update_versioned_rails_plugins already works in vendor/plugins
24
+
25
+ * Removed unnecessary with_path statement from AbstractRepository#prepare_installation
26
+
27
+ * Removed unnecessary with_path statement from AbstractRepository#remove_temp_folder
28
+
29
+ * Removed unnecessary with_path statement from AbstractRepository#update_unversioned_rails_plugins
30
+
31
+ * Removed with_path from #update_rails_plugins, because update command should be always executed from the root of a Rails app
32
+
33
+ * Removed unnecessary with_path statement from AbstractRepository#copy_plugin_to_rails_app
34
+
35
+ * Removed unnecessary with_path statement for AbstractRepository#write_to_cache
36
+
37
+ * Remove builded gem from working copy, after rake install task
38
+
39
+ * Don't generate rdoc and ri on Rake install
40
+
41
+ * Fixed AbstractRepository#update_versioned_rails_plugins. Made AbstractRepository#temp_plugin_name public
42
+
43
+ * Created install Rake task
44
+
45
+ * Improved test coverage for AbstractRepository
46
+
47
+ * Added AbstractRepository#temp_plugin_name
48
+
49
+ * File#join -> Array#to_path or String#to_path. Code cleanup.
50
+
51
+ * Improved tests for AbstractRepository cache and instantiation
52
+
53
+ * Improved test coverage for AbstractRepository
54
+
55
+ * Added tests for uninstall. Re-enabled tests.
56
+
57
+ * Initial rewriting of test suite
58
+
59
+ * Added String#to_path and Array#to_path
60
+
61
+ * Added AbstractRepository#with_path in order to scopify current directory changes
62
+
63
+ * Added block support to Class#class_method_proxy
64
+
65
+
66
+
1
67
  * *v0.1.7*
2
68
 
3
69
  * Tagged v0.1.7
data/README CHANGED
@@ -1,82 +1,80 @@
1
- Sashimi
2
- =======
1
+ = Sashimi
3
2
 
4
3
  Sashimi is a Rails plugins manager.
4
+
5
5
  It allows to install your favourite plugins in a local repository and add them to your Rails apps.
6
6
  The main goal is to allow the plugins offline installation.
7
7
 
8
8
 
9
9
 
10
- Installation
11
- ============
10
+ = Installation
12
11
 
13
- $ (sudo) gem install sashimi
12
+ $ (sudo) gem install sashimi
14
13
 
15
14
  or
16
15
 
17
- $ (sudo) gem install jodosha-sashimi --source=http://gems.github.com
16
+ $ (sudo) gem install jodosha-sashimi --source=http://gems.github.com
18
17
 
19
18
 
20
19
 
21
- Usage
22
- =====
20
+ = Usage
23
21
 
24
22
  Install a plugin from a subversion URL:
25
- $ sashimi install http://dev.rubyonrails.com/svn/rails/plugins/continuous_builder
23
+ $ sashimi install http://dev.rubyonrails.com/svn/rails/plugins/continuous_builder
26
24
 
27
25
  Install a plugin from a git URL:
28
- $ sashimi install git://github.com/jodosha/click-to-globalize.git
26
+ $ sashimi install git://github.com/jodosha/click-to-globalize.git
29
27
 
30
28
  Uninstall a plugin:
31
- $ sashimi uninstall continuous_builder
29
+ $ sashimi uninstall continuous_builder
32
30
 
33
31
  Update a plugin:
34
- $ sashimi update click-to-globalize
32
+ $ sashimi update click-to-globalize
35
33
 
36
34
  Update a plugin of a Rails app:
37
- $ sashimi update --rails click-to-globalize
35
+ $ sashimi update --rails click-to-globalize
38
36
 
39
37
  NOTE: If your application is versioned with Svn or Git, Sashimi will automatically schedules for add/remove the added/removed files.
40
38
 
41
39
  List all installed plugins:
42
- $ sashimi list
40
+ $ sashimi list
43
41
 
44
42
  Add installed plugin(s) to a Rails app:
45
- $ sashimi add click-to-globalize
46
- $ sashimi install --rails click-to-globalize
43
+ $ sashimi add click-to-globalize
44
+ or
45
+ $ sashimi install --rails click-to-globalize
47
46
 
48
47
 
49
48
 
50
- Known And Common Issues
51
- =======================
49
+ = Known And Common Issues
52
50
 
53
51
  * When add a plugin to an app, make sure your current directory is the rails root.
54
52
 
55
53
  * Only Subversion and Git repositories are currently supported.
56
54
 
57
55
 
58
- Contribute
59
- ==========
56
+ = Contribute
60
57
 
61
58
  * Check out the code and test it:
59
+
62
60
  $ git clone git://github.com/jodosha/sashimi.git
61
+
63
62
  $ rake
64
63
 
65
- * Create a ticket to: http://sushistar.lighthouseapp.com
64
+ * Create a ticket to the {Sushistar Lighthouse page}[http://sushistar.lighthouseapp.com]
66
65
 
67
66
  * Create a patch and add as attachement to the ticket.
68
67
 
69
68
 
70
- Credits
71
- =======
69
+ = Credits
72
70
 
73
71
  Partially inspired to RaPT[http://rapt.rubyforge.org/].
74
72
 
75
73
 
76
74
 
77
- Home Page
78
- =========
79
- http://lucaguidi.com/pages/sashimi
75
+ = Home Page
76
+
77
+ The Sashimi homepage is http://lucaguidi.com/pages/sashimi
80
78
 
81
79
 
82
80
 
data/Rakefile CHANGED
@@ -1,3 +1,4 @@
1
+ $:.unshift 'lib'
1
2
  require 'rake'
2
3
  require 'rake/testtask'
3
4
  require 'rake/rdoctask'
@@ -20,3 +21,12 @@ Rake::RDocTask.new(:rdoc) do |rdoc|
20
21
  rdoc.rdoc_files.include('README')
21
22
  rdoc.rdoc_files.include('lib/**/*.rb')
22
23
  end
24
+
25
+ desc 'Build and install the gem (useful for development purposes).'
26
+ task :install do
27
+ require 'sashimi'
28
+ system "gem build sashimi.gemspec"
29
+ system "sudo gem uninstall sashimi"
30
+ system "sudo gem install --local --no-rdoc --no-ri sashimi-#{Sashimi::VERSION::STRING}.gem"
31
+ system "rm sashimi-*.gem"
32
+ end
@@ -125,6 +125,7 @@ module Sashimi
125
125
  def parse!(args)
126
126
  options.parse!(args)
127
127
  args.each do |name|
128
+ puts name.titleize + "\n"
128
129
  Plugin.new(name).uninstall
129
130
  end
130
131
  end
@@ -179,7 +180,10 @@ module Sashimi
179
180
 
180
181
  def parse!(args)
181
182
  options.parse!(args)
182
- puts Plugin.list
183
+ output = Plugin.list.sort.collect do |plugin, contents|
184
+ "#{plugin}\t\t#{contents['summary']}"
185
+ end.join("\n")
186
+ puts output
183
187
  end
184
188
  end
185
189
 
@@ -0,0 +1,22 @@
1
+ class Array
2
+ # Transform the current +Array+ to a path.
3
+ #
4
+ # It's an alias for <tt>File#join</tt>.
5
+ #
6
+ # %w(path to app).to_path # => path/to/app+
7
+ # %w(path to app).to_path(true) # => /Users/luca/path/to/app
8
+ def to_path(absolute = false)
9
+ path = File.join(self)
10
+ path = File.expand_path(path) if absolute
11
+ path
12
+ end
13
+
14
+ # Transform the current +Array+ to an absolute path.
15
+ #
16
+ # %w(path to app).to_absolute_path # => /Users/luca/path/to/app
17
+ # %w(path to app).to_abs_path # => /Users/luca/path/to/app
18
+ def to_absolute_path
19
+ to_path(true)
20
+ end
21
+ alias_method :to_abs_path, :to_absolute_path
22
+ end
@@ -21,8 +21,8 @@ class Class
21
21
  method_names.each do |m|
22
22
  self.class_eval %{
23
23
  # Proxy method for <tt>#{self.class.name}##{m}</tt>
24
- def #{m}(*args)
25
- self.class.#{m}(*args)
24
+ def #{m}(*args, &block)
25
+ self.class.#{m}(*args, &block)
26
26
  end
27
27
  private :#{m}
28
28
  }, __FILE__, __LINE__
@@ -0,0 +1,13 @@
1
+ class String
2
+ # Transform the current +String+ to a system path,
3
+ # according to the current platform file system.
4
+ #
5
+ # "path/to/app".to_path # => path/to/app (on *nix)
6
+ # "path/to/app".to_path # => path\to\app (on Windows)
7
+ #
8
+ # "path/to/app".to_path(true) # => /Users/luca/path/to/app (on *nix)
9
+ # "path/to/app".to_path(true) # => C:\path\to\app (on Windows)
10
+ def to_path(absolute = false)
11
+ self.split(/\/\\/).to_path(absolute)
12
+ end
13
+ end
@@ -30,9 +30,8 @@ module Sashimi
30
30
  def repository #:nodoc:
31
31
  @repository ||= instantiate_repository
32
32
  end
33
-
34
- # Read the content of the <tt>about.yml</tt>.
35
- # New feature of Rails 2.1.x http:://dev.rubyonrails.org/changeset/9098
33
+
34
+ # Returns the informations about the plugin.
36
35
  def about
37
36
  @about ||= repository.about
38
37
  end
@@ -52,7 +51,7 @@ module Sashimi
52
51
  name
53
52
  end
54
53
 
55
- # Serialize the plugin to Hash format.
54
+ # Serialize the plugin to +Hash+ format.
56
55
  def to_hash
57
56
  { self.guess_name =>
58
57
  { 'type' => repository.scm_type,
@@ -1,49 +1,63 @@
1
1
  module Sashimi
2
2
  class PluginNotFound < StandardError #:nodoc:
3
3
  def initialize(plugin_name, message = nil)
4
- @plugin_name = plugin_name
5
- @message = message
4
+ @plugin_name, @message = plugin_name, message
6
5
  end
7
6
 
8
7
  def to_s
9
- @message || @plugin_name + " isn't in the local repository."
8
+ @message || @plugin_name.to_s + " isn't in the local repository."
10
9
  end
11
10
  end
12
11
 
13
12
  class AbstractRepository
14
- @@local_repository_sub_path = File.join('.rails', 'plugins')
13
+ TEMP_SUFFIX = '-tmp'
14
+
15
+ # It's the path where the plugins are stored.
16
+ @@plugins_path = ".rails/plugins".to_path
17
+
18
+ # Conventional path where Rails applications use to place their plugins.
19
+ @@rails_plugins_path = "vendor/plugins".to_path
20
+ cattr_reader :rails_plugins_path
21
+
22
+ # Cache file used to store informations about installed plugins.
15
23
  @@cache_file = '.plugins'
16
24
  cattr_accessor :cache_file
17
25
 
18
- attr_accessor :plugin
26
+ attr_reader :plugin
19
27
 
20
28
  def initialize(plugin)
21
- self.plugin = plugin
29
+ @plugin = plugin
22
30
  end
23
31
 
24
- # Remove the repository
32
+ # Uninstall the current plugin.
25
33
  def uninstall
26
- change_dir_to_local_repository
27
- raise PluginNotFound.new(plugin.name) unless File.exists?(plugin.name)
28
- FileUtils.rm_rf(plugin.name)
29
- remove_from_cache
34
+ with_path local_repository_path do
35
+ raise PluginNotFound.new(plugin.name) unless File.exists?(plugin.name)
36
+ FileUtils.rm_rf(plugin.name)
37
+ remove_from_cache
38
+ end
30
39
  end
31
40
 
32
- # Add to a Rails app.
41
+ # Add the current plugin to a Rails app.
33
42
  def add
43
+ raise PluginNotFound.new(plugin.name) unless cache_content.keys.include?(plugin.name)
34
44
  puts plugin.name.titleize + "\n"
35
45
  copy_plugin_and_remove_hidden_folders
36
46
  rename_temp_folder
37
47
  run_install_hook
38
48
  end
39
49
 
40
- # Copy a plugin to a Rails app and remove SCM hidden folders
50
+ # Copy a plugin to a Rails app and remove SCM hidden folders.
41
51
  def copy_plugin_and_remove_hidden_folders
42
52
  copy_plugin_to_rails_app
43
- remove_hidden_folders
53
+ remove_hidden_folders
44
54
  end
45
55
 
46
56
  class << self
57
+ # Instantiate a repository (Svn or Git) for the given plugin.
58
+ #
59
+ # If the plugin was already installed it load from the cache,
60
+ # otherwise it try to guess information from its url.
47
61
  def instantiate_repository(plugin)
48
62
  unless plugin.name.nil?
49
63
  instantiate_repository_by_cache(plugin)
@@ -52,21 +66,16 @@ module Sashimi
52
66
  end.new(plugin)
53
67
  end
54
68
 
55
- # Return all installed plugin names and summary, formatted for stdout.
56
- def list
57
- cache_content.sort.collect do |plugin, contents|
58
- "#{plugin}\t\t#{contents['summary']}"
59
- end.join("\n")
60
- end
61
-
62
69
  # Return all installed plugins names.
63
70
  def plugins_names
64
71
  cache_content.keys.sort
65
72
  end
66
73
 
67
74
  # Update the plugins installed in a rails app.
75
+ #
76
+ # If the application is under version control, +Sashimi+ cares about to
77
+ # schedule add/remove plugin's files from/to your SCM of choice.
68
78
  def update_rails_plugins(plugins_names)
69
- change_dir(path_to_rails_app)
70
79
  if under_version_control?
71
80
  update_versioned_rails_plugins(plugins_names)
72
81
  else
@@ -74,37 +83,39 @@ module Sashimi
74
83
  end
75
84
  end
76
85
 
77
- # Update the plugins installed in a non versioned rails app.
86
+ # Update the plugins installed in a <b>not versioned</b> Rails app.
78
87
  def update_unversioned_rails_plugins(plugins_names)
79
- change_dir(plugins_dir)
80
88
  plugins_names.each do |plugin_name|
81
- FileUtils.rm_rf(plugin_name)
89
+ FileUtils.rm_rf [ absolute_rails_plugins_path, plugin_name ].to_path
82
90
  Plugin.new(plugin_name).add
83
91
  end
84
92
  end
85
93
 
86
- # Update the plugins installed in a versioned rails app.
94
+ # Update the plugins installed in a <b>versioned</b> Rails app.
87
95
  def update_versioned_rails_plugins(plugins_names)
88
- change_dir(plugins_dir)
89
- plugins_names.each do |plugin_name|
90
- raise PluginNotFound.new(plugin_name) unless File.exists?(plugin_name)
91
- repository = Plugin.new(plugin_name).repository
92
- repository.copy_plugin_and_remove_hidden_folders
93
- files_scheduled_for_remove = repository.files_scheduled_for_remove
94
- files_scheduled_for_add = repository.files_scheduled_for_add
95
- FileUtils.cp_r(plugin_name+'-tmp/.', plugin_name)
96
- repository.remove_temp_folder
97
- change_dir(plugin_name)
98
- files_scheduled_for_remove.each {|file| scm_remove file}
99
- files_scheduled_for_add.each {|file| scm_add file}
96
+ with_path absolute_rails_plugins_path do
97
+ plugins_names.each do |plugin_name|
98
+ raise PluginNotFound.new(plugin_name) unless File.exists?(plugin_name)
99
+ repository = Plugin.new(plugin_name).repository
100
+ repository.copy_plugin_and_remove_hidden_folders
101
+ files_scheduled_for_remove = repository.files_scheduled_for_remove
102
+ files_scheduled_for_add = repository.files_scheduled_for_add
103
+ FileUtils.cp_r(repository.temp_plugin_name+'/.', plugin_name)
104
+ repository.remove_temp_folder
105
+ with_path plugin_name do
106
+ files_scheduled_for_remove.each {|file| scm_remove file}
107
+ files_scheduled_for_add.each {|file| scm_add file}
108
+ end
109
+ end
100
110
  end
101
111
  end
102
112
 
103
- # Schedules an add for the given file on the current SCM system used by the Rails app.
113
+ # Schedules an <b>add</b> for the given file on the current SCM system used by the Rails app.
104
114
  def scm_add(file)
105
115
  scm_command(:add, file)
106
116
  end
107
117
 
118
+ # Schedules a <b>remove</b> for the given file on the current SCM system used by the Rails app.
108
119
  def scm_remove(file)
109
120
  scm_command(:rm, file)
110
121
  end
@@ -112,55 +123,51 @@ module Sashimi
112
123
  # Execute the given command for the current SCM system used by the Rails app.
113
124
  def scm_command(command, file)
114
125
  scm = guess_version_control_system
115
- system("#{scm} #{command} #{file}")
126
+ Kernel.system("#{scm} #{command} #{file}")
116
127
  end
117
128
 
129
+ # It's the absolute path where the plugins are stored.
130
+ #
131
+ # Typically, it's under your home directory.
118
132
  def local_repository_path #:nodoc:
119
- @local_repository_path ||= File.join(find_home, @@local_repository_sub_path)
133
+ @local_repository_path ||= [ find_home, @@plugins_path ].to_path
120
134
  end
121
135
 
122
- # Return the path to the Rails app where the user launched sashimi command.
136
+ # Return the path to the Rails app where the user launched <tt>sashimi</tt> command.
123
137
  def path_to_rails_app
124
138
  $rails_app
125
139
  end
126
140
 
127
141
  # Read the cache file and return the content as an <tt>Hash</tt>.
128
142
  def cache_content
129
- change_dir_to_local_repository
130
- @@cache_content ||= (YAML::load_file(cache_file) || {}).to_hash
143
+ with_path local_repository_path do
144
+ @@cache_content ||= (YAML::load_file(cache_file) || {}).to_hash
145
+ end
131
146
  end
147
+ alias_method :list, :cache_content
132
148
 
149
+ # Istantiate a +Repository+ for the given +plugin+, guessing if its url
150
+ # refers to a Svn or Git repository.
133
151
  def instantiate_repository_by_url(plugin)
134
152
  git_url?(plugin.url) ? GitRepository : SvnRepository
135
153
  end
136
154
 
155
+ # Instantiate a repository for the given +plugin+, loading informations
156
+ # from the cache.
137
157
  def instantiate_repository_by_cache(plugin)
138
158
  cached_plugin = cache_content[plugin.name]
139
159
  raise PluginNotFound.new(plugin.name) if cached_plugin.nil?
140
160
  cached_plugin['type'] == 'git' ? GitRepository : SvnRepository
141
161
  end
142
-
143
- # Changes the current directory with the given one
144
- def change_dir(dir)
145
- FileUtils.cd(dir)
146
- end
147
-
148
- # Change the current directory with local_repository_path
149
- def change_dir_to_local_repository
150
- change_dir(local_repository_path)
151
- end
152
-
153
- # Change the current directory with the fully qualified
154
- # path to Rails app and plugins_dir.
155
- def change_dir_to_absolute_plugins_dir
156
- change_dir(File.join(File.expand_path(path_to_rails_app), plugins_dir))
157
- end
158
-
159
- # Rails app plugins dir
160
- def plugins_dir
161
- @@plugins_dir ||= File.join('vendor', 'plugins')
162
+
163
+ # It's absolute path of plugins in your Rails app.
164
+ #
165
+ # path/to/rails_app # => /Users/luca/path/to/rails_app/vendor/plugins
166
+ def absolute_rails_plugins_path
167
+ @@absolute_rails_plugins_path = [ path_to_rails_app,
168
+ rails_plugins_path ].to_path(true)
162
169
  end
163
-
170
+
164
171
  # Check if the current working directory is under version control
165
172
  def under_version_control?
166
173
  !Dir.glob(".{git,svn}").empty?
@@ -194,6 +201,17 @@ module Sashimi
194
201
  def git_url?(url)
195
202
  url =~ /^git:\/\// || url =~ /\.git$/
196
203
  end
204
+
205
+ # Yield the given block executing it in the specified path
206
+ def with_path(path, &block)
207
+ begin
208
+ old_path = Dir.pwd
209
+ FileUtils.cd(path)
210
+ yield
211
+ ensure
212
+ FileUtils.cd(old_path)
213
+ end
214
+ end
197
215
  end
198
216
 
199
217
  # Return the SCM type
@@ -205,48 +223,50 @@ module Sashimi
205
223
  end
206
224
 
207
225
  # Read the content of the <tt>about.yml</tt>.
208
- # New feature of Rails 2.1.x http:://dev.rubyonrails.org/changeset/9098
226
+ #
227
+ # New feature of Rails 2.1.0 http://github.com/rails/rails/commit/f5b991d76dc5d21f1870da067fb3101440256fba
209
228
  def about
210
- change_dir_to_plugin_path
211
- return {} unless File.exists?('about.yml')
212
- (YAML::load_file('about.yml') || {}).to_hash
229
+ with_path plugin_path do
230
+ (YAML::load_file('about.yml') rescue {}).to_hash
231
+ end
213
232
  end
214
233
 
215
234
  # Returns a list of files that should be scheduled for SCM add.
216
235
  def files_scheduled_for_add
217
- change_dir_to_absolute_plugins_dir
218
- Dir[plugin.name+"-tmp/**/*"].collect {|fn| fn.gsub(plugin.name+'-tmp', '.')} -
236
+ Dir[temp_plugin_name+"/**/*"].collect {|fn| fn.gsub(temp_plugin_name, '.')} -
219
237
  Dir[plugin.name+"/**/*"].collect{|fn| fn.gsub(plugin.name, '.')}
220
238
  end
221
239
 
222
240
  # Returns a list of files that should be scheduled for SCM remove.
223
241
  def files_scheduled_for_remove
224
- change_dir_to_absolute_plugins_dir
225
242
  Dir[plugin.name+"/**/*"].collect {|fn| fn.gsub(plugin.name, '.')} -
226
- Dir[plugin.name+"-tmp/**/*"].collect {|fn| fn.gsub(plugin.name+"-tmp", '.')}
243
+ Dir[temp_plugin_name+"/**/*"].collect {|fn| fn.gsub(temp_plugin_name, '.')}
227
244
  end
228
245
 
229
246
  # Remove the temp folder, used by update process.
230
247
  def remove_temp_folder
231
- change_dir_to_absolute_plugins_dir
232
- FileUtils.rm_rf(plugin.name+'-tmp')
248
+ FileUtils.rm_rf [ absolute_rails_plugins_path, temp_plugin_name ].to_path
233
249
  end
234
250
 
235
- class_method_proxy :change_dir, :change_dir_to_local_repository,
236
- :change_dir_to_absolute_plugins_dir, :local_repository_path,
237
- :cache_file, :cache_content, :plugins_dir, :path_to_rails_app
251
+ # Returns the name used for temporary plugin folder.
252
+ def temp_plugin_name
253
+ plugin.name + TEMP_SUFFIX
254
+ end
255
+
256
+ class_method_proxy :local_repository_path, :cache_file,
257
+ :cache_content, :path_to_rails_app, :rails_plugins_path,
258
+ :with_path, :absolute_rails_plugins_path
238
259
 
239
260
  private
240
- # Change the current directory with the plugin one
241
- def change_dir_to_plugin_path
242
- change_dir(File.join(local_repository_path, plugin.name || plugin.guess_name))
261
+ # Returns the path to the plugin
262
+ def plugin_path
263
+ [ local_repository_path, plugin.name || plugin.guess_name ].to_path
243
264
  end
244
265
 
245
266
  # Prepare the plugin installation
246
267
  def prepare_installation
247
- FileUtils.mkdir_p(local_repository_path)
248
- change_dir_to_local_repository
249
- FileUtils.touch(cache_file)
268
+ FileUtils.mkdir_p local_repository_path
269
+ FileUtils.touch [ local_repository_path, cache_file ].to_path
250
270
  end
251
271
 
252
272
  # Add a plugin into the cache
@@ -262,17 +282,16 @@ module Sashimi
262
282
 
263
283
  # Write all the plugins into the cache
264
284
  def write_to_cache(plugins)
265
- change_dir_to_local_repository
266
- FileUtils.mv(cache_file, "#{cache_file}-backup")
267
- File.open(cache_file, 'w'){|f| f.write(plugins.to_yaml)}
268
- FileUtils.rm("#{cache_file}-backup")
285
+ File.atomic_write(cache_file) do |file|
286
+ file.write(plugins.to_yaml)
287
+ end
269
288
  end
270
289
 
271
290
  # Copy a plugin to a Rails app.
272
291
  def copy_plugin_to_rails_app
273
- change_dir(path_to_rails_app)
274
- FileUtils.mkdir_p(plugins_dir)
275
- FileUtils.cp_r(File.join(local_repository_path, plugin.name), File.join(plugins_dir, plugin.name+'-tmp'))
292
+ FileUtils.mkdir_p absolute_rails_plugins_path
293
+ FileUtils.cp_r [ local_repository_path, plugin.name ].to_path,
294
+ [ absolute_rails_plugins_path, temp_plugin_name ].to_path
276
295
  end
277
296
 
278
297
  # Rename the *-tmp folder used by the installation process.
@@ -280,26 +299,27 @@ module Sashimi
280
299
  # Example:
281
300
  # click-to-globalize-tmp # => click-to-globalize
282
301
  def rename_temp_folder
283
- change_dir(path_to_rails_app)
284
- FileUtils.mv(File.join(plugins_dir, plugin.name+'-tmp'), File.join(plugins_dir, plugin.name))
302
+ FileUtils.mv [ rails_plugins_path, temp_plugin_name ].to_path,
303
+ [ rails_plugins_path, plugin.name ].to_path
285
304
  end
286
305
 
287
306
  # Remove SCM hidden folders.
288
307
  def remove_hidden_folders
289
308
  require 'find'
290
- change_dir(File.join(path_to_rails_app, plugins_dir, plugin.name+'-tmp'))
291
- Find.find('./') do |path|
292
- if File.basename(path) == '.'+scm_type
293
- FileUtils.remove_dir(path, true)
294
- Find.prune
309
+ with_path [ absolute_rails_plugins_path, temp_plugin_name ].to_path do
310
+ Find.find('./') do |path|
311
+ if File.basename(path) == '.'+scm_type
312
+ FileUtils.remove_dir(path, true)
313
+ Find.prune
314
+ end
295
315
  end
296
316
  end
297
317
  end
298
-
318
+
299
319
  # Run the plugin install hook.
300
320
  def run_install_hook
301
- install_hook_file = File.join(plugins_dir, plugin.name, 'install.rb')
302
- load install_hook_file if File.exist? install_hook_file
321
+ install_hook_file = [ rails_plugins_path, plugin.name, 'install.rb' ].to_path
322
+ Kernel.load install_hook_file if File.exists? install_hook_file
303
323
  end
304
324
  end
305
325
  end