vimget 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Configure management
4
+ #
5
+ # 2008 (c) Eddy Xu <eddyxu@gmail.com>
6
+ #
7
+ # $Id: configure.rb 3 2008-04-02 20:47:49Z eddyxu $
8
+
9
+
10
+ module VimGet
11
+
12
+ class << self
13
+ def configure
14
+ @configure ||= Configure.new
15
+ end
16
+ end
17
+
18
+ class Configure
19
+ attr_reader :base_dir, :db_dir, :distfiles_dir, :vim_dir
20
+ attr_accessor :debug, :verbose
21
+
22
+ def initialize
23
+ @base_dir = "~/.vimget"
24
+ @vim_dir = "~/.vim"
25
+ @db_dir = File.join(@base_dir, "db")
26
+ @distfiles_dir = File.join(@base_dir, "distfiles")
27
+ @debug = false
28
+ end
29
+
30
+
31
+ end
32
+
33
+ end
data/lib/vimget/db.rb ADDED
@@ -0,0 +1,139 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # manage local script index database
4
+ #
5
+ # $Id: db.rb 5 2008-04-11 18:33:39Z eddyxu $
6
+
7
+ require "vimget/configure"
8
+ require "vimget/script"
9
+
10
+ module VimGet
11
+
12
+ class << self
13
+ def db
14
+ @db ||= VimGet::PathDB.new
15
+ end
16
+ end
17
+
18
+ class PathDB
19
+ @@EXT = ".manifest"
20
+ attr_reader :db_path
21
+
22
+ def initialize(parent_path = "")
23
+ parent_path = VimGet.configure.base_dir if parent_path.empty?
24
+
25
+ @db_path = File.expand_path(File.join(parent_path, "db"))
26
+ Dir.mkdir(@db_path) if !File.exist?(@db_path)
27
+ end
28
+
29
+ def add(script)
30
+ file_path = File.join(@db_path, script.name + @@EXT)
31
+ file_path = File.expand_path(file_path)
32
+ File.open(file_path, 'w') do |f|
33
+ f.truncate(0)
34
+
35
+ ctx = <<-SCRIPT
36
+ # this file is automatical generate by vim-get. Do not motifiy it manualy.
37
+
38
+ name #{script.name}
39
+ id #{script.sid}
40
+ author #{script.author}
41
+ installed #{script.installed}
42
+ version #{script.version}
43
+ download #{script.download}
44
+
45
+ manifest {
46
+ #{script.manifest.dup.collect! {|l| l = " #{l}\n"}}}
47
+
48
+ SCRIPT
49
+ f.write(ctx)
50
+ end
51
+ end
52
+
53
+
54
+ def update(script)
55
+ if script.manifest.empty?
56
+ filepath = File.join(@db_path, script.name + @@EXT)
57
+ s = parse_script(filepath)
58
+ script.manifest = s.manifest if s
59
+ end
60
+
61
+ add(script)
62
+ end
63
+
64
+ def remove(script)
65
+ file_path = File.join(@db_path, script.name + @@EXT)
66
+ file_path = File.expand_path(file_path)
67
+ File.delete(file_path)
68
+ end
69
+
70
+ def search(pattern = "")
71
+ file_list = Array.new
72
+ glob_pattern = (pattern.nil? or pattern.empty?) ? "*" : "*#{pattern}*"
73
+
74
+ glob_pattern = File.expand_path(File.join(@db_path, glob_pattern + ".manifest"))
75
+ file_list = Dir.glob(glob_pattern)
76
+
77
+ ret = Array.new
78
+ closure = ""
79
+ file_list.each do |f|
80
+ ret << parse_script(f)
81
+ end
82
+ ret
83
+ end
84
+
85
+ def find_with_id(sid)
86
+ search.each { |s| return s if s.sid == sid }
87
+ return nil
88
+ end
89
+
90
+ def find(name)
91
+ # find a script by using name, if not one finded, return nil
92
+ search.each { |s| return s if s.name == name }
93
+ return nil
94
+ end
95
+
96
+ def get_outdated_scripts
97
+ scripts = search()
98
+
99
+ ret_array = Array.new
100
+ scripts.each { |s| ret_array << s if s.outdated? }
101
+ return ret_array
102
+ end
103
+
104
+ private
105
+
106
+ def parse_script(filepath)
107
+ return nil if !File.exist?(filepath)
108
+ ctn = {}
109
+ closure = ""
110
+ File.open(filepath, "r").each_line do |line|
111
+ line.gsub!(/\#.*$/, "")
112
+ next if line.nil?
113
+ line.strip!
114
+ next if line.empty?
115
+
116
+ if line.include? "{"
117
+ closure = "manifest"
118
+ ctn["manifest"] = []
119
+ elsif line.include? "}"
120
+ closure = ""
121
+ elsif ! closure.empty?
122
+ ctn["manifest"] << line
123
+ else
124
+ k,*v = line.split
125
+ ctn[k] = v.join(" ")
126
+ end
127
+ end
128
+
129
+ s = Script.new(ctn["id"].to_i, ctn["name"])
130
+ s.download = ctn["download"]
131
+ s.version = ctn["version"]
132
+ s.installed = ctn["installed"]
133
+ s.manifest = ctn["manifest"]
134
+ s.author = ctn["author"]
135
+ return s
136
+ end
137
+ end
138
+
139
+ end
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # VimGet exceptions
4
+ #
5
+ # Eddy Xu <eddyxu@gmail.com>
6
+ #
7
+ # 2008 (c) Quarkware.com
8
+ #
9
+ # $Id: exceptions.rb 3 2008-04-02 20:47:49Z eddyxu $
10
+
11
+ module VimGet
12
+
13
+ # base exception
14
+ class Exception < RuntimeError; end
15
+
16
+ class CommandLineError < VimGet::Exception; end
17
+
18
+ class InstallError < VimGet::Exception; end
19
+
20
+ class UnknownScriptError < VimGet::Exception; end
21
+
22
+ class NetworkError < VimGet::Exception; end
23
+
24
+ end
@@ -0,0 +1,158 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # File installer.rb
4
+ #
5
+ # Brief act the install operations
6
+ #
7
+ # Author Eddy Xu <eddyxu@gmail.com>
8
+ #
9
+ # Copyright 2008 (c) Quarkware.com
10
+ #
11
+ # $Id: installer.rb 6 2008-04-11 19:01:26Z eddyxu $
12
+
13
+ require 'fileutils'
14
+ require 'open-uri'
15
+ require "vimget/configure"
16
+ require "vimget/script"
17
+ require "vimget/db"
18
+
19
+ module VimGet
20
+
21
+ class Installer
22
+ # Manage the installing progress and uninstall/upgrading etc
23
+ def initialize(opts = {})
24
+ @options = opts
25
+ #@dist_path = VimGet.configure.distfiles_dir
26
+ end
27
+
28
+ def install(script)
29
+ filepath = fetch(script)
30
+ script.manifest = extract(filepath)
31
+
32
+ script.installed = script.version
33
+ VimGet.db.update(script) unless @options[:dry_run]
34
+ end
35
+
36
+ def uninstall(script)
37
+ puts "#{script.name} is not installed yet.";return if !script.installed?
38
+
39
+ puts "Uninstalling #{script.name}..."
40
+ remove_manifest(script)
41
+
42
+ if @options[:purge]
43
+ print "Delete manifest file of #{script.name}..."
44
+ VimGet.db.remove(script)
45
+ puts "Done"
46
+ else
47
+ script.installed = ""
48
+ VimGet.db.update(script)
49
+ end
50
+ end
51
+
52
+ def upgrade(script)
53
+ puts "#{script.name} is not installed yet."; return if !script.installed?
54
+
55
+ puts "Upgrading #{script.name}-#{script.installed}(Relacing by #{script.version})..."
56
+ remove_manifest(script)
57
+ install(script)
58
+ end
59
+
60
+ def fetch(script)
61
+ #raise RuntimeError if script.kind_of? Script
62
+
63
+ url = "http://www.vim.org/scripts/#{script.download}"
64
+ print "Downloading...#{url}..." unless @options[:verbose]
65
+ STDOUT.flush
66
+ distfile = ""
67
+ open(url) do |f|
68
+ if f.meta["content-disposition"] =~ /filename=(.+)/
69
+ filename = $1
70
+ else
71
+ raise NetworkError, "Can not find appropiated filename"
72
+ end
73
+
74
+ puts filename
75
+
76
+ distfile = File.join(VimGet.configure.distfiles_dir, filename)
77
+ puts "Saving in #{distfile}" if VimGet.configure.verbose
78
+ File.open(File.expand_path(distfile), "w") do |df|
79
+ df.truncate(0)
80
+ df.write(f.read)
81
+ end
82
+ end
83
+ return distfile
84
+ end
85
+
86
+ def extract(filepath)
87
+ abs_file = File.expand_path(filepath)
88
+ raise InstallError, "File #{filepath} is not existed!" if not File.exist? abs_file
89
+ FileUtils.mkdir_p(File.expand_path(VimGet.configure.vim_dir)) if not File.exist? VimGet.configure.vim_dir
90
+
91
+ ext = File.extname(abs_file)
92
+ case ext
93
+ when ".zip"
94
+ extract_zip abs_file
95
+ when ".rar"
96
+ extract_rar abs_file
97
+ when ".tgz", ".gz"
98
+ extract_tar(abs_file, "xzof")
99
+ when ".bz", ".bz2",".tbz"
100
+ extract_tar(abs_file, "xjof")
101
+ when ".vim"
102
+ FileUtils.cp abs_file, File.expand_path(File.join(VimGet.configure.vim_dir, "plugin"))
103
+ ["#{File.join("plugin", File.basename(abs_file))}"]
104
+ else
105
+ raise InstallError, "Unknown ext name: #{ext}"
106
+ end
107
+ end
108
+
109
+ private
110
+
111
+ def extract_zip(filepath)
112
+ cmd = "unzip -o #{filepath} -d #{VimGet.configure.vim_dir}"
113
+ puts cmd if VimGet.configure.verbose
114
+ manifest = []
115
+ IO.popen(cmd, "r") do |p|
116
+ p.each_line do |l|
117
+ manifest << $1 if l =~ /inflating\: #{File.expand_path(VimGet.configure.vim_dir)}\/(.+)/
118
+ end
119
+ end
120
+ manifest
121
+ end
122
+
123
+ def extract_rar
124
+ nil
125
+ end
126
+
127
+ def extract_tar(filepath, flags)
128
+ manifest = []
129
+ IO.popen("tar -tf #{filepath}", "r") do |p|
130
+ p.each_line { |l| manifest << l.strip() }
131
+ end
132
+
133
+ cmd = "tar -C #{File.expand_path(VimGet.configure.vim_dir)} -#{flags} #{filepath} "
134
+ puts cmd if @options[:verbose]
135
+ system(cmd)
136
+
137
+ manifest
138
+ end
139
+
140
+ def absolute_vim_path(related_path)
141
+ File.expand_path(File.join(VimGet.configure.vim_dir, related_path))
142
+ end
143
+
144
+ def remove_manifest(script)
145
+ script.manifest.each do |f|
146
+ abs_path = absolute_vim_path(f)
147
+ print " Deleting #{abs_path}..." if @options[:verbose]
148
+ if not File.exist?(abs_path)
149
+ puts "Missing!" if @options[:verbose]
150
+ next
151
+ end
152
+ File.delete(abs_path) unless @options[:dry_run]
153
+ puts "Ok" if @options[:verbose]
154
+ end
155
+ end
156
+ end
157
+
158
+ end
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # @file script.py
4
+ #
5
+ # @brief encapusulate script attributes
6
+ #
7
+ # @author Eddy Xu <eddyxu@gmail.com>
8
+ #
9
+ # $Id: script.rb 3 2008-04-02 20:47:49Z eddyxu $
10
+
11
+ require 'rubygems'
12
+
13
+ module VimGet
14
+
15
+ class Script # < Hash?
16
+ attr_reader :sid, :name
17
+ attr_accessor :author, :installed, :version, :download, :manifest
18
+
19
+ def initialize(id, name="", author="", version="", installed="", download="",
20
+ manifest=[])
21
+ @sid = id
22
+ @name = name
23
+ @author = author
24
+ @version = version
25
+ @installed = installed
26
+ @download = download
27
+ @manifest = manifest
28
+ end
29
+
30
+ def [](key)
31
+ # act as a hash
32
+ end
33
+
34
+ def to_s
35
+ "#{@name}(#{@sid}): #{@version} <= #{@installed}\n" +
36
+ "By: #{@author} from #{@download}"
37
+ end
38
+
39
+ def outdated?
40
+ if @installed.empty?
41
+ false
42
+ elsif @installed.to_f < @version.to_f
43
+ true
44
+ elsif @installed < @version
45
+ true
46
+ else
47
+ false
48
+ end
49
+ end
50
+
51
+ def installed?
52
+ return !installed.empty?
53
+ end
54
+ end
55
+
56
+ end
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id: webparser.rb 3 2008-04-02 20:47:49Z eddyxu $
4
+
5
+ require 'rubygems'
6
+ require 'hpricot'
7
+ require 'open-uri'
8
+ require 'vimget/script'
9
+
10
+ module VimGet
11
+
12
+ def VimGet.parse_script_page(sid)
13
+ url = "http://www.vim.org/scripts/script.php?script_id=#{sid}"
14
+ puts "Fetching...#{url}..."
15
+ doc = Hpricot(open(url))
16
+
17
+ name = (doc/'title').inner_html.split(" - ")[0]
18
+ script = Script.new(sid, name)
19
+
20
+ table = (doc/"//tr[@class='tableheader']")[0]
21
+ top_row = table.next_sibling()
22
+
23
+ if top_row
24
+ ctns = top_row.containers()
25
+ script.download = ctns[0].at('a').attributes['href']
26
+ script.version = ctns[1].at('b').inner_text
27
+ script.author = ctns[4].at('a').inner_text
28
+ end
29
+
30
+ return script
31
+ end
32
+
33
+ end
data/lib/vimget.rb ADDED
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ruby -wKU
2
+ #
3
+ # Main file for vim-get application
4
+ #
5
+ # Copyright GPLv2
6
+ #
7
+ # $Id: vimget.rb 5 2008-04-11 18:33:39Z eddyxu $
8
+
9
+ require "vimget/command_manager"
10
+
11
+ VIMGET_VERSION = "0.1.0"
12
+
13
+ module VimGet
14
+
15
+ # Singleton access point
16
+ class << self
17
+ def application
18
+ @application ||= VimGet::Application.new
19
+ end
20
+
21
+ def application=(app)
22
+ @application = app
23
+ end
24
+ end
25
+
26
+ #-----------------------------------------------------
27
+ # VimGet application class
28
+ class Application
29
+ def initialize
30
+
31
+ end
32
+
33
+ def run
34
+ CommandManager.instance.run(ARGV)
35
+ end
36
+ end
37
+ end
data/test/tc_db.rb ADDED
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # test case for db.rb
4
+ #
5
+ # $Id: tc_db.rb 4 2008-04-07 19:16:34Z eddyxu $
6
+
7
+ require 'test/unit'
8
+ require "vimget/db"
9
+ require "vimget/script"
10
+ require "tmpdir"
11
+
12
+ class TestDB < Test::Unit::TestCase
13
+ def setup
14
+ @basedir = Dir.tmpdir
15
+ end
16
+
17
+ def teardown
18
+ nil
19
+ end
20
+
21
+ def test_find
22
+ nil
23
+ end
24
+
25
+ def test_add
26
+ s = VimGet::Script.new("123", "test")
27
+ s.author = "Eddy Xu"
28
+ s.installed = "4.23"
29
+ s.version = "5.23"
30
+ s.download = "download?from=somewhere"
31
+ s.manifest = ["plugin/taglist.vim", "doc/taglist.txt"]
32
+
33
+ db = VimGet::PathDB.new(@basedir)
34
+
35
+ db.add(s)
36
+
37
+ expected_filepath = File.join(@basedir, "db", "test.manifest")
38
+ assert(File.exist?(expected_filepath), "Failed to create script manifest.")
39
+
40
+ end
41
+
42
+ def test_update
43
+ s = VimGet::Script.new("123", "test")
44
+ end
45
+ end
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Test Case for Installer class
4
+ #
5
+ # $Id: tc_installer.rb 5 2008-04-11 18:33:39Z eddyxu $
6
+
7
+ require 'test/unit'
8
+ require 'vimget/installer'
9
+
10
+ class TestInstaller < Test::Unit::TestCase
11
+ def setup
12
+ end
13
+
14
+ def teardown
15
+ end
16
+
17
+ def test_fetch
18
+ end
19
+
20
+ def test_install
21
+
22
+ end
23
+ end
data/test/tc_script.rb ADDED
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # test case for script.rb
4
+ #
5
+ # author: Eddy Xu <eddyxu@gmail.com>
6
+ #
7
+ # $Id: tc_script.rb 3 2008-04-02 20:47:49Z eddyxu $
8
+
9
+ require 'test/unit'
10
+ require 'vimget/script'
11
+
12
+ class TestScript < Test::Unit::TestCase
13
+ def setup
14
+
15
+ end
16
+
17
+ def teardown
18
+
19
+ end
20
+
21
+ def test_outdated
22
+ s = VimGet::Script.new(32, "test", "eddyxu", "2.3", "3.2")
23
+ assert_equal(false, s.outdated?)
24
+
25
+ s.version = "4.3"
26
+ assert_equal(true, s.outdated?)
27
+
28
+ s.installed = "2.3"
29
+ assert_equal(true, s.outdated?)
30
+
31
+ s.installed = "4.3"
32
+ assert_equal(false, s.outdated?)
33
+
34
+ s.version = "4.32"
35
+ assert_equal(true, s.outdated?)
36
+
37
+ s.version = "2.33"
38
+ assert_equal(false, s.outdated?)
39
+
40
+ s.installed = "2.3"
41
+ s.version = "2.3a"
42
+ assert_equal(true, s.outdated?)
43
+
44
+ s.installed = "2.3b"
45
+ s.version = "2.3c"
46
+ assert_equal(true, s.outdated?)
47
+
48
+ s.version = "2.4"
49
+ assert_equal(true, s.outdated?)
50
+
51
+ s.version = "2.4c"
52
+ assert_equal(true, s.outdated?)
53
+ end
54
+
55
+ def test_parse
56
+ end
57
+ end
data/test/ts_vimget.rb ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Test suite for vimget
4
+ #
5
+ # $Id: ts_vimget.rb 5 2008-04-11 18:33:39Z eddyxu $
6
+
7
+ $: << "#{File.dirname(__FILE__)}/../lib"
8
+
9
+ require 'tc_db'
10
+ require 'tc_installer'
11
+ require 'tc_script'
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vimget
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Eddy Xu
8
+ autorequire: vimget
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-04-12 00:00:00 +08:00
13
+ default_executable:
14
+ - vim-get
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: hpricot
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.6.0
24
+ version:
25
+ description: vim-get is a automatatical manager tools which used to auto update vim scripts
26
+ email: eddyxu@gmail.com
27
+ executables:
28
+ - vim-get
29
+ extensions: []
30
+
31
+ extra_rdoc_files: []
32
+
33
+ files:
34
+ - bin/vim-get
35
+ - test/tc_db.rb
36
+ - test/tc_installer.rb
37
+ - test/tc_script.rb
38
+ - test/ts_vimget.rb
39
+ - lib/vimget
40
+ - lib/vimget/command.rb
41
+ - lib/vimget/command_manager.rb
42
+ - lib/vimget/commands
43
+ - lib/vimget/commands/clean_command.rb
44
+ - lib/vimget/commands/install_command.rb
45
+ - lib/vimget/commands/installed_command.rb
46
+ - lib/vimget/commands/list_command.rb
47
+ - lib/vimget/commands/outdated_command.rb
48
+ - lib/vimget/commands/sync_command.rb
49
+ - lib/vimget/commands/uninstall_command.rb
50
+ - lib/vimget/commands/upgrade_command.rb
51
+ - lib/vimget/configure.rb
52
+ - lib/vimget/db.rb
53
+ - lib/vimget/exceptions.rb
54
+ - lib/vimget/installer.rb
55
+ - lib/vimget/script.rb
56
+ - lib/vimget/webparser.rb
57
+ - lib/vimget.rb
58
+ has_rdoc: true
59
+ homepage: http://www.xulei.org/projects/vimget
60
+ post_install_message:
61
+ rdoc_options: []
62
+
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: "0"
70
+ version:
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: "0"
76
+ version:
77
+ requirements: []
78
+
79
+ rubyforge_project:
80
+ rubygems_version: 1.1.1
81
+ signing_key:
82
+ specification_version: 2
83
+ summary: An vim script tool
84
+ test_files:
85
+ - test/ts_vimget.rb