osdn-cli 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ac966ae43ca339709481cd8e974dfc87b774f8cb
4
- data.tar.gz: 5db0f3f4af00ee2f02050a47792f340dc43d677b
3
+ metadata.gz: 32c466e6ff582c2e2ae91f4e1fc455e34630828e
4
+ data.tar.gz: 66080054808d8d1e077b95955e0dddac754159d0
5
5
  SHA512:
6
- metadata.gz: 2410cbbf83e311af1565d2bb4c6180642d6e46a3d87f46e68017755388c52bf3aa46a9570122863c80827f6d8c3faa9b74b96e255d8ac0260e3ea7efcebb17af
7
- data.tar.gz: b5472f3405bd5d7ac1c8f0cd37ed32e78d8c7cccbf3af81d22795aa1b42674d6f6b56ccd2c05d0538b4000c6e66f122c9a745b2f74e0fd47a41bfafb47ef7bfd
6
+ metadata.gz: 82f165bb2dd2afda2f954fbbeb228e498b41fd9e723dd593bb01c6a4f62724b940bc3058a82e2fb0801c4672959bd5c8b407f5b192ab444eb2f5725b75b815c3
7
+ data.tar.gz: 2302b89c7b4cb842b798cbb72103183c8a17078163c1387eacbf29a3b09775eee17b7a500a5e382f0252394ef9cfb9c2acb952456934029b1e560f3a57d9e6cb
data/lib/osdn/cli.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "osdn/cli/version"
2
2
  require "osdn/cli/runner"
3
+ require "osdn/cli/overrides"
3
4
  require 'getoptlong'
4
5
  require 'logger'
5
6
  require 'pathname'
@@ -8,6 +9,7 @@ require 'fileutils'
8
9
  require 'osdn-client'
9
10
  require 'hashie'
10
11
  require 'json'
12
+ require 'digest'
11
13
 
12
14
  module OSDN
13
15
  module CLI
@@ -19,13 +21,23 @@ module OSDN
19
21
  def client_secret
20
22
  @@client_secret
21
23
  end
22
- module_function :client_id, :client_secret
24
+
25
+ @@_show_progress = false
26
+ def _show_progress
27
+ @@_show_progress
28
+ end
29
+ def _show_progress=(v)
30
+ @@_show_progress = v
31
+ end
32
+
33
+ module_function :client_id, :client_secret,
34
+ :_show_progress, :_show_progress=
23
35
 
24
36
  module Command
25
37
  autoload :Login, 'osdn/cli/command/login'
26
38
  autoload :Package, 'osdn/cli/command/package'
27
- #autoload :Release, 'osdn/cli/command/release'
28
- #autoload :FrsFile, 'osdn/cli/command/frs_file'
39
+ autoload :Release, 'osdn/cli/command/release'
40
+ autoload :Relfile, 'osdn/cli/command/relfile'
29
41
  autoload :FrsMkdirs, 'osdn/cli/command/frs_mkdirs'
30
42
  autoload :FrsUpload, 'osdn/cli/command/frs_upload'
31
43
 
@@ -155,6 +167,18 @@ module OSDN
155
167
  def update_variables(dir, vars)
156
168
  write_variables(load_variables(dir, false).merge(vars), dir)
157
169
  end
170
+
171
+ private
172
+ def hexdigest(klass, file)
173
+ fio = file.open
174
+ dig = klass.new
175
+ while buf = fio.read(1024*1024) and buf.length > 0
176
+ dig << buf
177
+ end
178
+ fio.close
179
+ dig.hexdigest
180
+ end
181
+
158
182
  end
159
183
 
160
184
  class Ping < Base
@@ -0,0 +1,80 @@
1
+ module OSDN; module CLI; module Command
2
+ class FrsBase < Base
3
+ def run
4
+ update_token
5
+ process_options
6
+ command = ARGV.shift || 'list'
7
+ if !command || command.empty?
8
+ logger.fatal "subcommand is missing."
9
+ help
10
+ return
11
+ end
12
+ if self.respond_to? command
13
+ self.send command
14
+ else
15
+ logger.fatal "Invalid subcommand: #{command}"
16
+ help
17
+ return
18
+ end
19
+ end
20
+
21
+ def process_options
22
+ raise NotImplementedError
23
+ end
24
+
25
+ private
26
+ def target_proj
27
+ @target_proj and return @target_proj
28
+ vars = load_variables
29
+ vars.project && !vars.project.empty? and
30
+ return vars.project
31
+ logger.fatal "No target project is specified."
32
+ exit
33
+ end
34
+
35
+ def target_package
36
+ @target_package and return @target_package
37
+ vars = load_variables
38
+ vars.package_id && !vars.package_id.empty? and
39
+ return vars.package_id
40
+ logger.fatal "No target package is specified."
41
+ exit
42
+ end
43
+
44
+ def target_release
45
+ @target_release and return @target_release
46
+ vars = load_variables
47
+ vars.release_id && !vars.release_id.empty? and
48
+ return vars.release_id
49
+ logger.fatal "No target release is specified."
50
+ exit
51
+ end
52
+
53
+ def api
54
+ OSDNClient::ProjectApi.new
55
+ end
56
+
57
+ def format_object(o, children = nil)
58
+ if format == 'json'
59
+ o.to_hash.to_json
60
+ else
61
+ children_str = ''
62
+ children and
63
+ children_str = ", #{[*o.send(children)].count} #{children}"
64
+ "##{o.id} #{o.name} (#{o.visibility}#{children_str})\n #{o.url}"
65
+ end
66
+ end
67
+
68
+ def format_release(r)
69
+ format_object(r, :files)
70
+ end
71
+
72
+ def format_package(p)
73
+ format_object(p, :releases)
74
+ end
75
+
76
+ def format_file(f)
77
+ format_object(f)
78
+ end
79
+ end
80
+ end; end; end
@@ -33,7 +33,7 @@ module OSDN; module CLI; module Command
33
33
 
34
34
  logger.debug "Getting Package list..."
35
35
  packages = api.list_packages target_proj
36
- logger.debug "Making each package directry"
36
+ logger.debug "Making each package directory"
37
37
 
38
38
  packages.each do |package|
39
39
  pname = fsname(package.name)
@@ -1,46 +1,3 @@
1
- require 'digest'
2
- require 'ethon'
3
-
4
- module OSDN; module CLI; module Command
5
- class FrsUpload < Base
6
- @@_show_progress = false
7
- def self._show_progress
8
- @@_show_progress
9
- end
10
- def self._show_progress=(v)
11
- need_reset = (!!@@_show_progress != !!v)
12
- @@_show_progress = v
13
- need_reset and _reset_all_typhoeus_pool
14
- end
15
-
16
- def self._reset_all_typhoeus_pool
17
- first_easyid = nil
18
- while true
19
- e = Typhoeus::Pool.get
20
- Typhoeus::Pool.release(e)
21
- e.__id__ == first_easyid and break
22
- first_easyid ||= e.__id__
23
- end
24
- end
25
- end
26
- end; end; end
27
-
28
- module Ethon
29
- class Easy
30
- module Callbacks
31
- alias_method :set_callbacks_orig, :set_callbacks
32
- def set_callbacks
33
- set_callbacks_orig
34
- if OSDN::CLI::Command::FrsUpload._show_progress
35
- Curl.set_option(:noprogress, false, handle)
36
- else
37
- Curl.set_option(:noprogress, true, handle)
38
- end
39
- end
40
- end
41
- end
42
- end
43
-
44
1
  module OSDN; module CLI; module Command
45
2
  class FrsUpload < Base
46
3
  def help
@@ -87,7 +44,7 @@ module OSDN; module CLI; module Command
87
44
  @target_dir = Pathname.new(ARGV.shift || '.')
88
45
  proj_info = api.get_project target_proj # check project existance
89
46
 
90
- Pathname.glob(@target_dir+'*').each do |pdir|
47
+ Pathname.glob(@target_dir+'*').sort.each do |pdir|
91
48
  unless load_variables(pdir).package_id
92
49
  logger.info "Createing new package '#{pdir.basename}'"
93
50
  if @dry_run
@@ -99,7 +56,7 @@ module OSDN; module CLI; module Command
99
56
  $stdout.puts "New package '#{pinfo.name}' has been created; #{pinfo.url}"
100
57
  end
101
58
 
102
- Pathname.glob(pdir + '*').each do |rdir|
59
+ Pathname.glob(pdir + '*').sort.each do |rdir|
103
60
  vars = load_variables(rdir)
104
61
  rinfo = nil
105
62
  if vars.release_id
@@ -115,7 +72,7 @@ module OSDN; module CLI; module Command
115
72
  $stdout.puts "New release '#{rinfo.name}' has been created; #{rinfo.url}"
116
73
  end
117
74
 
118
- Pathname.glob(rdir + '*').each do |file|
75
+ Pathname.glob(rdir + '*').sort.each do |file|
119
76
  if file.directory?
120
77
  logger.error "Skip direcotry #{file}"
121
78
  next
@@ -138,16 +95,16 @@ module OSDN; module CLI; module Command
138
95
  finfo = Hashie::Mash.new id: '(dry-run)', url: '(dry-run)'
139
96
  else
140
97
  logger.level <= Logger::INFO and
141
- self.class._show_progress = true
98
+ OSDN::CLI._show_progress = true
142
99
  fio = file.open
143
100
  logger.info "Starting upload #{file}..."
144
101
  finfo = api.create_release_file target_proj, target_package(rdir), target_release(rdir), fio, visibility: @visibility
145
102
  fio.close
146
- self.class._show_progress = false
103
+ OSDN::CLI._show_progress = false
147
104
  if digests.find { |type, dig| dig != finfo.send("digest_#{type}") }
148
105
  logger.error "File digests are mismatch! Upload file #{file} may be broken! Please check."
149
106
  else
150
- logger.info "Upload completed."
107
+ logger.info "Upload complete."
151
108
  end
152
109
  end
153
110
  $stdout.puts "New file '#{file}' has been uploaded; #{finfo.url}"
@@ -192,16 +149,5 @@ module OSDN; module CLI; module Command
192
149
  def api
193
150
  OSDNClient::ProjectApi.new
194
151
  end
195
-
196
- def hexdigest(klass, file)
197
- fio = file.open
198
- dig = klass.new
199
- while buf = fio.read(1024*1024) and buf.length > 0
200
- dig << buf
201
- end
202
- fio.close
203
- dig.hexdigest
204
- end
205
-
206
152
  end
207
153
  end; end; end
@@ -30,7 +30,7 @@ module OSDN; module CLI; module Command
30
30
  end
31
31
 
32
32
  def launch_brwoser(url)
33
- puts "Access follwoing URL to get auth code;\n#{url}"
33
+ puts "Access following URL to get auth code;\n#{url}"
34
34
  if ENV['DISPLAY']
35
35
  %w(/usr/bin/xdg-open /usr/bin/X11/xdg-open /usr/local/bin/xdg-open
36
36
  /usr/bin/x-www-browser /usr/bin/firefox /usr/local/bin/firefox
@@ -1,6 +1,8 @@
1
+ require 'osdn/cli/command/frs_base'
2
+
1
3
  module OSDN; module CLI; module Command
2
- class Package < Base
3
- def self.help
4
+ class Package < FrsBase
5
+ def help
4
6
  puts "#{$0} package [opts] [list]"
5
7
  puts "#{$0} package [opts] create <new-package-name>"
6
8
  puts "#{$0} package [opts] update <numeric-package-id> [name]"
@@ -15,8 +17,7 @@ module OSDN; module CLI; module Command
15
17
  "Manipulate release package of project"
16
18
  end
17
19
 
18
- def run
19
- update_token
20
+ def process_options
20
21
  opts = GetoptLong.new(
21
22
  [ '--format', '-f', GetoptLong::REQUIRED_ARGUMENT ],
22
23
  [ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ],
@@ -38,25 +39,12 @@ module OSDN; module CLI; module Command
38
39
  @visibility = arg
39
40
  end
40
41
  end
41
- command = ARGV.shift || 'list'
42
- if !command || command.empty?
43
- logger.fatal "subcommand is missing."
44
- help
45
- return
46
- end
47
- if self.respond_to? command
48
- self.send command
49
- else
50
- logger.fatal "Invalid subcommand: #{command}"
51
- help
52
- return
53
- end
54
42
  end
55
43
 
56
44
  def list
57
45
  list = api.list_packages target_proj
58
46
  if format == 'json'
59
- puts list.to_json
47
+ puts list.map{|i| i.to_hash}.to_json
60
48
  else
61
49
  list.each do |p|
62
50
  puts format_package(p)
@@ -93,26 +81,5 @@ module OSDN; module CLI; module Command
93
81
  logger.info "Package #{target_id} has been deleted."
94
82
  end
95
83
 
96
- private
97
- def target_proj
98
- @target_proj and return @target_proj
99
- vars = load_variables
100
- vars.project && !vars.project.empty? and
101
- return vars.project
102
- logger.fatal "No target project is specified."
103
- exit
104
- end
105
-
106
- def api
107
- OSDNClient::ProjectApi.new
108
- end
109
-
110
- def format_package(p)
111
- if format == 'json'
112
- p.to_json
113
- else
114
- "##{p.id} #{p.name} (#{p.visibility}, #{[*p.releases].count} releases)\n #{p.url}"
115
- end
116
- end
117
84
  end
118
85
  end; end; end
@@ -0,0 +1,91 @@
1
+ require 'osdn/cli/command/frs_base'
2
+
3
+ module OSDN; module CLI; module Command
4
+ class Release < FrsBase
5
+ def help
6
+ puts "#{$0} release [opts] [list]"
7
+ puts "#{$0} release [opts] create <new-release-name>"
8
+ puts "#{$0} release [opts] update <numeric-release-id> [name]"
9
+ puts "#{$0} release [opts] delete <numeric-release-id>"
10
+ puts "Options:"
11
+ puts " -f --format=<pretty|json> Set output format"
12
+ puts " -p --project=<project> Target project (numeric id or name)"
13
+ puts " --package=<project> Target package (numeric id)"
14
+ puts " -v --visibility=<public|private|hidden>"
15
+ end
16
+
17
+ def self.description
18
+ "Manipulate release (includes by package) of project"
19
+ end
20
+
21
+ def process_options
22
+ opts = GetoptLong.new(
23
+ [ '--format', '-f', GetoptLong::REQUIRED_ARGUMENT ],
24
+ [ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ],
25
+ [ '--package', GetoptLong::REQUIRED_ARGUMENT ],
26
+ [ '--visibility', '-v', GetoptLong::REQUIRED_ARGUMENT ],
27
+ )
28
+ opts.each do |opt, arg|
29
+ case opt
30
+ when '--format'
31
+ arg == 'json' and
32
+ self.format = arg
33
+ when '--project'
34
+ arg.empty? or
35
+ @target_proj = arg
36
+ when '--package'
37
+ arg.empty? or
38
+ @target_package = arg
39
+ when '--visibility'
40
+ unless %w(public private hidden).member?(arg)
41
+ logger.fatal "Invalid visibility status: #{arg}"
42
+ exit
43
+ end
44
+ @visibility = arg
45
+ end
46
+ end
47
+ end
48
+
49
+ def list
50
+ package = api.get_package target_proj, target_package
51
+ list = package.releases
52
+ if format == 'json'
53
+ puts list.map{|i| i.to_hash}.to_json
54
+ else
55
+ list.each do |r|
56
+ puts format_release(r)
57
+ end
58
+ end
59
+ end
60
+
61
+ def create
62
+ name = ARGV.shift
63
+ if !name
64
+ logger.fatal "Release name is missing."
65
+ help
66
+ return
67
+ end
68
+ r = api.create_release target_proj, target_package, name, visibility: @visibility
69
+ logger.info "New release has been created."
70
+ puts format_release(r)
71
+ end
72
+
73
+ def update
74
+ target_id = ARGV.shift
75
+ args = {name: ARGV.shift}
76
+ if @visibility
77
+ args[:visibility] = @visibility
78
+ end
79
+ r = api.update_release target_proj, target_package, target_id, args
80
+ logger.info "Release #{target_id} has been updated."
81
+ puts format_release(r)
82
+ end
83
+
84
+ def delete
85
+ target_id = ARGV.shift
86
+ r = api.delete_release target_proj, target_package, target_id
87
+ logger.info "Release #{target_id} has been deleted."
88
+ end
89
+
90
+ end
91
+ end; end; end
@@ -0,0 +1,123 @@
1
+ require 'osdn/cli/command/frs_base'
2
+ require 'pathname'
3
+
4
+ module OSDN; module CLI; module Command
5
+ class Relfile < FrsBase
6
+ def help
7
+ puts "#{$0} relfile [opts] [list]"
8
+ puts "#{$0} relfile [opts] create <target-file>"
9
+ puts "#{$0} relfile [opts] update <numeric-file-id>"
10
+ puts "#{$0} relfile [opts] delete <numeric-file-id>"
11
+ puts "Options:"
12
+ puts " -f --format=<pretty|json> Set output format"
13
+ puts " -p --project=<project> Target project (numeric id or name)"
14
+ puts " --package=<project> Target package (numeric id)"
15
+ puts " --release=<project> Target release (numeric id)"
16
+ puts " -v --visibility=<public|private|hidden>"
17
+ end
18
+
19
+ def self.description
20
+ "Manipulate release (includes by package) of project"
21
+ end
22
+
23
+ def process_options
24
+ opts = GetoptLong.new(
25
+ [ '--format', '-f', GetoptLong::REQUIRED_ARGUMENT ],
26
+ [ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ],
27
+ [ '--package', GetoptLong::REQUIRED_ARGUMENT ],
28
+ [ '--release', GetoptLong::REQUIRED_ARGUMENT ],
29
+ [ '--visibility', '-v', GetoptLong::REQUIRED_ARGUMENT ],
30
+ )
31
+ opts.each do |opt, arg|
32
+ case opt
33
+ when '--format'
34
+ arg == 'json' and
35
+ self.format = arg
36
+ when '--project'
37
+ arg.empty? or
38
+ @target_proj = arg
39
+ when '--package'
40
+ arg.empty? or
41
+ @target_package = arg
42
+ when '--release'
43
+ arg.empty? or
44
+ @target_release = arg
45
+ when '--visibility'
46
+ unless %w(public private hidden).member?(arg)
47
+ logger.fatal "Invalid visibility status: #{arg}"
48
+ exit
49
+ end
50
+ @visibility = arg
51
+ end
52
+ end
53
+ end
54
+
55
+ def list
56
+ release = api.get_release target_proj, target_package, target_release
57
+ list = release.files
58
+ if format == 'json'
59
+ puts list.map{|i| i.to_hash}.to_json
60
+ else
61
+ list.each do |f|
62
+ puts format_file(f)
63
+ end
64
+ end
65
+ end
66
+
67
+ def create
68
+ filename = ARGV.shift
69
+ if !filename
70
+ logger.fatal "Target filename is missing."
71
+ help
72
+ return
73
+ end
74
+ file = Pathname('.') + filename
75
+ logger.debug "Calculating digest for #{file}..."
76
+ digests = {
77
+ sha256: hexdigest(Digest::SHA256, file),
78
+ sha1: hexdigest(Digest::SHA1, file),
79
+ md5: hexdigest(Digest::MD5, file),
80
+ }
81
+ fio = file.open
82
+ logger.level <= Logger::INFO and
83
+ OSDN::CLI._show_progress = true
84
+ logger.info "Starting upload #{file}..."
85
+ f = api.create_release_file target_proj, target_package, target_release, fio, visibility: @visibility
86
+ fio.close
87
+ OSDN::CLI._show_progress = false
88
+ if digests.find { |type, dig| dig != f.send("digest_#{type}") }
89
+ logger.error "File digests are mismatch! Upload file #{file} may be broken! Please check."
90
+ else
91
+ logger.info "Upload complete."
92
+ end
93
+ puts format_file(f)
94
+ end
95
+
96
+ def update
97
+ target_id = ARGV.shift
98
+ if !target_id
99
+ logger.fatal "Target file ID is missing."
100
+ help
101
+ return
102
+ end
103
+ if @visibility.nil?
104
+ logger.fatal "Visibility status is missing. Use '-v <public|private|hidden>'."
105
+ return
106
+ end
107
+ f = api.update_release_file target_proj, target_package, target_release, target_id, visibility: @visibility
108
+ logger.info "file #{target_id} has been updated."
109
+ puts format_file(f)
110
+ end
111
+
112
+ def delete
113
+ target_id = ARGV.shift
114
+ if !target_id
115
+ logger.fatal "Target file ID is missing."
116
+ help
117
+ return
118
+ end
119
+ f = api.delete_release_file target_proj, target_package, target_release, target_id
120
+ logger.info "file #{target_id} has been deleted."
121
+ end
122
+ end
123
+ end; end; end
@@ -0,0 +1,16 @@
1
+ require 'typhoeus/easy_factory'
2
+
3
+ module Typhoeus
4
+ class EasyFactory
5
+ alias_method :get_orig, :get
6
+ def get(*args)
7
+ easy = get_orig(*args)
8
+ if OSDN::CLI._show_progress
9
+ Ethon::Curl.set_option(:noprogress, false, easy.handle)
10
+ else
11
+ Ethon::Curl.set_option(:noprogress, true, easy.handle)
12
+ end
13
+ easy
14
+ end
15
+ end
16
+ end
@@ -7,7 +7,7 @@ module OSDN
7
7
  class Runner
8
8
  def initialize
9
9
  @logger = Logger.new(STDERR)
10
- @logger.level = Logger::WARN
10
+ @logger.level = Logger::INFO
11
11
  @logger.formatter = proc { |severity, time, progname, msg|
12
12
  "[%s] %s\n" % [severity, msg]
13
13
  }
@@ -88,7 +88,7 @@ module OSDN
88
88
  elsif err["error_description"]
89
89
  logger.fatal err["error_description"]
90
90
  else
91
- logger.fatal "Command failed: #{e.inspect}"
91
+ logger.fatal "Command failed by ApiError: #{e.response_body}"
92
92
  end
93
93
  rescue
94
94
  logger.fatal "Command failed: #{e.inspect}"
@@ -1,5 +1,5 @@
1
1
  module OSDN
2
2
  module CLI
3
- VERSION = "0.0.4"
3
+ VERSION = "0.0.5"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: osdn-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - OSDN
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-03-15 00:00:00.000000000 Z
11
+ date: 2016-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -91,11 +91,14 @@ files:
91
91
  - exe/osdn
92
92
  - lib/osdn-cli.rb
93
93
  - lib/osdn/cli.rb
94
+ - lib/osdn/cli/command/frs_base.rb
94
95
  - lib/osdn/cli/command/frs_mkdirs.rb
95
96
  - lib/osdn/cli/command/frs_upload.rb
96
97
  - lib/osdn/cli/command/login.rb
97
98
  - lib/osdn/cli/command/package.rb
98
- - lib/osdn/cli/common.rb
99
+ - lib/osdn/cli/command/release.rb
100
+ - lib/osdn/cli/command/relfile.rb
101
+ - lib/osdn/cli/overrides.rb
99
102
  - lib/osdn/cli/runner.rb
100
103
  - lib/osdn/cli/version.rb
101
104
  homepage: https://osdn.jp/projects/osdn-codes/wiki/CommandLineInterface
@@ -1,6 +0,0 @@
1
- module OSDN
2
- module CLI
3
- module Common
4
- end
5
- end
6
- end