interstate 0.0.2.1 → 0.0.3
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.
- data/.todo/list.yml +3 -0
- data/interstate.gemspec +1 -0
- data/lib/.DS_Store +0 -0
- data/lib/api.rb +48 -1
- data/lib/interstate/version.rb +1 -1
- data/lib/interstate.rb +69 -21
- data/lib/store.rb +50 -9
- metadata +20 -25
data/.todo/list.yml
ADDED
data/interstate.gemspec
CHANGED
data/lib/.DS_Store
CHANGED
Binary file
|
data/lib/api.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require "nestful"
|
2
|
-
require "
|
2
|
+
require "typhoeus"
|
3
3
|
|
4
4
|
class API
|
5
5
|
|
@@ -39,4 +39,51 @@ class API
|
|
39
39
|
return JSON.parse(Nestful.post url, :params => params)["response"]
|
40
40
|
end
|
41
41
|
|
42
|
+
def self.delete_road(_id)
|
43
|
+
url = "https://api.interstateapp.com/v1/road/delete/id/#{_id}.json?oauth_token=#{@@token}"
|
44
|
+
return JSON.parse(Nestful.get url)["response"]
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.log(_id, appId)
|
48
|
+
url = "https://api.interstateapp.com/v1/activity/list/id/#{appId}/limit/10.json?oauth_token=#{@@token}"
|
49
|
+
return JSON.parse(Nestful.post url, :params => { "filter" => "roadmap-#{_id}" } )["response"]
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.updates(log) # we'll handle updates by parallel processing them with typhoeus
|
53
|
+
hydra = Typhoeus::Hydra.new(:max_concurrency => 50)
|
54
|
+
updates = []
|
55
|
+
log.each do |entry|
|
56
|
+
|
57
|
+
if entry["type"] == "github"
|
58
|
+
begin
|
59
|
+
info = entry["comments"][0]
|
60
|
+
updates << { "update" => info["comment"], "time" => info["time"], "staffId" => info["staffId"], "type" => "GitHub Commit" }
|
61
|
+
rescue
|
62
|
+
end
|
63
|
+
elsif entry["type"] == "road_update"
|
64
|
+
r = Typhoeus::Request.new("https://api.interstateapp.com/v1/update/get/id/#{entry["updateId"]}.json?oauth_token=#{@@token}")
|
65
|
+
r.on_complete do |response|
|
66
|
+
update = JSON.parse(response.body)["response"]
|
67
|
+
if update.class != NilClass
|
68
|
+
update["type"] = "Road Update"
|
69
|
+
updates << update
|
70
|
+
end
|
71
|
+
end
|
72
|
+
hydra.queue r
|
73
|
+
|
74
|
+
elsif entry["type"] == "road"
|
75
|
+
r = Typhoeus::Request.new("https://api.interstateapp.com/v1/road/#{entry["roadId"]}.json?oauth_token=#{@@token}")
|
76
|
+
r.on_complete do |response|
|
77
|
+
road = JSON.parse(response.body)["response"]
|
78
|
+
if road.class != NilClass
|
79
|
+
updates << { "update" => "New Road: #{road["title"]}", "time" => entry["time"], "staffId" => entry["staffId"], "type" => "New Road" }
|
80
|
+
end
|
81
|
+
end
|
82
|
+
hydra.queue r
|
83
|
+
end
|
84
|
+
hydra.run
|
85
|
+
end
|
86
|
+
return updates
|
87
|
+
end
|
88
|
+
|
42
89
|
end
|
data/lib/interstate/version.rb
CHANGED
data/lib/interstate.rb
CHANGED
@@ -5,14 +5,14 @@ require "rainbow"
|
|
5
5
|
require "nestful"
|
6
6
|
require "pp"
|
7
7
|
require "time-ago-in-words"
|
8
|
-
require "
|
9
|
-
require "
|
10
|
-
require "
|
8
|
+
require "store"
|
9
|
+
require "api"
|
10
|
+
require "table"
|
11
11
|
|
12
12
|
# Interstate-CLI by BakedCode
|
13
13
|
|
14
14
|
class Interstate < Thor
|
15
|
-
|
15
|
+
|
16
16
|
# Load the config files etc.
|
17
17
|
config = Store.load_config
|
18
18
|
@@maps = Store.load_maps
|
@@ -21,25 +21,25 @@ class Interstate < Thor
|
|
21
21
|
@@current_map = config["current_map"]
|
22
22
|
|
23
23
|
# maps
|
24
|
-
desc "maps", "
|
24
|
+
desc "maps", "Show a list of roadmaps"
|
25
25
|
method_option :reload, :type => :boolean, :force => true, :aliases => "-r"
|
26
26
|
def maps
|
27
27
|
Table.maps(@@maps, @@current_map)
|
28
28
|
end
|
29
29
|
|
30
|
-
#
|
31
|
-
desc "
|
32
|
-
def
|
30
|
+
# map
|
31
|
+
desc "map", "Switch to a different roadmap"
|
32
|
+
def map(roadmapID)
|
33
33
|
if (@@maps[roadmapID])
|
34
34
|
Store.set_current_map(roadmapID)
|
35
|
-
puts "\
|
35
|
+
puts "\nMap >> " + "#{@@maps[roadmapID]["title"]}\n".bright
|
36
36
|
else
|
37
37
|
puts "No roadmap with that shortcode".bright.color(:red)
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
41
|
# roads
|
42
|
-
desc "roads", "
|
42
|
+
desc "roads", "Show a list of roads in roadmap"
|
43
43
|
method_option :status, :type => :boolean, :aliases => "-r", :default => false, :desc => "Displays a guide and prompts you for a new status code."
|
44
44
|
def roads
|
45
45
|
currentRoads = @@roads[@@current_map]
|
@@ -54,11 +54,11 @@ class Interstate < Thor
|
|
54
54
|
Table.roads(currentRoads, currentMap["title"])
|
55
55
|
end
|
56
56
|
|
57
|
-
#
|
58
|
-
desc "
|
59
|
-
def
|
57
|
+
# road
|
58
|
+
desc "road", "Show details for particular road"
|
59
|
+
def road(roadID)
|
60
60
|
if @@roads[@@current_map][roadID] == nil
|
61
|
-
puts "\nA
|
61
|
+
puts "\nA road with that shortcode does not exist.\n".bright.color(:red)
|
62
62
|
else
|
63
63
|
id = @@roads[@@current_map][roadID]["_id"]
|
64
64
|
staff = @@staff["#{@@current_map}"]
|
@@ -67,15 +67,33 @@ class Interstate < Thor
|
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
+
# delete
|
71
|
+
desc "delete", "Delete an existing road"
|
72
|
+
def delete(roadID)
|
73
|
+
if @@roads[@@current_map][roadID] == nil
|
74
|
+
puts "\nA road with that shortcode does not exist.\n".bright.color(:red)
|
75
|
+
else
|
76
|
+
id = @@roads[@@current_map][roadID]["_id"]
|
77
|
+
success = API.delete_road(id)["deleted"]
|
78
|
+
if success == true
|
79
|
+
roads = API.roads(@@maps[@@current_map]["_id"])
|
80
|
+
Store.overwrite_roads(roads, @@current_map)
|
81
|
+
puts "\nRoad was successfully deleted.\n".bright.color(:green)
|
82
|
+
else
|
83
|
+
puts "\nThere was a problem deleting the road.\n".bright.color(:yellow)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
70
88
|
# add
|
71
89
|
desc "add", "Add a new road to current roadmap"
|
72
90
|
def add
|
73
91
|
# Get user input
|
74
92
|
id = @@maps[@@current_map]["_id"]
|
75
93
|
puts "\nAdding a road to #{@@maps[@@current_map]["title"]}".bright
|
76
|
-
puts "Title"
|
94
|
+
puts "Title:"
|
77
95
|
title = STDIN.gets
|
78
|
-
puts "Description"
|
96
|
+
puts "Description:"
|
79
97
|
desc = STDIN.gets
|
80
98
|
params = { :roadmapId => "#{id}", :title => "#{title}", :description => "#{desc}" }
|
81
99
|
|
@@ -93,27 +111,57 @@ class Interstate < Thor
|
|
93
111
|
|
94
112
|
# update
|
95
113
|
desc "update", "Update a road"
|
96
|
-
method_option :message, :type => :string, :aliases => "-m", :
|
97
|
-
method_option :status, :type => :
|
114
|
+
method_option :message, :type => :string, :aliases => "-m", :desc => "A required update message."
|
115
|
+
method_option :status, :type => :string, :aliases => "-s", :default => nil, :desc => "Displays a guide and prompts you for a new status code."
|
98
116
|
def update(roadID)
|
99
117
|
if @@roads[@@current_map][roadID] == nil
|
100
118
|
puts "\nA road with that shortcode does not exist.\n".bright.color(:red)
|
101
119
|
else
|
102
120
|
status = nil
|
103
|
-
|
104
|
-
|
121
|
+
stati = Store.statuses
|
122
|
+
if options.status == "status"
|
105
123
|
Table.status
|
106
124
|
puts "Enter a new status code and press return".bright
|
107
125
|
status = STDIN.gets
|
126
|
+
elsif stati.has_value?(options.status)
|
127
|
+
status = stati.index(options.status)
|
128
|
+
elsif stati.has_key?("#{options.status}")
|
129
|
+
status = "#{options.status}"
|
130
|
+
else
|
131
|
+
puts "Invalid status code.".color(:red)
|
132
|
+
end
|
133
|
+
message = nil
|
134
|
+
if options.message != nil
|
135
|
+
message = options.message
|
108
136
|
end
|
109
137
|
id = @@roads[@@current_map][roadID]["_id"]
|
110
|
-
road = API.update_road(id,
|
138
|
+
road = API.update_road(id, message, status)
|
111
139
|
staff = @@staff["#{@@current_map}"]
|
112
140
|
puts "\n#{road["title"]} was updated successfully.".bright.color(:green)
|
113
141
|
Table.road(road, roadID, staff)
|
114
142
|
end
|
115
143
|
end
|
116
144
|
|
145
|
+
# log
|
146
|
+
desc "log", "Show activity log"
|
147
|
+
def log
|
148
|
+
id = @@maps[@@current_map]["_id"]
|
149
|
+
appID = @@maps[@@current_map]["appId"]
|
150
|
+
log = API.log(id, appID) # get the log for current map
|
151
|
+
updates = API.updates(log)
|
152
|
+
staff = @@staff["#{@@current_map}"]
|
153
|
+
updates.each do |update|
|
154
|
+
if update != nil
|
155
|
+
type = update["type"]
|
156
|
+
staffID = update["staffId"]
|
157
|
+
name = staff[staffID]
|
158
|
+
time = Time.at(update["time"])
|
159
|
+
puts "\n #{update["update"]}\n\nType: #{type}\nAuthor: #{name}\nDate: #{time}"
|
160
|
+
end
|
161
|
+
end
|
162
|
+
puts "\n"
|
163
|
+
end
|
164
|
+
|
117
165
|
# reset
|
118
166
|
desc "reset", "Reset all config files"
|
119
167
|
def reset
|
data/lib/store.rb
CHANGED
@@ -21,7 +21,7 @@ class Store
|
|
21
21
|
apps.each_pair do |key, app|
|
22
22
|
app.each do |roadmap|
|
23
23
|
shortcode = "#{Array.new(1) { (rand(122-97) + 97).chr }}#{10 + rand(89)}"
|
24
|
-
newData["#{shortcode}"] = {"title" => roadmap["title"], "_id" => roadmap["_id"]}
|
24
|
+
newData["#{shortcode}"] = { "title" => roadmap["title"], "_id" => roadmap["_id"] , "appId" => roadmap["appId"] }
|
25
25
|
end
|
26
26
|
end
|
27
27
|
open('.maps', 'wb') { |f| f.puts Marshal.dump(newData) }
|
@@ -60,21 +60,41 @@ class Store
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def self.overwrite_roads(roads, current_map)
|
63
|
-
|
64
|
-
|
63
|
+
cachedRoads = self.load_roads
|
64
|
+
currentRoads = cachedRoads[current_map]
|
65
|
+
cachedIDs = []
|
66
|
+
toRemove = {}
|
67
|
+
currentRoads.each_pair do |k, v|
|
68
|
+
cachedIDs << v["_id"]
|
69
|
+
toRemove[v["_id"]] = k
|
70
|
+
end
|
71
|
+
|
65
72
|
roads.each do |road|
|
66
73
|
if road["isRoute"]
|
67
74
|
road["roads"].each do |subRoad|
|
68
|
-
|
69
|
-
|
75
|
+
if cachedIDs.include?(subRoad["_id"])
|
76
|
+
cachedIDs.delete(subRoad["_id"])
|
77
|
+
else
|
78
|
+
shortcode = "#{Array.new(1) { (rand(122-97) + 97).chr }}#{10 + rand(89)}"
|
79
|
+
currentRoads["#{shortcode}"] = {"title" => subRoad["title"], "_id" => subRoad["_id"], "description" => subRoad["description"], "route" => road["title"]}
|
80
|
+
end
|
70
81
|
end
|
71
82
|
else
|
72
|
-
|
73
|
-
|
83
|
+
if cachedIDs.include?(road["_id"])
|
84
|
+
cachedIDs.delete(road["_id"])
|
85
|
+
else
|
86
|
+
shortcode = "#{Array.new(1) { (rand(122-97) + 97).chr }}#{10 + rand(89)}"
|
87
|
+
currentRoads["#{shortcode}"] = {"title" => road["title"], "_id" => road["_id"], "description" => road["description"], "route" => ""}
|
88
|
+
end
|
74
89
|
end
|
75
90
|
end
|
76
|
-
|
77
|
-
|
91
|
+
|
92
|
+
cachedIDs.each do |_id|
|
93
|
+
currentRoads.delete(toRemove[_id])
|
94
|
+
end
|
95
|
+
|
96
|
+
cachedRoads[current_map] = currentRoads
|
97
|
+
open('.roads', 'wb') { |f| f.puts Marshal.dump(cachedRoads) }
|
78
98
|
return self.load_roads
|
79
99
|
end
|
80
100
|
|
@@ -115,4 +135,25 @@ class Store
|
|
115
135
|
self.load_staff
|
116
136
|
end
|
117
137
|
|
138
|
+
def self.statuses()
|
139
|
+
statuses = { "0" => "Stopped",
|
140
|
+
"1" => "Started",
|
141
|
+
"2" => "10%",
|
142
|
+
"3" => "20%",
|
143
|
+
"4" => "30%",
|
144
|
+
"5" => "40%",
|
145
|
+
"6" => "50%",
|
146
|
+
"7" => "60%",
|
147
|
+
"8" => "70%",
|
148
|
+
"9" => "80%",
|
149
|
+
"10" => "90%",
|
150
|
+
"11" => "Ready",
|
151
|
+
"12" => "Launched",
|
152
|
+
"13" => "Proposed",
|
153
|
+
"14" => "Postponed" }
|
154
|
+
end
|
155
|
+
|
156
|
+
|
157
|
+
|
158
|
+
|
118
159
|
end
|
metadata
CHANGED
@@ -1,14 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: interstate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
4
|
+
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
7
|
- 0
|
9
|
-
-
|
10
|
-
|
11
|
-
version: 0.0.2.1
|
8
|
+
- 3
|
9
|
+
version: 0.0.3
|
12
10
|
platform: ruby
|
13
11
|
authors:
|
14
12
|
- Alec Sloman
|
@@ -16,17 +14,16 @@ autorequire:
|
|
16
14
|
bindir: bin
|
17
15
|
cert_chain: []
|
18
16
|
|
19
|
-
date: 2011-06-
|
17
|
+
date: 2011-06-08 00:00:00 +09:00
|
18
|
+
default_executable:
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
21
|
name: thor
|
23
22
|
prerelease: false
|
24
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
24
|
requirements:
|
27
25
|
- - ">="
|
28
26
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 3
|
30
27
|
segments:
|
31
28
|
- 0
|
32
29
|
version: "0"
|
@@ -36,11 +33,9 @@ dependencies:
|
|
36
33
|
name: json
|
37
34
|
prerelease: false
|
38
35
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
-
none: false
|
40
36
|
requirements:
|
41
37
|
- - ">="
|
42
38
|
- !ruby/object:Gem::Version
|
43
|
-
hash: 3
|
44
39
|
segments:
|
45
40
|
- 0
|
46
41
|
version: "0"
|
@@ -50,11 +45,9 @@ dependencies:
|
|
50
45
|
name: oauth2
|
51
46
|
prerelease: false
|
52
47
|
requirement: &id003 !ruby/object:Gem::Requirement
|
53
|
-
none: false
|
54
48
|
requirements:
|
55
49
|
- - ">="
|
56
50
|
- !ruby/object:Gem::Version
|
57
|
-
hash: 3
|
58
51
|
segments:
|
59
52
|
- 0
|
60
53
|
version: "0"
|
@@ -64,11 +57,9 @@ dependencies:
|
|
64
57
|
name: nestful
|
65
58
|
prerelease: false
|
66
59
|
requirement: &id004 !ruby/object:Gem::Requirement
|
67
|
-
none: false
|
68
60
|
requirements:
|
69
61
|
- - ">="
|
70
62
|
- !ruby/object:Gem::Version
|
71
|
-
hash: 3
|
72
63
|
segments:
|
73
64
|
- 0
|
74
65
|
version: "0"
|
@@ -78,11 +69,9 @@ dependencies:
|
|
78
69
|
name: terminal-table
|
79
70
|
prerelease: false
|
80
71
|
requirement: &id005 !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
73
|
- - ">="
|
84
74
|
- !ruby/object:Gem::Version
|
85
|
-
hash: 3
|
86
75
|
segments:
|
87
76
|
- 0
|
88
77
|
version: "0"
|
@@ -92,11 +81,9 @@ dependencies:
|
|
92
81
|
name: rainbow
|
93
82
|
prerelease: false
|
94
83
|
requirement: &id006 !ruby/object:Gem::Requirement
|
95
|
-
none: false
|
96
84
|
requirements:
|
97
85
|
- - ">="
|
98
86
|
- !ruby/object:Gem::Version
|
99
|
-
hash: 3
|
100
87
|
segments:
|
101
88
|
- 0
|
102
89
|
version: "0"
|
@@ -106,16 +93,26 @@ dependencies:
|
|
106
93
|
name: time-ago-in-words
|
107
94
|
prerelease: false
|
108
95
|
requirement: &id007 !ruby/object:Gem::Requirement
|
109
|
-
none: false
|
110
96
|
requirements:
|
111
97
|
- - ">="
|
112
98
|
- !ruby/object:Gem::Version
|
113
|
-
hash: 3
|
114
99
|
segments:
|
115
100
|
- 0
|
116
101
|
version: "0"
|
117
102
|
type: :runtime
|
118
103
|
version_requirements: *id007
|
104
|
+
- !ruby/object:Gem::Dependency
|
105
|
+
name: typhoeus
|
106
|
+
prerelease: false
|
107
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
segments:
|
112
|
+
- 0
|
113
|
+
version: "0"
|
114
|
+
type: :runtime
|
115
|
+
version_requirements: *id008
|
119
116
|
description: A command line utility for Interstate, in Ruby using Thor
|
120
117
|
email:
|
121
118
|
- alec@suprfrends.com
|
@@ -127,6 +124,7 @@ extra_rdoc_files: []
|
|
127
124
|
|
128
125
|
files:
|
129
126
|
- .gitignore
|
127
|
+
- .todo/list.yml
|
130
128
|
- Gemfile
|
131
129
|
- Rakefile
|
132
130
|
- bin/interstate
|
@@ -138,6 +136,7 @@ files:
|
|
138
136
|
- lib/memfetcher.rb
|
139
137
|
- lib/store.rb
|
140
138
|
- lib/table.rb
|
139
|
+
has_rdoc: true
|
141
140
|
homepage: http://www.bakedcode.com
|
142
141
|
licenses: []
|
143
142
|
|
@@ -147,27 +146,23 @@ rdoc_options: []
|
|
147
146
|
require_paths:
|
148
147
|
- lib
|
149
148
|
required_ruby_version: !ruby/object:Gem::Requirement
|
150
|
-
none: false
|
151
149
|
requirements:
|
152
150
|
- - ">="
|
153
151
|
- !ruby/object:Gem::Version
|
154
|
-
hash: 3
|
155
152
|
segments:
|
156
153
|
- 0
|
157
154
|
version: "0"
|
158
155
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
159
|
-
none: false
|
160
156
|
requirements:
|
161
157
|
- - ">="
|
162
158
|
- !ruby/object:Gem::Version
|
163
|
-
hash: 3
|
164
159
|
segments:
|
165
160
|
- 0
|
166
161
|
version: "0"
|
167
162
|
requirements: []
|
168
163
|
|
169
164
|
rubyforge_project: interstate
|
170
|
-
rubygems_version: 1.
|
165
|
+
rubygems_version: 1.3.6
|
171
166
|
signing_key:
|
172
167
|
specification_version: 3
|
173
168
|
summary: Interstate-CLI
|