bukin 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,3 +1,6 @@
1
1
  # Bukin
2
2
 
3
3
  Plugin and server package manager for Minecraft
4
+
5
+ [![Dependency Status](https://gemnasium.com/Nullreff/bukin.png)](https://gemnasium.com/Nullreff/bukin)
6
+ [![Code Climate](https://codeclimate.com/github/Nullreff/bukin.png)](https://codeclimate.com/github/Nullreff/bukin)
@@ -1,6 +1,7 @@
1
1
  require 'bukin/version'
2
2
  require 'bukin/cli'
3
3
  require 'bukin/friendly_errors'
4
+ require 'bukin/exceptions'
4
5
 
5
6
  module Bukin
6
7
  end
@@ -22,15 +22,25 @@ class Bukin::Bukfile
22
22
  @plugins_info = []
23
23
  end
24
24
 
25
- def server(name, version = 'latest-rb')
26
- unless @server_info
27
- @server_info = { name: name, version: version }
28
- else
25
+ def server(name, *args)
26
+ if @server_info
29
27
  abort("Error: There is more than one server declared in your #{FILE_NAME}")
30
28
  end
29
+
30
+ options = args.last.is_a?(Hash) ? args.pop : {}
31
+ version = args.pop || nil
32
+
33
+ @server_info = { name: name, version: version }.merge(options)
31
34
  end
32
35
 
33
- def plugin(name, version = 'latest')
34
- @plugins_info << { name: name, version: version }
36
+ def plugin(name, *args)
37
+ if @plugins_info.find { |p| p[:name] == name }
38
+ abort("Error: You declared the plugin #{name} more than once in your #{FILE_NAME}")
39
+ end
40
+
41
+ options = args.last.is_a?(Hash) ? args.pop : {}
42
+ version = args.pop || nil
43
+
44
+ @plugins_info << { name: name, version: version }.merge(options)
35
45
  end
36
46
  end
@@ -21,28 +21,26 @@ class Bukin::CLI < Thor
21
21
  bukget = Bukin::Bukget.new
22
22
 
23
23
  section "Fetching information from #{bukkit_dl.url}" do
24
- info = bukkit_dl.info(server[:name], server[:version])
25
- server[:download_version] = info['version']
26
- server[:download_build] = "build-#{info['build_number']}"
24
+ bukkit_dl.resolve_info(server)
27
25
  end
28
26
 
29
27
  section "Fetching information from #{bukget.url}" do
30
- plugins.each do |plugin|
31
- info = bukget.info(plugin[:name], plugin[:version], server[:name])
32
- plugin[:download_version] = info['versions'][0]['version']
28
+ plugins.map do |plugin|
29
+ plugin[:server] ||= server[:name]
30
+ bukget.resolve_info(plugin)
33
31
  end
34
32
  end
35
33
 
36
34
  # Download and install server and plugins
37
35
  installer = Bukin::Installer.new(Dir.pwd, true)
38
36
 
39
- section "Downloading #{server[:name]} (#{server[:download_version]})" do
40
- installer.install(:server, bukkit_dl, server[:name], server[:download_build])
37
+ downloading server[:name], server[:display_version] do
38
+ installer.install(:server, bukkit_dl, server)
41
39
  end
42
40
 
43
41
  plugins.each do |plugin|
44
- section "Downloading #{plugin[:name]} (#{plugin[:download_version]})" do
45
- installer.install(:plugin, bukget, plugin[:name], plugin[:download_version], server[:name])
42
+ downloading plugin[:name], plugin[:version] do
43
+ installer.install(:plugin, bukget, plugin)
46
44
  end
47
45
  end
48
46
  end
@@ -63,4 +61,10 @@ private
63
61
  say 'Error', :red
64
62
  raise ex
65
63
  end
64
+
65
+ def downloading(name, version, &block)
66
+ msg = "Downloading #{name}"
67
+ msg << " (#{version})" if version
68
+ section(msg, &block)
69
+ end
66
70
  end
@@ -0,0 +1,5 @@
1
+ module Bukin
2
+ class BukinError < StandardError; end
3
+ class BukfileError < BukinError; end
4
+ class InstallError < BukinError; end
5
+ end
@@ -3,6 +3,8 @@ require 'socket'
3
3
  module Bukin
4
4
  def self.with_friendly_errors
5
5
  yield
6
+ rescue BukinError => error
7
+ abort error.message
6
8
  rescue SocketError => error
7
9
  abort "#{error.message}\nCheck that you have a stable connection and the service is online"
8
10
  rescue Errno::ENOENT => error
@@ -9,14 +9,15 @@ class Bukin::Installer
9
9
  @paths = { server: path, plugin: "#{path}/plugins" }
10
10
  end
11
11
 
12
- def install(type, provider, *args)
12
+ def install(type, provider, data)
13
13
  unless @paths.keys.include?(type)
14
14
  raise(ArgumentError, "You must specify one of the following types to install: #{@paths.keys.to_s}")
15
15
  end
16
- data, file_name = provider.download(*args)
17
- save_download(data, file_name, @paths[type])
16
+ file_data, file_name = download_file(data[:download])
17
+ save_download(file_data, file_name, @paths[type])
18
18
  if @lockfile
19
- @lockfile.add(type, args[0], args[1], file_name)
19
+ data[:file] = file_name
20
+ @lockfile.add(type, data)
20
21
  end
21
22
  end
22
23
  end
@@ -15,28 +15,28 @@ class Bukin::Lockfile
15
15
  end
16
16
  end
17
17
 
18
- def set_server(name, version, file)
18
+ def set_server(data)
19
19
  self.server = {
20
- 'name' => name,
21
- 'version' => version,
22
- 'file' => file
20
+ 'name' => data[:name],
21
+ 'version' => data[:version],
22
+ 'file' => data[:file]
23
23
  }
24
24
  end
25
25
 
26
- def add_plugin(name, version, *files)
27
- self.plugins[name] = {
28
- 'version' => version,
29
- 'files' => files
26
+ def add_plugin(data)
27
+ self.plugins[data[:name]] = {
28
+ 'version' => data[:version],
29
+ 'files' => data[:files] || [data[:file]]
30
30
  }
31
31
  save
32
32
  end
33
33
 
34
- def add(type, *args)
34
+ def add(type, data)
35
35
  case type
36
36
  when :server
37
- set_server(*args)
37
+ set_server(data)
38
38
  when :plugin
39
- add_plugin(*args)
39
+ add_plugin(data)
40
40
  else
41
41
  raise(ArgumentError, "You must specify :server or :plugin as the type when adding to a lock file")
42
42
  end
@@ -1,5 +1,6 @@
1
1
  require 'bukin/utils'
2
2
  require 'json'
3
+ require 'cgi'
3
4
 
4
5
  # BukGet api
5
6
  # Docs: http://bukget.org/pages/docs/API3.html
@@ -14,15 +15,36 @@ class Bukin::Bukget
14
15
  "#{url}/3"
15
16
  end
16
17
 
17
- def download(name, version, server)
18
+ def resolve_info(data)
19
+ return data if data[:download]
20
+
21
+ name = data[:name]
22
+ version = data[:version] || 'latest'
23
+ server = data[:server]
18
24
  server = 'bukkit' if server == 'craftbukkit'
19
- url = "#{api_url}/plugins/#{server}/#{name}/#{version}/download"
20
- download_file(url, true)
25
+
26
+ url = "#{api_url}/plugins/#{CGI.escape(server)}/#{CGI.escape(name)}/#{CGI.escape(version)}"
27
+ info = JSON.parse(open(url).read)
28
+
29
+ versions = info['versions']
30
+ if versions.empty?
31
+ raise Bukin::InstallError, "The plugin #{name} (#{version}) has no available downloads from BukGet."
32
+ end
33
+
34
+ version_data = versions.find {|version_data| jar_extension?(version_data)}
35
+ if version_data
36
+ data[:version] = version_data['version']
37
+ data[:download] = version_data['download']
38
+ else
39
+ puts info
40
+ raise Bukin::InstallError, "The plugin #{name} (#{version}) has no jar files available for download"
41
+ end
42
+
43
+ data
21
44
  end
22
45
 
23
- def info(name, version, server)
24
- server = 'bukkit' if server == 'craftbukkit'
25
- url = "#{api_url}/plugins/#{server}/#{name}/#{version}"
26
- JSON.parse(open(url).read)
46
+ def jar_extension?(version_data)
47
+ File.extname(version_data['filename']) == '.jar'
27
48
  end
49
+
28
50
  end
@@ -14,17 +14,21 @@ class Bukin::BukkitDl
14
14
  "#{url}/api/1.0/downloads"
15
15
  end
16
16
 
17
- def download_url
18
- url
19
- end
17
+ def resolve_info(data)
18
+ if data[:download]
19
+ data[:display_version] = data[:version]
20
+ return data
21
+ end
20
22
 
21
- def download(name, version)
22
- url = download_url + info(name, version)['file']['url']
23
- download_file(url)
24
- end
23
+ name = data[:name]
24
+ version = data[:version] || 'latest-rb'
25
25
 
26
- def info(name, version)
27
26
  url = "#{api_url}/projects/#{name}/view/#{version}/"
28
- JSON.parse(open(url).read)
27
+ info = JSON.parse(open(url).read)
28
+
29
+ data[:version] = "build-#{info['build_number']}"
30
+ data[:display_version] = info['version']
31
+ data[:download] = @url + info['file']['url']
32
+ data
29
33
  end
30
34
  end
@@ -9,7 +9,7 @@ end
9
9
 
10
10
  def download_file(url, content_disposition = false)
11
11
  open(url) do |download|
12
- file_name = if content_disposition
12
+ file_name = if download.meta['content-disposition']
13
13
  download.meta['content-disposition']
14
14
  .match(/filename=(\"?)(.+)\1/)[2]
15
15
  .force_encoding("UTF-8")
@@ -1,3 +1,3 @@
1
1
  module Bukin
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bukin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-19 00:00:00.000000000 Z
12
+ date: 2013-04-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor
@@ -61,6 +61,7 @@ files:
61
61
  - lib/bukin.rb
62
62
  - lib/bukin/bukfile.rb
63
63
  - lib/bukin/cli.rb
64
+ - lib/bukin/exceptions.rb
64
65
  - lib/bukin/friendly_errors.rb
65
66
  - lib/bukin/installer.rb
66
67
  - lib/bukin/lockfile.rb