ghedsh 1.1.15 → 1.1.16
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 +4 -4
- data/.gitignore +1 -0
- data/README.md +10 -14
- data/lib/actions/help.rb +1 -0
- data/lib/actions/orgs.rb +74 -10
- data/lib/actions/repo.rb +15 -1
- data/lib/actions/system.rb +25 -6
- data/lib/interface.rb +67 -11
- data/lib/version.rb +1 -1
- metadata +2 -3
- data/lib/db/assignments.json +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b7bed6aad874d5f0faf8a0b387eba24d5b4a9353
|
4
|
+
data.tar.gz: 519dafec3cc338ede392b2dd1bf38f6c1e864efc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ec45575411bc1e8062f486fa71664fa3f0932c5a203afc3970181ee7124959629a90fa3fa35f1a506b480ba260fe65ad4ff03639f0a6ba21a1deffe5275e81c
|
7
|
+
data.tar.gz: 1c53cedf872f4fcc6c544456ab357ea07d8faa4651a6299823a7c58e3b06e45d961288c7dea7958baccc74f9c1a25802bee824609758ca1428a0487944e1e5fe
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -9,25 +9,21 @@ This program give you an interaction with Github like you was using your command
|
|
9
9
|
|
10
10
|
Following the philosophy of Github Education, you can use this application to managing your own organization as a classroom where you can make assignments to your students using repository strategies.
|
11
11
|
|
12
|
-
##
|
12
|
+
##Installing GHEDSH
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
[Link to create a new personal access token](https://github.com/settings/tokens/new?description=ghedsh)
|
17
|
-
|
18
|
-
You need to tick all options, unless admin:gpg_key scopes.
|
14
|
+
You can download the gem **ghdesh** from rubygem.
|
19
15
|
|
16
|
+
``gem install ghdesh``
|
20
17
|
|
21
|
-
|
18
|
+
To run the app you need to call the binary file "ghedsh" in your command line after install it. Configuration files are being set in a hidden directory called *.ghedsh*, in your Home path.
|
22
19
|
|
23
|
-
|
20
|
+
###First step: Oauth requirements.
|
24
21
|
|
25
|
-
|
26
|
-
Instead of download the program from the repository, you can download the gem **ghdesh** from rubygem.
|
22
|
+
Ir order to run this program, you need to make an **Access token** from Github with create and edit scope. When you run the program, it asks you the access token to identify yourself with no need to use your user and password.
|
27
23
|
|
28
|
-
|
24
|
+
[Link to create a new personal access token](https://github.com/settings/tokens/new?description=ghedsh)
|
29
25
|
|
30
|
-
|
26
|
+
You need to tick all options, unless admin:gpg_key scopes.
|
31
27
|
|
32
28
|
###ghedsh executable options
|
33
29
|
|
@@ -152,7 +148,7 @@ issues
|
|
152
148
|
Muestra los issues del repositorio en el que se encuentre el usuario.
|
153
149
|
|
154
150
|
|
155
|
-
|
156
|
-
|
157
151
|
##Aditional information
|
152
|
+
[GHEDSH extended info](https://alu0100505023.gitbooks.io/ghedsh/content/en/)
|
153
|
+
|
158
154
|
[Github Education](https://education.github.com/)
|
data/lib/actions/help.rb
CHANGED
@@ -64,6 +64,7 @@ class HelpM
|
|
64
64
|
|
65
65
|
def common_opt()
|
66
66
|
puts "\nList of commands\n"
|
67
|
+
print "\tdo\t\t\trun a script in ghedsh execute path\n"
|
67
68
|
print "\texit\t\t\texit from this program\n"
|
68
69
|
print "\thelp\t\t\tlist of commands available\n"
|
69
70
|
print "\tcd\t\t\tgo to the path\n"
|
data/lib/actions/orgs.rb
CHANGED
@@ -12,28 +12,92 @@ class Organizations
|
|
12
12
|
|
13
13
|
def load_assig()
|
14
14
|
@assiglist=Hash.new()
|
15
|
-
@assiglist=Sys.new.load_assig_db()
|
15
|
+
@assiglist=Sys.new.load_assig_db("#{ENV['HOME']}/.ghedsh")
|
16
16
|
return @assiglist
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
20
|
-
|
21
|
-
puts org["name"]
|
19
|
+
def show_assignments(client, config) #client,orgs
|
20
|
+
list=self.load_assig()
|
22
21
|
|
23
|
-
|
24
|
-
|
22
|
+
assig=list["orgs"].detect{|aux| aux["name"]==config["Org"]}
|
23
|
+
if assig!=nil
|
24
|
+
if assig["assigs"].empty?
|
25
|
+
puts "No assignments are available yet"
|
26
|
+
else
|
27
|
+
assig["assigs"].each do |i|
|
28
|
+
puts "\n"
|
29
|
+
puts i["name_assig"]
|
30
|
+
puts "Repository: #{i["repo"]}"
|
31
|
+
puts "Groups: "
|
32
|
+
puts "Teams: "
|
33
|
+
# i["teams"].each do |j|
|
34
|
+
# puts "\t#{j}"
|
35
|
+
# end
|
36
|
+
end
|
25
37
|
end
|
26
|
-
|
38
|
+
else
|
39
|
+
puts "No assignments are available yet"
|
40
|
+
list["orgs"].push({"name"=>config["Org"],"assigs"=>[]})
|
41
|
+
Sys.new.save_assigs("#{ENV['HOME']}/.ghedsh",list)
|
27
42
|
end
|
43
|
+
|
28
44
|
end
|
29
|
-
|
30
|
-
|
45
|
+
|
46
|
+
def create_assig(client,config,name)
|
47
|
+
list=self.load_assig()
|
48
|
+
assigs=list["orgs"].detect{|aux| aux["name"]==config["Org"]}
|
49
|
+
|
50
|
+
if assigs==nil
|
51
|
+
list["orgs"].push({"name"=>config["Org"],"assigs"=>[]})
|
52
|
+
Sys.new.save_assigs("#{ENV['HOME']}/.ghedsh",list)
|
53
|
+
end
|
54
|
+
|
55
|
+
begin
|
56
|
+
list["orgs"][list["orgs"].index{|aux| aux["name"]==config["Org"]}]["assigs"].push({"name_assig"=>name,"teams"=>[],"groups"=>[],"repo"=>nil})
|
57
|
+
rescue Exception => e
|
58
|
+
puts e
|
59
|
+
end
|
60
|
+
Sys.new.save_assigs("#{ENV['HOME']}/.ghedsh",list)
|
61
|
+
|
31
62
|
end
|
32
63
|
|
33
|
-
|
64
|
+
|
65
|
+
def get_assigs(client,config)
|
66
|
+
list=self.load_assig()
|
67
|
+
assiglist=[]
|
68
|
+
assig=list["orgs"].detect{|aux| aux["name"]==config["Org"]}
|
69
|
+
if assig!=nil
|
70
|
+
if assig["assigs"].empty?
|
71
|
+
puts "No assignments are available yet"
|
72
|
+
else
|
73
|
+
assig["assigs"].each do |i|
|
74
|
+
assiglist.push(i["name_assig"])
|
75
|
+
end
|
76
|
+
end
|
77
|
+
else
|
78
|
+
list["orgs"].push({"name"=>config["Org"],"assigs"=>[]})
|
79
|
+
Sys.new.save_assigs("#{ENV['HOME']}/.ghedsh",list)
|
80
|
+
end
|
81
|
+
return assiglist
|
34
82
|
end
|
35
83
|
|
84
|
+
|
85
|
+
|
36
86
|
def add_team_to_assig(client,config,data)
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
def add_group_to_assig(client,config,data)
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
def add_repo_to_assig(client,config,data)
|
95
|
+
options=Hash.new
|
96
|
+
options[:organization]=config["Org"]
|
97
|
+
options[:auto_init]=true
|
98
|
+
|
99
|
+
client.create_repository(data,options)
|
100
|
+
|
37
101
|
end
|
38
102
|
#------------End assig. stuff------------
|
39
103
|
|
data/lib/actions/repo.rb
CHANGED
@@ -49,9 +49,23 @@ class Repositories
|
|
49
49
|
#print i[:sha],"\n",i[:commit][:author][:name],"\n",i[:commit][:author][:date],"\n",i[:commit][:message],"\n\n"
|
50
50
|
puts "##{i[:number]} state: #{i[:state]} -> #{i[:title]} "
|
51
51
|
end
|
52
|
+
return mem
|
52
53
|
puts "\n"
|
53
54
|
end
|
54
55
|
|
56
|
+
def get_issues(client,config,scope)
|
57
|
+
case
|
58
|
+
when scope==USER_REPO
|
59
|
+
if config["Repo"].split("/").size == 1
|
60
|
+
mem=client.list_issues(config["User"]+"/"+config["Repo"],{:state=>"all"})
|
61
|
+
else
|
62
|
+
mem=client.list_issues(config["Repo"],{:state=>"all"})
|
63
|
+
end
|
64
|
+
when scope==ORGS_REPO || scope==TEAM_REPO
|
65
|
+
mem=client.list_issues(config["Org"]+"/"+config["Repo"],{:state=>"all"})
|
66
|
+
end
|
67
|
+
return mem
|
68
|
+
end
|
55
69
|
#Show repositories and return a list of them
|
56
70
|
#exp = regular expression
|
57
71
|
def show_repos(client,config,scope,exp)
|
@@ -380,7 +394,7 @@ class Repositories
|
|
380
394
|
if show!=false
|
381
395
|
self.show_files(list)
|
382
396
|
else
|
383
|
-
return list
|
397
|
+
return list
|
384
398
|
end
|
385
399
|
else
|
386
400
|
puts "#{path} is not a directory. If you want to open a file try to use cat <path>"
|
data/lib/actions/system.rb
CHANGED
@@ -9,7 +9,8 @@ require 'version'
|
|
9
9
|
class Sys
|
10
10
|
attr_reader :client
|
11
11
|
attr_reader :memory
|
12
|
-
LIST = ['repos', 'exit', 'orgs','help', 'people','teams', 'cd ', 'cd repo ','commits','forks', 'add_team_member ','new_team ','rm_team ','new_repository ','new_assignment ','clone ', 'issues',
|
12
|
+
LIST = ['repos', 'exit', 'orgs','help', 'people','teams', 'cd ', 'cd repo ','commits','forks', 'add_team_member ','new_team ','rm_team ','new_repository ','new_assignment ','clone ', 'issues',
|
13
|
+
'version', 'cat ', 'groups', 'files', 'assignments'].sort
|
13
14
|
|
14
15
|
def initialize()
|
15
16
|
@memory=[]
|
@@ -165,13 +166,27 @@ class Sys
|
|
165
166
|
|
166
167
|
def load_assig_db(path)
|
167
168
|
if (File.exist?(path))==true
|
168
|
-
|
169
|
+
if File.exist?("#{path}/assignments.json")
|
170
|
+
json = File.read("#{path}/assignments.json")
|
171
|
+
else
|
172
|
+
#{"Organization":[{"name":null,"assignments":[{"name":null,"teams":{"teamid":null}}]}]}
|
173
|
+
con={:orgs=>[]}
|
174
|
+
File.write("#{path}/assignments.json",con.to_json)
|
175
|
+
json = File.read("#{path}/assignments.json")
|
176
|
+
end
|
177
|
+
end
|
178
|
+
config=JSON.parse(json)
|
179
|
+
return config
|
180
|
+
end
|
181
|
+
|
182
|
+
def load_script(path)
|
183
|
+
if (File.exist?(path))==true
|
184
|
+
script = File.read("#{path}")
|
185
|
+
return script.split("\n")
|
169
186
|
else
|
170
|
-
|
171
|
-
|
187
|
+
puts "No script is found with that name"
|
188
|
+
return []
|
172
189
|
end
|
173
|
-
config=JSON.parse(json)
|
174
|
-
return config
|
175
190
|
end
|
176
191
|
|
177
192
|
def load_groups(path)
|
@@ -195,6 +210,10 @@ class Sys
|
|
195
210
|
File.write("#{path}/groups.json",data.to_json)
|
196
211
|
end
|
197
212
|
|
213
|
+
def save_assigs(path,data)
|
214
|
+
File.write("#{path}/assignments.json",data.to_json)
|
215
|
+
end
|
216
|
+
|
198
217
|
#creates all ghedsh local stuff
|
199
218
|
def create_config(configure_path)
|
200
219
|
con={:User=>nil,:Org=>nil,:Repo=>nil,:Team=>nil,:TeamID=>nil}
|
data/lib/interface.rb
CHANGED
@@ -17,6 +17,7 @@ ORGS=2
|
|
17
17
|
USER_REPO=10
|
18
18
|
ORGS_REPO=3
|
19
19
|
TEAM=4
|
20
|
+
ASSIG=6
|
20
21
|
TEAM_REPO=5
|
21
22
|
|
22
23
|
class Interface
|
@@ -25,7 +26,7 @@ class Interface
|
|
25
26
|
attr_accessor :client
|
26
27
|
attr_accessor :deep
|
27
28
|
attr_accessor :memory
|
28
|
-
attr_reader :orgs_list,:repos_list, :teamlist, :orgs_repos, :teams_repos, :repo_path
|
29
|
+
attr_reader :orgs_list,:repos_list, :teamlist, :orgs_repos, :teams_repos, :repo_path, :assig_path, :issues_list
|
29
30
|
|
30
31
|
def initialize
|
31
32
|
@sysbh=Sys.new()
|
@@ -46,7 +47,7 @@ class Interface
|
|
46
47
|
raise
|
47
48
|
rescue Exception => e
|
48
49
|
puts "exit"
|
49
|
-
|
50
|
+
puts e
|
50
51
|
end
|
51
52
|
end
|
52
53
|
end
|
@@ -61,6 +62,7 @@ class Interface
|
|
61
62
|
return @config["User"]+">"+ "\e[31m#{@config["Repo"]}\e[0m"+"> "
|
62
63
|
end
|
63
64
|
when @deep == ORGS then return @config["User"]+">"+ "\e[34m#{@config["Org"]}\e[0m"+"> "
|
65
|
+
when @deep == ASSIG then return @config["User"]+">"+ "\e[34m#{@config["Org"]}\e[0m"+">"+"\e[35m#{@assig_path}\e[0m"+"> "
|
64
66
|
when @deep == TEAM then return @config["User"]+">"+"\e[34m#{@config["Org"]}\e[0m"+">"+"\e[32m#{@config["Team"]}\e[0m"+"> "
|
65
67
|
when @deep == TEAM_REPO
|
66
68
|
if @repo_path!=""
|
@@ -134,6 +136,9 @@ class Interface
|
|
134
136
|
@config["TeamID"]=nil
|
135
137
|
@teams_repos=[]
|
136
138
|
@deep=2
|
139
|
+
when @deep == ASSIG
|
140
|
+
@deep=ORGS
|
141
|
+
@assig_path=""
|
137
142
|
when @deep == TEAM_REPO
|
138
143
|
if @repo_path==""
|
139
144
|
@config["Repo"]=nil
|
@@ -155,7 +160,7 @@ class Interface
|
|
155
160
|
@config["TeamID"]=nil
|
156
161
|
@deep=1
|
157
162
|
@orgs_repos=[]; @teams_repos=[]
|
158
|
-
@repo_path=""
|
163
|
+
@repo_path=""; @assig_path="";
|
159
164
|
end
|
160
165
|
end
|
161
166
|
|
@@ -189,7 +194,9 @@ class Interface
|
|
189
194
|
@deep=TEAM
|
190
195
|
else
|
191
196
|
puts "\nNo team is available with that name"
|
192
|
-
|
197
|
+
if cdassig(path)==false
|
198
|
+
self.set(path)
|
199
|
+
end
|
193
200
|
end
|
194
201
|
when @deep == TEAM
|
195
202
|
self.set(path)
|
@@ -221,6 +228,7 @@ class Interface
|
|
221
228
|
end
|
222
229
|
else
|
223
230
|
puts "\nNo organization is available with that name"
|
231
|
+
self.set(path)
|
224
232
|
end
|
225
233
|
when @deep==ORGS
|
226
234
|
if aux[path_split[0]]!=nil
|
@@ -294,6 +302,20 @@ class Interface
|
|
294
302
|
end
|
295
303
|
end
|
296
304
|
|
305
|
+
def cdassig(path)
|
306
|
+
o=Organizations.new()
|
307
|
+
list=o.get_assigs(@client,@config)
|
308
|
+
if list.one?{|aux| aux==path}
|
309
|
+
@deep=ASSIG
|
310
|
+
@assig_path=path
|
311
|
+
puts "Set in #{@config["Org"]} assignment: #{path}\n\n"
|
312
|
+
return true
|
313
|
+
else
|
314
|
+
puts "No assignment is available with that name"
|
315
|
+
return false
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
297
319
|
def orgs()
|
298
320
|
case
|
299
321
|
when @deep==USER
|
@@ -396,10 +418,11 @@ class Interface
|
|
396
418
|
#Main program
|
397
419
|
def run(config_path, argv_token,user)
|
398
420
|
ex=1
|
421
|
+
opscript=[]
|
399
422
|
|
400
423
|
@sysbh.write_initial_memory()
|
401
424
|
HelpM.new.welcome()
|
402
|
-
|
425
|
+
o=Organizations.new
|
403
426
|
t=Teams.new
|
404
427
|
r=Repositories.new
|
405
428
|
s=Sys.new
|
@@ -424,8 +447,15 @@ class Interface
|
|
424
447
|
|
425
448
|
while ex != 0
|
426
449
|
|
427
|
-
|
428
|
-
|
450
|
+
if opscript.empty?
|
451
|
+
op=Readline.readline(self.prompt,true)
|
452
|
+
opcd=op.split
|
453
|
+
else
|
454
|
+
op=opscript[0]
|
455
|
+
opcd=op.split
|
456
|
+
opscript.delete(opscript[0])
|
457
|
+
end
|
458
|
+
|
429
459
|
case
|
430
460
|
when op == "exit" then ex=0
|
431
461
|
s.save_cache(config_path,@config)
|
@@ -440,7 +470,7 @@ class Interface
|
|
440
470
|
when op == "commits" then self.commits()
|
441
471
|
when op == "issues"
|
442
472
|
if @deep==ORGS_REPO || @deep==USER_REPO || @deep==TEAM_REPO
|
443
|
-
r.show_issues(@client,@config,@deep)
|
473
|
+
@issues_list=r.show_issues(@client,@config,@deep)
|
444
474
|
end
|
445
475
|
when op == "col" then self.collaborators()
|
446
476
|
when op == "forks" then self.show_forks()
|
@@ -450,10 +480,32 @@ class Interface
|
|
450
480
|
end
|
451
481
|
when op == "version"
|
452
482
|
puts "GitHub Education Shell v#{Ghedsh::VERSION}"
|
483
|
+
when op == "assignments"
|
484
|
+
if @deep==ORGS
|
485
|
+
o.show_assignments(@cliente,@config)
|
486
|
+
end
|
487
|
+
end
|
488
|
+
|
489
|
+
if opcd[0]=="issue" and opcd.size>1
|
490
|
+
issfound=0
|
491
|
+
@issues_list=r.get_issues(@client,@config,@deep)
|
492
|
+
if @issues_list!=nil
|
493
|
+
@issues_list.each do |i|
|
494
|
+
if i[:number]==opcd[1].to_i
|
495
|
+
puts "##{i[:number]} state: #{i[:state]} -> #{i[:title]} \n"
|
496
|
+
puts "#{i[:body]}"
|
497
|
+
issfound=1
|
498
|
+
end
|
499
|
+
end
|
500
|
+
end
|
501
|
+
if issfound==0
|
502
|
+
puts "Issue not found"
|
503
|
+
end
|
504
|
+
puts "\n"
|
453
505
|
end
|
454
506
|
|
455
507
|
if opcd[0]=="cd" and opcd[1]!=".."
|
456
|
-
if opcd[1]=="/"
|
508
|
+
if opcd[1]=="/" or opcd.size==1
|
457
509
|
self.cdback(true)
|
458
510
|
else
|
459
511
|
if opcd[1]=="repo" and opcd.size>2
|
@@ -463,6 +515,9 @@ class Interface
|
|
463
515
|
end
|
464
516
|
end
|
465
517
|
end
|
518
|
+
if opcd[0]=="do" and opcd.size>1
|
519
|
+
opscript=s.load_script(opcd[1])
|
520
|
+
end
|
466
521
|
if opcd[0]=="set"
|
467
522
|
self.set(opcd[1])
|
468
523
|
end
|
@@ -520,10 +575,11 @@ class Interface
|
|
520
575
|
if opcd[0]=="new_repository" and opcd.size==2
|
521
576
|
r.create_repository(@client,@config,opcd[1],@deep)
|
522
577
|
end
|
523
|
-
if opcd[0]=="new_assignment" and opcd.size>2
|
578
|
+
if opcd[0]=="new_assignment" and opcd.size>1 #2
|
524
579
|
case
|
525
580
|
when @deep==ORGS
|
526
|
-
r.create_repository_by_teamlist(@client,@config,opcd[1],opcd[2,opcd.size],self.get_teamlist(opcd[2,opcd.size]))
|
581
|
+
#r.create_repository_by_teamlist(@client,@config,opcd[1],opcd[2,opcd.size],self.get_teamlist(opcd[2,opcd.size]))
|
582
|
+
o.create_assig(@client,@config,opcd[1])
|
527
583
|
end
|
528
584
|
end
|
529
585
|
if opcd[0]=="new_group" and opcd.size>2
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ghedsh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Javier Clemente
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-06-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: octokit
|
@@ -87,7 +87,6 @@ files:
|
|
87
87
|
- lib/actions/system.rb
|
88
88
|
- lib/actions/teams.rb
|
89
89
|
- lib/actions/user.rb
|
90
|
-
- lib/db/assignments.json
|
91
90
|
- lib/interface.rb
|
92
91
|
- lib/version.rb
|
93
92
|
- spec/spec.rb
|
data/lib/db/assignments.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"Organization":[{"name":null,"assignements":[{"name":null,"teams":{"teamid":null}}]}]}
|