sashimi 0.1.0 → 0.1.5
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 +20 -0
- data/README +6 -0
- data/lib/sashimi/commands.rb +33 -9
- data/lib/sashimi/repositories/abstract_repository.rb +118 -6
- data/sashimi.gemspec +2 -2
- data/test/unit/repositories/abstract_repository_test.rb +6 -0
- metadata +2 -2
data/CHANGELOG
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
* *v0.1.5*
|
2
|
+
|
3
|
+
* Tagged v0.1.5
|
4
|
+
|
5
|
+
* Prepare for v0.1.5
|
6
|
+
|
7
|
+
* Raise a PluginNotFound exception if try to update a not existent plugin for the current Rails app
|
8
|
+
|
9
|
+
* Updated command line syntax reference in README
|
10
|
+
|
11
|
+
* Automatically schedule for SCM add and remove on plugin update, for Rails apps versioned with Svn and Git
|
12
|
+
|
13
|
+
* Added --rails option to the Update command in order to update plugins already added to a Rails app [#12 state:resolved]
|
14
|
+
|
15
|
+
* Added --rails option to the Install command as alias for the Add command [#11 state:resolved]
|
16
|
+
|
17
|
+
* Added --all option to the Update command in order to update all installed plugins with one command [#2 state:resolved]
|
18
|
+
|
19
|
+
|
20
|
+
|
1
21
|
* *v0.1.0*
|
2
22
|
|
3
23
|
* Print on the stdout the plugin name on each command execution
|
data/README
CHANGED
@@ -29,11 +29,17 @@ $ sashimi uninstall continuous_builder
|
|
29
29
|
Update a plugin:
|
30
30
|
$ sashimi update click-to-globalize
|
31
31
|
|
32
|
+
Update a plugin of a Rails app:
|
33
|
+
$ sashimi update --rails click-to-globalize
|
34
|
+
|
35
|
+
NOTE: If your application is versioned with Svn or Git, Sashimi will automatically schedules for add/remove the added/removed files.
|
36
|
+
|
32
37
|
List all installed plugins:
|
33
38
|
$ sashimi list
|
34
39
|
|
35
40
|
Add installed plugin(s) to a Rails app:
|
36
41
|
$ sashimi add click-to-globalize
|
42
|
+
$ sashimi install --rails click-to-globalize
|
37
43
|
|
38
44
|
|
39
45
|
|
data/lib/sashimi/commands.rb
CHANGED
@@ -40,10 +40,16 @@ module Sashimi
|
|
40
40
|
o.separator " #{@script_name} uninstall continuous_builder\n"
|
41
41
|
o.separator " Update a plugin:"
|
42
42
|
o.separator " #{@script_name} update click-to-globalize\n"
|
43
|
+
o.separator " Update all installed plugins:"
|
44
|
+
o.separator " #{@script_name} update --all\n"
|
45
|
+
o.separator " Update plugin(s) already added to a Rails app:"
|
46
|
+
o.separator " #{@script_name} update --rails click-to-globalize\n"
|
43
47
|
o.separator " List all installed plugins:"
|
44
48
|
o.separator " #{@script_name} list\n"
|
45
49
|
o.separator " Add installed plugin(s) to a Rails app:"
|
46
50
|
o.separator " #{@script_name} add click-to-globalize\n"
|
51
|
+
o.separator " Add installed plugin(s) to a Rails app:"
|
52
|
+
o.separator " #{@script_name} install --rails click-to-globalize\n"
|
47
53
|
end
|
48
54
|
end
|
49
55
|
|
@@ -79,28 +85,33 @@ module Sashimi
|
|
79
85
|
|
80
86
|
class Install
|
81
87
|
def initialize(base_command)
|
82
|
-
@base_command = base_command
|
88
|
+
@base_command = base_command
|
83
89
|
end
|
84
90
|
|
85
91
|
def options
|
86
92
|
OptionParser.new do |o|
|
87
93
|
o.set_summary_indent(' ')
|
88
|
-
o.banner = "Usage: #{@base_command.script_name} install URL [URL2, URL3]"
|
94
|
+
o.banner = "Usage: #{@base_command.script_name} install [OPTIONS] URL [URL2, URL3]"
|
89
95
|
o.define_head "Install plugin(s) from known URL(s)."
|
96
|
+
o.on("-r", "--rails", "Install the plugin(s) in a Rails app.") { |@rails| }
|
90
97
|
end
|
91
98
|
end
|
92
99
|
|
93
100
|
def parse!(args)
|
94
101
|
options.parse!(args)
|
95
|
-
args.each do |
|
96
|
-
|
102
|
+
args.each do |url_or_name|
|
103
|
+
if @rails
|
104
|
+
Plugin.new(url_or_name).add
|
105
|
+
else
|
106
|
+
Plugin.new(nil, url_or_name).install
|
107
|
+
end
|
97
108
|
end
|
98
109
|
end
|
99
110
|
end
|
100
111
|
|
101
112
|
class Uninstall
|
102
113
|
def initialize(base_command)
|
103
|
-
@base_command = base_command
|
114
|
+
@base_command = base_command
|
104
115
|
end
|
105
116
|
|
106
117
|
def options
|
@@ -121,21 +132,34 @@ module Sashimi
|
|
121
132
|
|
122
133
|
class Update
|
123
134
|
def initialize(base_command)
|
124
|
-
@base_command = base_command
|
135
|
+
@base_command = base_command
|
125
136
|
end
|
126
137
|
|
127
138
|
def options
|
128
139
|
OptionParser.new do |o|
|
129
140
|
o.set_summary_indent(' ')
|
130
|
-
o.banner = "Usage: #{@base_command.script_name} update PLUGIN [PLUGIN2, PLUGIN3]"
|
141
|
+
o.banner = "Usage: #{@base_command.script_name} update [OPTIONS] PLUGIN [PLUGIN2, PLUGIN3]"
|
131
142
|
o.define_head "Update installed plugin(s)."
|
143
|
+
o.on("-a", "--all", "Update all installed plugins.") { |@all| }
|
144
|
+
o.on("-r", "--rails", "Install the plugin(s) in a Rails app.") { |@rails| }
|
132
145
|
end
|
133
146
|
end
|
134
147
|
|
135
148
|
def parse!(args)
|
136
149
|
options.parse!(args)
|
137
|
-
|
138
|
-
|
150
|
+
raise "Can't use both --all and --rails arguments." if @all and @rails
|
151
|
+
if @all
|
152
|
+
update_plugins(AbstractRepository.plugins_names)
|
153
|
+
elsif @rails
|
154
|
+
AbstractRepository.update_rails_plugins(args)
|
155
|
+
else
|
156
|
+
update_plugins(args)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def update_plugins(plugins)
|
161
|
+
plugins.each do |plugin|
|
162
|
+
Plugin.new(plugin).update
|
139
163
|
end
|
140
164
|
end
|
141
165
|
end
|
@@ -30,11 +30,17 @@ module Sashimi
|
|
30
30
|
# Add to a Rails app.
|
31
31
|
def add
|
32
32
|
puts plugin.name.titleize + "\n"
|
33
|
-
|
34
|
-
|
33
|
+
copy_plugin_and_remove_hidden_folders
|
34
|
+
rename_temp_folder
|
35
35
|
run_install_hook
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
|
+
# Copy a plugin to a Rails app and remove SCM hidden folders
|
39
|
+
def copy_plugin_and_remove_hidden_folders
|
40
|
+
copy_plugin_to_rails_app
|
41
|
+
remove_hidden_folders
|
42
|
+
end
|
43
|
+
|
38
44
|
class << self
|
39
45
|
def instantiate_repository(plugin)
|
40
46
|
unless plugin.name.nil?
|
@@ -44,13 +50,69 @@ module Sashimi
|
|
44
50
|
end.new(plugin)
|
45
51
|
end
|
46
52
|
|
47
|
-
# Return all installed plugin names
|
53
|
+
# Return all installed plugin names and summary, formatted for stdout.
|
48
54
|
def list
|
49
55
|
cache_content.sort.collect do |plugin, contents|
|
50
56
|
"#{plugin}\t\t#{contents['summary']}"
|
51
57
|
end.join("\n")
|
52
58
|
end
|
53
59
|
|
60
|
+
# Return all installed plugins names.
|
61
|
+
def plugins_names
|
62
|
+
cache_content.keys.sort
|
63
|
+
end
|
64
|
+
|
65
|
+
# Update the plugins installed in a rails app.
|
66
|
+
def update_rails_plugins(plugins_names)
|
67
|
+
change_dir(path_to_rails_app)
|
68
|
+
if under_version_control?
|
69
|
+
update_versioned_rails_plugins(plugins_names)
|
70
|
+
else
|
71
|
+
update_unversioned_rails_plugins(plugins_names)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Update the plugins installed in a non versioned rails app.
|
76
|
+
def update_unversioned_rails_plugins(plugins_names)
|
77
|
+
change_dir(plugins_dir)
|
78
|
+
plugins_names.each do |plugin_name|
|
79
|
+
FileUtils.rm_rf(plugin_name)
|
80
|
+
Plugin.new(plugin_name).add
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Update the plugins installed in a versioned rails app.
|
85
|
+
def update_versioned_rails_plugins(plugins_names)
|
86
|
+
change_dir(plugins_dir)
|
87
|
+
plugins_names.each do |plugin_name|
|
88
|
+
raise PluginNotFound.new(plugin_name) unless File.exists?(plugin_name)
|
89
|
+
repository = Plugin.new(plugin_name).repository
|
90
|
+
repository.copy_plugin_and_remove_hidden_folders
|
91
|
+
files_scheduled_for_remove = repository.files_scheduled_for_remove
|
92
|
+
files_scheduled_for_add = repository.files_scheduled_for_add
|
93
|
+
FileUtils.cp_r(plugin_name+'-tmp/.', plugin_name)
|
94
|
+
repository.remove_temp_folder
|
95
|
+
change_dir(plugin_name)
|
96
|
+
files_scheduled_for_remove.each {|file| scm_remove file}
|
97
|
+
files_scheduled_for_add.each {|file| scm_add file}
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# Schedules an add for the given file on the current SCM system used by the Rails app.
|
102
|
+
def scm_add(file)
|
103
|
+
scm_command(:add, file)
|
104
|
+
end
|
105
|
+
|
106
|
+
def scm_remove(file)
|
107
|
+
scm_command(:rm, file)
|
108
|
+
end
|
109
|
+
|
110
|
+
# Execute the given command for the current SCM system used by the Rails app.
|
111
|
+
def scm_command(command, file)
|
112
|
+
scm = guess_version_control_system
|
113
|
+
system("#{scm} #{command} #{file}")
|
114
|
+
end
|
115
|
+
|
54
116
|
def local_repository_path #:nodoc:
|
55
117
|
@local_repository_path ||= File.join(find_home, @@local_repository_sub_path)
|
56
118
|
end
|
@@ -90,11 +152,27 @@ module Sashimi
|
|
90
152
|
change_dir(local_repository_path)
|
91
153
|
end
|
92
154
|
|
155
|
+
# Change the current directory with the fully qualified
|
156
|
+
# path to Rails app and plugins_dir.
|
157
|
+
def change_dir_to_absolute_plugins_dir
|
158
|
+
change_dir(File.join(File.expand_path(path_to_rails_app), plugins_dir))
|
159
|
+
end
|
160
|
+
|
93
161
|
# Rails app plugins dir
|
94
162
|
def plugins_dir
|
95
163
|
@@plugins_dir ||= File.join('vendor', 'plugins')
|
96
164
|
end
|
97
165
|
|
166
|
+
# Check if the current working directory is under version control
|
167
|
+
def under_version_control?
|
168
|
+
!Dir.glob(".{git,svn}").empty?
|
169
|
+
end
|
170
|
+
|
171
|
+
# Guess the version control system for the current working directory.
|
172
|
+
def guess_version_control_system
|
173
|
+
File.exists?('.git') ? :git : :svn
|
174
|
+
end
|
175
|
+
|
98
176
|
# Find the user home directory
|
99
177
|
def find_home
|
100
178
|
['HOME', 'USERPROFILE'].each do |homekey|
|
@@ -135,6 +213,26 @@ module Sashimi
|
|
135
213
|
return {} unless File.exists?('about.yml')
|
136
214
|
(YAML::load_file('about.yml') || {}).to_hash
|
137
215
|
end
|
216
|
+
|
217
|
+
# Returns a list of files that should be scheduled for SCM add.
|
218
|
+
def files_scheduled_for_add
|
219
|
+
change_dir_to_absolute_plugins_dir
|
220
|
+
Dir[plugin.name+"-tmp/**/*"].collect {|fn| fn.gsub(plugin.name+'-tmp', '.')} -
|
221
|
+
Dir[plugin.name+"/**/*"].collect{|fn| fn.gsub(plugin.name, '.')}
|
222
|
+
end
|
223
|
+
|
224
|
+
# Returns a list of files that should be scheduled for SCM remove.
|
225
|
+
def files_scheduled_for_remove
|
226
|
+
change_dir_to_absolute_plugins_dir
|
227
|
+
Dir[plugin.name+"/**/*"].collect {|fn| fn.gsub(plugin.name, '.')} -
|
228
|
+
Dir[plugin.name+"-tmp/**/*"].collect {|fn| fn.gsub(plugin.name+"-tmp", '.')}
|
229
|
+
end
|
230
|
+
|
231
|
+
# Remove the temp folder, used by update process.
|
232
|
+
def remove_temp_folder
|
233
|
+
change_dir_to_absolute_plugins_dir
|
234
|
+
FileUtils.rm_rf(plugin.name+'-tmp')
|
235
|
+
end
|
138
236
|
|
139
237
|
private
|
140
238
|
# Proxy for <tt>AbstractRepository#change_dir</tt>
|
@@ -147,6 +245,11 @@ module Sashimi
|
|
147
245
|
self.class.change_dir_to_local_repository
|
148
246
|
end
|
149
247
|
|
248
|
+
# Proxy for <tt>AbstractRepository#change_dir_to_absolute_plugins_dir</tt>
|
249
|
+
def change_dir_to_absolute_plugins_dir
|
250
|
+
self.class.change_dir_to_absolute_plugins_dir
|
251
|
+
end
|
252
|
+
|
150
253
|
# Change the current directory with the plugin one
|
151
254
|
def change_dir_to_plugin_path
|
152
255
|
change_dir(File.join(local_repository_path, plugin.name || plugin.guess_name))
|
@@ -207,13 +310,22 @@ module Sashimi
|
|
207
310
|
def copy_plugin_to_rails_app
|
208
311
|
change_dir(path_to_rails_app)
|
209
312
|
FileUtils.mkdir_p(plugins_dir)
|
210
|
-
FileUtils.cp_r(File.join(local_repository_path, plugin.name), File.join(plugins_dir, plugin.name))
|
313
|
+
FileUtils.cp_r(File.join(local_repository_path, plugin.name), File.join(plugins_dir, plugin.name+'-tmp'))
|
314
|
+
end
|
315
|
+
|
316
|
+
# Rename the *-tmp folder used by the installation process.
|
317
|
+
#
|
318
|
+
# Example:
|
319
|
+
# click-to-globalize-tmp # => click-to-globalize
|
320
|
+
def rename_temp_folder
|
321
|
+
change_dir(path_to_rails_app)
|
322
|
+
FileUtils.mv(File.join(plugins_dir, plugin.name+'-tmp'), File.join(plugins_dir, plugin.name))
|
211
323
|
end
|
212
324
|
|
213
325
|
# Remove SCM hidden folders.
|
214
326
|
def remove_hidden_folders
|
215
327
|
require 'find'
|
216
|
-
change_dir(File.join(path_to_rails_app, plugins_dir, plugin.name))
|
328
|
+
change_dir(File.join(path_to_rails_app, plugins_dir, plugin.name+'-tmp'))
|
217
329
|
Find.find('./') do |path|
|
218
330
|
if File.basename(path) == '.'+scm_type
|
219
331
|
FileUtils.remove_dir(path, true)
|
data/sashimi.gemspec
CHANGED
@@ -44,6 +44,12 @@ class AbstractRepositoryTest < Test::Unit::TestCase
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
+
def test_should_return_all_installed_plugins_names
|
48
|
+
initialize_repository_for_test do
|
49
|
+
assert_equal(['plug-in', 'plugin'], AbstractRepository.plugins_names)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
47
53
|
# DIRECTORIES
|
48
54
|
def test_should_change_current_dir
|
49
55
|
repository.change_dir(repository.class.find_home)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sashimi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-05-
|
12
|
+
date: 2008-05-20 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|