osdn-cli 0.0.4 → 0.0.5

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.
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