bukin 0.6.0 → 0.7.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/.travis.yml +0 -1
- data/Gemfile +2 -0
- data/README.md +3 -3
- data/bukin.gemspec +2 -2
- data/docs/process.md +24 -0
- data/lib/bukin.rb +54 -2
- data/lib/bukin/bukfile.rb +46 -48
- data/lib/bukin/bukget.rb +63 -0
- data/lib/bukin/bukkit_dl.rb +45 -0
- data/lib/bukin/cli.rb +109 -83
- data/lib/bukin/download.rb +16 -0
- data/lib/bukin/file_match.rb +33 -0
- data/lib/bukin/installer.rb +65 -68
- data/lib/bukin/jenkins.rb +47 -0
- data/lib/bukin/lockfile.rb +23 -21
- data/lib/bukin/resource.rb +17 -0
- data/lib/bukin/version.rb +1 -1
- data/spec/bukfile_spec.rb +0 -16
- data/spec/bukget_spec.rb +56 -0
- data/spec/bukkit_dl_spec.rb +50 -0
- data/spec/cassettes/Bukin_Bukget/chooses_the_version_with_a_jar_file_when_there_are_multiple_versions.yml +61 -0
- data/spec/cassettes/Bukin_Bukget/installs_a_specific_version_of_a_resource.yml +61 -0
- data/spec/cassettes/Bukin_Bukget/installs_the_latest_version_of_a_resource.yml +49 -0
- data/spec/cassettes/Bukin_Bukget/returns_an_error_when_asked_for_a_file_that_does_not_exist.yml +61 -0
- data/spec/cassettes/Bukin_Bukget/returns_an_error_when_asked_for_a_resource_that_doese_not_exist.yml +43 -0
- data/spec/cassettes/Bukin_Bukget/returns_an_error_when_asked_for_a_version_that_doese_not_exist.yml +435 -0
- data/spec/cassettes/Bukin_BukkitDl/chooses_the_first_file_when_there_are_multiple_files.yml +59 -0
- data/spec/cassettes/Bukin_BukkitDl/installs_a_specific_version_of_a_resource.yml +59 -0
- data/spec/cassettes/Bukin_BukkitDl/installs_the_latest_version_of_a_resource.yml +59 -0
- data/spec/cassettes/Bukin_BukkitDl/returns_an_error_when_asked_for_a_file_that_does_not_exist.yml +59 -0
- data/spec/cassettes/Bukin_BukkitDl/returns_an_error_when_asked_for_a_resource_that_doese_not_exist.yml +128 -0
- data/spec/cassettes/Bukin_BukkitDl/returns_an_error_when_asked_for_a_version_that_doese_not_exist.yml +128 -0
- data/spec/cassettes/Bukin_Jenkins/chooses_the_first_file_when_there_are_multiple_files.yml +50 -0
- data/spec/cassettes/Bukin_Jenkins/installs_a_specific_version_of_a_resource.yml +50 -0
- data/spec/cassettes/Bukin_Jenkins/installs_the_latest_version_of_a_resource.yml +49 -0
- data/spec/cassettes/Bukin_Jenkins/returns_an_error_when_asked_for_a_file_that_does_not_exist.yml +50 -0
- data/spec/cassettes/Bukin_Jenkins/returns_an_error_when_asked_for_a_resource_that_doese_not_exist.yml +59 -0
- data/spec/cassettes/Bukin_Jenkins/returns_an_error_when_asked_for_a_version_that_does_not_exist.yml +59 -0
- data/spec/file_match_spec.rb +39 -0
- data/spec/installer_spec.rb +0 -1
- data/spec/jenkins_spec.rb +61 -0
- data/spec/lockfile_spec.rb +8 -8
- data/spec/spec_helper.rb +10 -0
- metadata +57 -26
- data/lib/bukin/exceptions.rb +0 -5
- data/lib/bukin/friendly_errors.rb +0 -22
- data/lib/bukin/providers/bukget.rb +0 -54
- data/lib/bukin/providers/bukkit_dl.rb +0 -29
- data/lib/bukin/providers/jenkins.rb +0 -40
@@ -0,0 +1,33 @@
|
|
1
|
+
module Bukin
|
2
|
+
class FileMatch
|
3
|
+
|
4
|
+
def initialize(search)
|
5
|
+
@search = search
|
6
|
+
end
|
7
|
+
|
8
|
+
def match(file_name)
|
9
|
+
match_helper(@search, file_name)
|
10
|
+
end
|
11
|
+
|
12
|
+
alias_method :=~, :match
|
13
|
+
|
14
|
+
def self.any
|
15
|
+
FileMatch.new(true)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def match_helper(search, file_name)
|
20
|
+
if search == true || search == false
|
21
|
+
search
|
22
|
+
elsif search.is_a? ::String
|
23
|
+
search == file_name
|
24
|
+
elsif search.is_a? ::Regexp
|
25
|
+
search =~ file_name
|
26
|
+
elsif search.respond_to? :any?
|
27
|
+
search.any? {|item| match_helper(item, file_name)}
|
28
|
+
else
|
29
|
+
false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/bukin/installer.rb
CHANGED
@@ -1,87 +1,84 @@
|
|
1
1
|
require 'bukin/lockfile'
|
2
|
-
require 'zip
|
2
|
+
require 'zip'
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
module Bukin
|
5
|
+
class Installer
|
6
|
+
PATHS = { :server => '.', :plugin => 'plugins' }
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
end
|
10
|
-
|
11
|
-
def install(data)
|
12
|
-
path = PATHS[data[:type]]
|
13
|
-
file_names = []
|
14
|
-
dl_data, dl_name = download_file(data[:download])
|
15
|
-
|
16
|
-
if File.extname(dl_name) == '.zip'
|
17
|
-
match = self.get_match(data[:extract])
|
18
|
-
file_names = extract_files(dl_data, path, match)
|
19
|
-
raise Bukin::InstallError, "The resource #{data[:name]} (#{data[:version]}) has no jar files in it's download (zip file)." if file_names.empty?
|
20
|
-
else
|
21
|
-
self.save_download(dl_data, dl_name, path)
|
22
|
-
file_names << dl_name
|
8
|
+
def initialize(path, use_lockfile = false)
|
9
|
+
@lockfile = Bukin::Lockfile.new if use_lockfile
|
23
10
|
end
|
24
11
|
|
25
|
-
|
26
|
-
|
27
|
-
|
12
|
+
def install(resource)
|
13
|
+
path = PATHS[resource.type]
|
14
|
+
file_names = []
|
15
|
+
dl_data, dl_name = download_file(resource.download)
|
16
|
+
|
17
|
+
if File.extname(dl_name) == '.zip'
|
18
|
+
match = self.get_match(resource[:extract])
|
19
|
+
file_names = extract_files(dl_data, path, match)
|
20
|
+
raise Bukin::InstallError, "The resource #{resource.name} (#{resources.version}) has no jar files in it's download (zip file)." if file_names.empty?
|
21
|
+
else
|
22
|
+
save_download(dl_data, dl_name, path)
|
23
|
+
file_names << dl_name
|
24
|
+
end
|
28
25
|
end
|
29
|
-
end
|
30
26
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
27
|
+
def extract_files(file_data, path, match)
|
28
|
+
file_names = []
|
29
|
+
tempfile = Tempfile.new('bukin')
|
30
|
+
begin
|
31
|
+
tempfile.write(file_data)
|
32
|
+
tempfile.close
|
37
33
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
34
|
+
Zip::File.open(tempfile.path) do |zipfile|
|
35
|
+
files = zipfile.find_all {|file| file.name =~ match}
|
36
|
+
files.each do |file|
|
37
|
+
file.extract(File.join(path, file.name)) { true }
|
38
|
+
file_names << file.name
|
39
|
+
end
|
43
40
|
end
|
41
|
+
ensure
|
42
|
+
tempfile.close
|
43
|
+
tempfile.unlink
|
44
44
|
end
|
45
|
-
|
46
|
-
tempfile.close
|
47
|
-
tempfile.unlink
|
45
|
+
file_names
|
48
46
|
end
|
49
|
-
file_names
|
50
|
-
end
|
51
47
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
48
|
+
def save_download(data, name, path)
|
49
|
+
FileUtils.mkdir_p(path)
|
50
|
+
open("#{path}/#{name}", "wb") do |file|
|
51
|
+
file.print data
|
52
|
+
end
|
56
53
|
end
|
57
|
-
end
|
58
54
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
55
|
+
def download_file(url, content_disposition = false)
|
56
|
+
open(url, "User-Agent" => "Bukin #{Bukin::VERSION}") do |download|
|
57
|
+
file_name = if download.meta['content-disposition']
|
58
|
+
download.meta['content-disposition'].match(/filename=(\"?)(.+)\1/)[2]
|
59
|
+
else
|
60
|
+
File.basename(url)
|
61
|
+
end
|
62
|
+
file_name = file_name.force_encoding('UTF-8') if file_name.respond_to?(:force_encoding)
|
63
|
+
data = download.read
|
64
|
+
return data, file_name
|
65
|
+
end
|
69
66
|
end
|
70
|
-
end
|
71
67
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
68
|
+
def get_match(match)
|
69
|
+
case match
|
70
|
+
when Regexp
|
71
|
+
match
|
72
|
+
when String
|
73
|
+
/^#{Regexp.quote(match)}$/
|
74
|
+
when :all
|
75
|
+
//
|
76
|
+
when nil
|
77
|
+
/\.jar$/
|
78
|
+
else
|
79
|
+
raise Bukin::InstallError, "The extract option #{match} is not valid. Please use a String, Regexp or :all"
|
80
|
+
end
|
84
81
|
end
|
85
|
-
end
|
86
82
|
|
83
|
+
end
|
87
84
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'cgi'
|
3
|
+
require 'bukin/file_match'
|
4
|
+
|
5
|
+
module Bukin
|
6
|
+
# Api for downloading from jenkins
|
7
|
+
class Jenkins
|
8
|
+
attr_reader :url
|
9
|
+
|
10
|
+
VERSION = 'lastSuccessfulBuild'
|
11
|
+
GOOD_VERSIONS = "'build-125'"
|
12
|
+
|
13
|
+
def initialize(url)
|
14
|
+
@url = url
|
15
|
+
end
|
16
|
+
|
17
|
+
def find(data)
|
18
|
+
name = data[:name]
|
19
|
+
version = data[:version]
|
20
|
+
match = data[:file] ? FileMatch.new(data[:file]) : FileMatch.any
|
21
|
+
|
22
|
+
if version.nil? || version == VERSION
|
23
|
+
build = VERSION
|
24
|
+
elsif correct_version_format?(version)
|
25
|
+
build = version[/^build-([0-9]+)$/, 1]
|
26
|
+
else
|
27
|
+
raise VersionError.new(name, version, GOOD_VERSIONS)
|
28
|
+
end
|
29
|
+
|
30
|
+
base_path = "#{@url}/job/#{CGI.escape(name)}/#{CGI.escape(build)}"
|
31
|
+
|
32
|
+
info = Bukin.try_get_json("#{base_path}/api/json")
|
33
|
+
raise NoDownloadError.new(name, version) unless info
|
34
|
+
|
35
|
+
download_info = info['artifacts'].find{|file| match =~ file['fileName']}
|
36
|
+
raise NoDownloadError.new(name, version) unless download_info
|
37
|
+
|
38
|
+
download = "#{base_path}/artifact/#{download_info['relativePath']}"
|
39
|
+
return "build-#{info['number']}", download
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
def correct_version_format?(version)
|
44
|
+
version == VERSION || /^build-[0-9]+$/.match(version)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/bukin/lockfile.rb
CHANGED
@@ -1,29 +1,31 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
module Bukin
|
4
|
+
class Lockfile
|
5
|
+
FILE_NAME = 'Bukfile.lock'
|
6
|
+
attr_reader :path
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
def initialize(path = nil)
|
9
|
+
@path = path || File.join(Dir.pwd, FILE_NAME)
|
10
|
+
@resources = File.exist?(@path) ? YAML::load_file(@path) : {}
|
11
|
+
@resources = { 'resources' => {} } if @resources['resources'].nil?
|
12
|
+
end
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
14
|
+
def add(data)
|
15
|
+
name = data[:name]
|
16
|
+
resources[name] = {
|
17
|
+
'version' => data[:version],
|
18
|
+
'files' => data[:files]
|
19
|
+
}
|
20
|
+
save
|
21
|
+
end
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
23
|
+
def resources
|
24
|
+
@resources['resources']
|
25
|
+
end
|
25
26
|
|
26
|
-
|
27
|
-
|
27
|
+
def save
|
28
|
+
File.open(@path, "w") {|file| file.write @resources.to_yaml}
|
29
|
+
end
|
28
30
|
end
|
29
31
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Bukin
|
2
|
+
class Resource
|
3
|
+
attr_reader :type, :name, :version, :download
|
4
|
+
|
5
|
+
def initialize(data, version, download)
|
6
|
+
@type = data[:type]
|
7
|
+
@name = data[:name]
|
8
|
+
@version = version
|
9
|
+
@download = download
|
10
|
+
@data = data
|
11
|
+
end
|
12
|
+
|
13
|
+
def [](key)
|
14
|
+
@data[key]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/bukin/version.rb
CHANGED
data/spec/bukfile_spec.rb
CHANGED
@@ -70,22 +70,6 @@ describe Bukin::Bukfile do
|
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
-
it "adds a server with the correct provider" do
|
74
|
-
bukfile = Bukin::Bukfile.new do
|
75
|
-
server 'resource_name'
|
76
|
-
end
|
77
|
-
|
78
|
-
bukfile.resources.first[:bukkit_dl].should == Bukin::BukkitDl::DEFAULT_URL
|
79
|
-
end
|
80
|
-
|
81
|
-
it "adds a plugin with the correct provider" do
|
82
|
-
bukfile = Bukin::Bukfile.new do
|
83
|
-
plugin 'resource_name'
|
84
|
-
end
|
85
|
-
|
86
|
-
bukfile.resources.first[:bukget].should == Bukin::Bukget::DEFAULT_URL
|
87
|
-
end
|
88
|
-
|
89
73
|
it 'adds both plugins and servers' do
|
90
74
|
bukfile = Bukin::Bukfile.new do
|
91
75
|
server 'craftbukkit'
|
data/spec/bukget_spec.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'bukin'
|
3
|
+
|
4
|
+
describe Bukin::Bukget, :vcr do
|
5
|
+
before do
|
6
|
+
@name = 'worldedit'
|
7
|
+
@version = '5.5.8'
|
8
|
+
@download = 'http://dev.bukkit.org/media/files/739/931/worldedit-5.5.8.jar'
|
9
|
+
@missing_name = 'missing-name'
|
10
|
+
@missing_version = '0.0.0'
|
11
|
+
@missing_file = 'missing-file.jar'
|
12
|
+
@latest_version = '5.5.8'
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'installs the latest version of a resource' do
|
16
|
+
provider = Bukin::Bukget.new
|
17
|
+
version, download = provider.find(name: @name)
|
18
|
+
|
19
|
+
version.should == @latest_version
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'installs a specific version of a resource' do
|
23
|
+
provider = Bukin::Bukget.new
|
24
|
+
version, download = provider.find(name: @name, version: @version)
|
25
|
+
|
26
|
+
version.should == @version
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'returns an error when asked for a resource that doese not exist' do
|
30
|
+
provider = Bukin::Bukget.new
|
31
|
+
expect do
|
32
|
+
provider.find(name: @missing_name)
|
33
|
+
end.to raise_error(Bukin::NoDownloadError)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'returns an error when asked for a version that doese not exist' do
|
37
|
+
provider = Bukin::Bukget.new
|
38
|
+
expect do
|
39
|
+
provider.find(name: @name, version: @missing_version)
|
40
|
+
end.to raise_error(Bukin::NoDownloadError)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'returns an error when asked for a file that does not exist' do
|
44
|
+
provider = Bukin::Bukget.new
|
45
|
+
expect do
|
46
|
+
provider.find(name: @name, version: @version, file: @missing_file)
|
47
|
+
end.to raise_error(Bukin::NoDownloadError)
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'chooses the version with a .jar file when there are multiple versions' do
|
51
|
+
provider = Bukin::Bukget.new
|
52
|
+
version, download = provider.find(name: @name, version: @version)
|
53
|
+
|
54
|
+
download.should == @download
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'bukin'
|
3
|
+
|
4
|
+
describe Bukin::BukkitDl, :vcr do
|
5
|
+
before do
|
6
|
+
@name = 'craftbukkit'
|
7
|
+
@version = 'build-2912'
|
8
|
+
@download = 'http://dl.bukkit.org/downloads/craftbukkit/get/'\
|
9
|
+
'02381_1.6.4-R1.0/craftbukkit.jar'
|
10
|
+
@missing_name = 'missing-name'
|
11
|
+
@missing_version = 'build-0000'
|
12
|
+
@missing_file = 'missing-file.jar'
|
13
|
+
@latest_version = 'build-2918'
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'installs the latest version of a resource' do
|
17
|
+
provider = Bukin::BukkitDl.new
|
18
|
+
version, download = provider.find(name: @name)
|
19
|
+
|
20
|
+
version.should == @latest_version
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'installs a specific version of a resource' do
|
24
|
+
provider = Bukin::BukkitDl.new
|
25
|
+
version, download = provider.find(name: @name, version: @version)
|
26
|
+
|
27
|
+
version.should == @version
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'returns an error when asked for a resource that doese not exist' do
|
31
|
+
provider = Bukin::BukkitDl.new
|
32
|
+
expect do
|
33
|
+
provider.find(name: @missing_name)
|
34
|
+
end.to raise_error(Bukin::NoDownloadError)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'returns an error when asked for a version that doese not exist' do
|
38
|
+
provider = Bukin::BukkitDl.new
|
39
|
+
expect do
|
40
|
+
provider.find(name: @name, version: @missing_version)
|
41
|
+
end.to raise_error(Bukin::NoDownloadError)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'chooses the first file when there are multiple files' do
|
45
|
+
provider = Bukin::BukkitDl.new
|
46
|
+
version, download = provider.find(name: @name, version: @version)
|
47
|
+
|
48
|
+
download.should == @download
|
49
|
+
end
|
50
|
+
end
|