OSDN Git Service

0d3783135b0ff6a611289873eb69be7f8e02a11d
[osdn-codes/osdn-cli.git] / lib / osdn / cli / command / package.rb
1 module OSDN; module CLI; module Command
2   class Package < Base
3     def help
4       puts "#{$0} package [opts] [list]"
5       puts "#{$0} package [opts] create <new-package-name>"
6       puts "#{$0} package [opts] update <numeric-package-id> [name]"
7       puts "#{$0} package [opts] delete <numeric-package-id>"
8       puts "Options:"
9       puts "  -f --format=<pretty|json>  Set output format"
10       puts "  -p --project=<project>     Target project (numeric id or name)"
11       puts "  -v --visibility=<public|private|hidden>"
12     end
13
14     def self.description
15       "Manipulate release package of project"
16     end
17
18     def run
19       update_token
20       opts = GetoptLong.new(
21         [ '--format', '-f', GetoptLong::REQUIRED_ARGUMENT ],
22         [ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ],
23         [ '--visibility', '-v', GetoptLong::REQUIRED_ARGUMENT ],
24       )
25       opts.each do |opt, arg|
26         case opt
27         when '--format'
28           arg == 'json' and
29             self.format = arg
30         when '--project'
31           arg.empty? or
32             @target_proj = arg
33         when '--visibility'
34           unless %w(public private hidden).member?(arg)
35             logger.fatal "Invalid visibility status: #{arg}"
36             exit
37           end
38           @visibility = arg
39         end
40       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     end
55
56     def list
57       list = api.list_packages target_proj
58       if format == 'json'
59         puts list.to_json
60       else
61         list.each do |p|
62           puts format_package(p)
63         end
64       end
65     end
66
67     def create
68       name = ARGV.shift
69       if !name
70         logger.fatal "Package name is missing."
71         help
72         return
73       end
74       p = api.create_package target_proj, name, visibility: @visibility
75       logger.info "New package has been created."
76       puts format_package(p)
77     end
78
79     def update
80       target_id = ARGV.shift
81       args = {name: ARGV.shift}
82       if @visibility
83         args[:visibility] = @visibility
84       end
85       p = api.update_package target_proj, target_id, args
86       logger.info "Package #{target_id} has been updated."
87       puts format_package(p)
88     end
89
90     def delete
91       target_id = ARGV.shift
92       p = api.delete_package target_proj, target_id
93       logger.info "Package #{target_id} has been deleted."
94     end
95
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   end
118 end; end; end