net-github-upload 0.0.1

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.
@@ -0,0 +1,82 @@
1
+ = Ruby Net::GitHub::Upload
2
+
3
+ * http://github.com/Constellation/ruby-net-github-upload
4
+ * http://gemcutter.org/gems/net-github-upload
5
+
6
+ == DESCRIPTION
7
+
8
+ Ruby Net::GitHub::Upload is upload user agent for GitHub Downloads
9
+ respect to http://github.com/typester/net-github-upload-perl
10
+
11
+ == SYNOPSIS
12
+
13
+ # require
14
+ require 'rubygems'
15
+ require 'net/github-upload'
16
+
17
+ # setup
18
+ login = `git config github.user`.chomp # your login for github
19
+ token = `git config github.token`.chomp # your token for github
20
+ repos = 'repository name' # your repos name (like 'taberareloo')
21
+ gh = Net::GitHub::Upload.new(
22
+ :login => login,
23
+ :token => token
24
+ )
25
+
26
+ # file upload
27
+ direct_link = gh.upload(
28
+ :repos => repos,
29
+ :file => 'test/test',
30
+ :description => "test file"
31
+ )
32
+ # direct link is link to Amazon S3.
33
+ # Because GitHub refrection for file changing is async,
34
+ # if you get changed file synchronously, you use this "direct_link"
35
+
36
+ # data upload
37
+ # you can define content_type => Amazon S3 Content-Type
38
+ direct_link = gh.upload(
39
+ :repos => repos,
40
+ :data => 'test',
41
+ :name => "test_#{Time.now.to_i}.txt",
42
+ :content_type => 'text/plain',
43
+ :description => "test file2"
44
+ )
45
+
46
+ == DEPENDENCY
47
+
48
+ * nokogiri
49
+ * faster_xml_simple
50
+ * httpclient
51
+
52
+ == INSTALL
53
+
54
+ gem source -a http://gemcutter.org
55
+ sudo gem install net-github-upload
56
+
57
+ == LICENSE
58
+
59
+ Ruby Net::Github::Upload
60
+ (The MIT License)
61
+
62
+ Copyright (c) 2009 Constellation
63
+
64
+ Permission is hereby granted, free of charge, to any person obtaining
65
+ a copy of this software and associated documentation files (the
66
+ 'Software'), to deal in the Software without restriction, including
67
+ without limitation the rights to use, copy, modify, merge, publish,
68
+ distribute, sublicense, and/or sell copies of the Software, and to
69
+ permit persons to whom the Software is furnished to do so, subject to
70
+ the following conditions:
71
+
72
+ The above copyright notice and this permission notice shall be
73
+ included in all copies or substantial portions of the Software.
74
+
75
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
76
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
77
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
78
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
79
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
80
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
81
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
82
+
@@ -0,0 +1,86 @@
1
+ # vim: fileencoding=utf-8
2
+ require 'rubygems'
3
+ require 'rake'
4
+ require 'rake/clean'
5
+ require 'rake/testtask'
6
+ require 'rake/packagetask'
7
+ require 'rake/gempackagetask'
8
+ require 'rake/rdoctask'
9
+ require 'rake/contrib/sshpublisher'
10
+ require 'lib/net/github-upload'
11
+
12
+ $version = Net::GitHub::Upload::VERSION
13
+ $readme = 'README.rdoc'
14
+ $rdoc_opts = %W(--main #{$readme} --charset utf-8 --line-numbers --inline-source)
15
+ $name = 'net-github-upload'
16
+ $github_name = 'ruby-net-github-upload'
17
+ $summary = 'ruby porting of Net::GitHub::Upload'
18
+ $description = <<-EOS
19
+ Ruby Net::GitHub::Upload is upload user agent for GitHub Downloads
20
+ EOS
21
+ $author = 'Constellation'
22
+ $email = 'utatane.tea@gmail.com'
23
+ $page = 'http://github.com/Constellation/ruby-net-github-upload'
24
+ $rubyforge_project = 'ruby-net-github-upload'
25
+
26
+
27
+ task :default => [:test]
28
+ task :package => [:clean]
29
+
30
+ Rake::TestTask.new("test") do |t|
31
+ t.libs << "test"
32
+ t.pattern = "test/**/*_test.rb"
33
+ t.verbose = true
34
+ end
35
+
36
+ spec = Gem::Specification.new do |s|
37
+ s.name = $name
38
+ s.version = $version
39
+ s.platform = Gem::Platform::RUBY
40
+ s.has_rdoc = true
41
+ s.extra_rdoc_files = [$readme]
42
+ s.rdoc_options += $rdoc_opts
43
+ s.summary = $summary
44
+ s.description = $description
45
+ s.author = $author
46
+ s.email = $email
47
+ s.homepage = $page
48
+ s.executables = $exec
49
+ s.rubyforge_project = $rubyforge_project
50
+ s.require_path = 'lib'
51
+ s.test_files = Dir["test/*_test.rb"]
52
+ s.add_dependency('nokogiri')
53
+ s.add_dependency('faster_xml_simple')
54
+ s.add_dependency('httpclient')
55
+ s.files = %w(README.rdoc Rakefile) + Dir["{bin,test,lib}/**/*"]
56
+ end
57
+
58
+ Rake::GemPackageTask.new(spec) do |p|
59
+ p.need_tar = true
60
+ p.gem_spec = spec
61
+ end
62
+
63
+ Rake::RDocTask.new do |rdoc|
64
+ rdoc.rdoc_dir = 'doc'
65
+ rdoc.options += $rdoc_opts
66
+ rdoc.rdoc_files.include("README.rdoc", "lib/**/*.rb", "ext/**/*.c")
67
+ end
68
+
69
+ desc "gem spec"
70
+ task :gemspec do
71
+ File.open("#{$github_name}.gemspec", "wb") do |f|
72
+ f << spec.to_ruby
73
+ end
74
+ end
75
+
76
+ desc "gem install"
77
+ task :install => [:package] do
78
+ sh "sudo gem install pkg/#{$name}-#{$version}.gem --local"
79
+ end
80
+
81
+ desc "gem uninstall"
82
+ task :uninstall do
83
+ sh "sudo gem uninstall #{$name}"
84
+ end
85
+
86
+ # vim: syntax=ruby
@@ -0,0 +1,113 @@
1
+ require 'nokogiri'
2
+ require 'httpclient'
3
+ require 'stringio'
4
+ require 'faster_xml_simple'
5
+
6
+ module Net
7
+ module GitHub
8
+ class Upload
9
+ VERSION = '0.0.1'
10
+ def initialize params=nil
11
+ @login = params[:login]
12
+ @token = params[:token]
13
+ end
14
+
15
+ def upload info
16
+ unless info[:repos]
17
+ raise "required repository name"
18
+ end
19
+ info[:repos] = @login + '/' + info[:repos] unless info[:repos].include? '/'
20
+
21
+ if info[:file]
22
+ file = info[:file]
23
+ unless File.exist?(file) && File.readable?(file)
24
+ raise "file does not exsits or readable"
25
+ end
26
+ info[:name] ||= File.basename(file)
27
+ end
28
+ unless info[:file] || info[:data]
29
+ raise "required file or data parameter to upload"
30
+ end
31
+
32
+ unless info[:name]
33
+ raise "required name parameter for filename with data parameter"
34
+ end
35
+
36
+ if list_files(info[:repos]).any?{|obj| obj[:name] == info[:name]}
37
+ raise "file '#{info[:name]}' is already uploaded. please try different name"
38
+ end
39
+
40
+ stat = HTTPClient.post("http://github.com/#{info[:repos]}/downloads", {
41
+ "file_size" => info[:file] ? File.stat(info[:file]).size : info[:data].size,
42
+ "content_type" => info[:content_type] || 'application/octet-stream',
43
+ "file_name" => info[:name],
44
+ "description" => info[:description] || '',
45
+ "login" => @login,
46
+ "token" => @token
47
+ })
48
+
49
+ unless stat.code == 200
50
+ raise "Failed to post file info"
51
+ end
52
+
53
+ upload_info = FasterXmlSimple.xml_in(stat.content)['hash']
54
+ if info[:file]
55
+ f = File.open(info[:file], 'rb')
56
+ stat = HTTPClient.post("http://github.s3.amazonaws.com/", [
57
+ ['Filename', info[:name]],
58
+ ['policy', upload_info['policy']],
59
+ ['success_action_status', 201],
60
+ ['key', upload_info['prefix'] + info[:name]],
61
+ ['AWSAccessKeyId', upload_info['accesskeyid']],
62
+ ['Content-Type', info[:content_type] || 'application/octet-stream'],
63
+ ['signature', upload_info['signature']],
64
+ ['acl', upload_info['acl']],
65
+ ['file', f]
66
+ ])
67
+ f.close
68
+ else
69
+ stat = HTTPClient.post("http://github.s3.amazonaws.com/", [
70
+ ['Filename', info[:name]],
71
+ ['policy', upload_info['policy']],
72
+ ['success_action_status', 201],
73
+ ['key', upload_info['prefix'] + info[:name]],
74
+ ['AWSAccessKeyId', upload_info['accesskeyid']],
75
+ ['Content-Type', info[:content_type] || 'application/octet-stream'],
76
+ ['signature', upload_info['signature']],
77
+ ['acl', upload_info['acl']],
78
+ ['file', StringIO.new(info[:data])]
79
+ ])
80
+ end
81
+
82
+ if stat.code == 201
83
+ return FasterXmlSimple.xml_in(stat.content)['PostResponse']['Location']
84
+ else
85
+ pp stat.content
86
+ raise 'Failed to upload'
87
+ end
88
+ end
89
+
90
+ private
91
+ def list_files repos
92
+ raise "required repository name" unless repos
93
+ res = HTTPClient.get_content("http://github.com/#{repos}/downloads", {
94
+ "login" => @login,
95
+ "token" => @token
96
+ })
97
+ Nokogiri::HTML(res).xpath('id("browser")/descendant::tr[contains(@id, "download")]').map do |fileinfo|
98
+ obj = {
99
+ :id => fileinfo.attribute('id').text,
100
+ :description => fileinfo.at_xpath('descendant::td[3]').text,
101
+ :date => fileinfo.at_xpath('descendant::td[4]').text,
102
+ :size => fileinfo.at_xpath('descendant::td[5]').text
103
+ }
104
+ anchor = fileinfo.at_xpath('descendant::td[2]/a')
105
+ obj[:link] = anchor.attribute('href').text
106
+ obj[:name] = anchor.text
107
+ obj
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+
@@ -0,0 +1,40 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/net/github-upload'
3
+
4
+ class GitHubUploadTest < Test::Unit::TestCase
5
+ def setup
6
+ login = `git config github.user`.chomp
7
+ token = `git config github.token`.chomp
8
+ @gh = Net::GitHub::Upload.new(
9
+ :login => login,
10
+ :token => token
11
+ )
12
+ @repos = 'taberareloo'
13
+ end
14
+
15
+ def test_file_upload
16
+ direct_link = nil
17
+ assert_nothing_raised {
18
+ direct_link = @gh.upload(
19
+ :repos => @repos,
20
+ :file => 'test/test',
21
+ :description => "test file"
22
+ )
23
+ }
24
+ assert_instance_of String, direct_link
25
+ end
26
+
27
+ def test_content_upload
28
+ direct_link = nil
29
+ assert_nothing_raised {
30
+ direct_link = @gh.upload(
31
+ :repos => @repos,
32
+ :data => 'test',
33
+ :name => "test_#{Time.now.to_i}.txt",
34
+ :content_type => 'text/plain',
35
+ :description => "test file2"
36
+ )
37
+ }
38
+ assert_instance_of String, direct_link
39
+ end
40
+ end
@@ -0,0 +1 @@
1
+ This is TEST FILE
metadata ADDED
@@ -0,0 +1,95 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: net-github-upload
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Constellation
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-12-01 00:00:00 +09:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: nokogiri
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: faster_xml_simple
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: httpclient
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
45
+ description: |
46
+ Ruby Net::GitHub::Upload is upload user agent for GitHub Downloads
47
+
48
+ email: utatane.tea@gmail.com
49
+ executables: []
50
+
51
+ extensions: []
52
+
53
+ extra_rdoc_files:
54
+ - README.rdoc
55
+ files:
56
+ - README.rdoc
57
+ - Rakefile
58
+ - test/github_test.rb
59
+ - test/test
60
+ - lib/net/github-upload.rb
61
+ has_rdoc: true
62
+ homepage: http://github.com/Constellation/ruby-net-github-upload
63
+ licenses: []
64
+
65
+ post_install_message:
66
+ rdoc_options:
67
+ - --main
68
+ - README.rdoc
69
+ - --charset
70
+ - utf-8
71
+ - --line-numbers
72
+ - --inline-source
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: "0"
80
+ version:
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: "0"
86
+ version:
87
+ requirements: []
88
+
89
+ rubyforge_project: ruby-net-github-upload
90
+ rubygems_version: 1.3.5
91
+ signing_key:
92
+ specification_version: 3
93
+ summary: ruby porting of Net::GitHub::Upload
94
+ test_files:
95
+ - test/github_test.rb