bukin 0.2.0 → 0.3.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/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