interstate 0.0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,10 @@
1
+ *.gem
2
+ .bundle
3
+ .DS_Store
4
+ .config
5
+ .maps
6
+ .roads
7
+ .staff
8
+ Gemfile.lock
9
+ pkg/*
10
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in interstate.gemspec
4
+ gemspec
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ lib_dir = File.join(File.dirname(__FILE__), '..', 'lib')
4
+ $LOAD_PATH.unshift lib_dir if File.directory?(lib_dir)
5
+
6
+ require 'interstate'
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "interstate/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "interstate"
7
+ s.version = Interstate::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Alec Sloman"]
10
+ s.email = ["alec@suprfrends.com"]
11
+ s.homepage = "http://www.bakedcode.com"
12
+ s.summary = %q{Interstate-CLI}
13
+ s.description = %q{A command line utility for Interstate, in Ruby using Thor}
14
+
15
+ s.add_dependency "thor"
16
+ s.add_dependency "json"
17
+ s.add_dependency "oauth2"
18
+ s.add_dependency "nestful"
19
+ s.add_dependency "terminal-table"
20
+ s.add_dependency "rainbow"
21
+ s.add_dependency "time-ago-in-words"
22
+
23
+ s.rubyforge_project = "interstate"
24
+
25
+ s.files = `git ls-files`.split("\n")
26
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
27
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
28
+ s.require_paths = ["lib"]
29
+ end
@@ -0,0 +1,42 @@
1
+ require "nestful"
2
+ require "lib/store"
3
+
4
+ class API
5
+
6
+ @@token = Store.load_config["api"]
7
+
8
+ def self.roadmaps()
9
+ url = "https://api.interstateapp.com/v1/roadmap/listAll.json?oauth_token=#{@@token}"
10
+ return (Nestful.json_get url)["response"]
11
+ end
12
+
13
+ def self.roads(_id)
14
+ url = "https://api.interstateapp.com/v1/roadmap/roads/id/#{_id}.json?oauth_token=#{@@token}"
15
+ return (Nestful.json_get url)["response"]
16
+ end
17
+
18
+ def self.road(_id)
19
+ url = "https://api.interstateapp.com/v1/road/#{_id}.json?oauth_token=#{@@token}"
20
+ return (Nestful.json_get url)["response"]
21
+ end
22
+
23
+ def self.update_road(_id, message, status)
24
+ params = { "update" => "#{message}" }
25
+ if status != nil
26
+ params["status"] = status
27
+ end
28
+ url = "https://api.interstateapp.com/v1/road/update/id/#{_id}.json?oauth_token=#{@@token}"
29
+ return JSON.parse(Nestful.post url, :params => params)["response"]
30
+ end
31
+
32
+ def self.staff(_id)
33
+ url = "https://api.interstateapp.com/v1/roadmap/staff/id/#{_id}.json?oauth_token=#{@@token}"
34
+ return (Nestful.json_get url)["response"]
35
+ end
36
+
37
+ def self.add_road(params)
38
+ url = "https://api.interstateapp.com/v1/road/new.json?oauth_token=#{@@token}"
39
+ return JSON.parse(Nestful.post url, :params => params)["response"]
40
+ end
41
+
42
+ end
@@ -0,0 +1,125 @@
1
+ require "rubygems" # ruby1.9 doesn't "require" it though
2
+ require "thor"
3
+ require "json"
4
+ require "rainbow"
5
+ require "nestful"
6
+ require "pp"
7
+ require "time-ago-in-words"
8
+ require "lib/store"
9
+ require "lib/api"
10
+ require "lib/table"
11
+
12
+ # Interstate-CLI by BakedCode
13
+
14
+ class Interstate < Thor
15
+
16
+ # Load the config files etc.
17
+ config = Store.load_config
18
+ @@maps = Store.load_maps
19
+ @@roads = Store.load_roads
20
+ @@staff = Store.load_staff
21
+ @@current_map = config["current_map"]
22
+
23
+ # maps
24
+ desc "maps", "List roadmaps"
25
+ method_option :reload, :type => :boolean, :force => true, :aliases => "-r"
26
+ def maps
27
+ Table.maps(@@maps, @@current_map)
28
+ end
29
+
30
+ # switch
31
+ desc "switch", "Switch to a different roadmap"
32
+ def switch(roadmapID)
33
+ if (@@maps[roadmapID])
34
+ Store.set_current_map(roadmapID)
35
+ puts "\nSwitch >> " + "#{@@maps[roadmapID]["title"]}\n".bright
36
+ else
37
+ puts "No roadmap with that shortcode".bright.color(:red)
38
+ end
39
+ end
40
+
41
+ # roads
42
+ desc "roads", "List roads in roadmap"
43
+ method_option :status, :type => :boolean, :aliases => "-r", :default => false, :desc => "Displays a guide and prompts you for a new status code."
44
+ def roads
45
+ currentRoads = @@roads[@@current_map]
46
+ currentMap = @@maps[@@current_map]
47
+ if options.status != nil
48
+ puts "Caching roads...".color(:green)
49
+ roads = API.roads(currentMap["_id"])
50
+ Store.overwrite_roads(roads, @@current_map)
51
+ @@roads = Store.load_roads
52
+ currentRoads = @@roads[@@current_map]
53
+ end
54
+ Table.roads(currentRoads, currentMap["title"])
55
+ end
56
+
57
+ # show
58
+ desc "show", "Show details for particular road"
59
+ def show(roadID)
60
+ if @@roads[@@current_map][roadID] == nil
61
+ puts "\nA roadmap with that shortcode does not exist.\n".bright.color(:red)
62
+ else
63
+ id = @@roads[@@current_map][roadID]["_id"]
64
+ staff = @@staff["#{@@current_map}"]
65
+ road = API.road(id)
66
+ Table.road(road, roadID, staff)
67
+ end
68
+ end
69
+
70
+ # add
71
+ desc "add", "Add a new road to current roadmap"
72
+ def add
73
+ # Get user input
74
+ id = @@maps[@@current_map]["_id"]
75
+ puts "\nAdding a road to #{@@maps[@@current_map]["title"]}".bright
76
+ puts "Title".bright
77
+ title = STDIN.gets
78
+ puts "Description".bright
79
+ desc = STDIN.gets
80
+ params = { :roadmapId => "#{id}", :title => "#{title}", :description => "#{desc}" }
81
+
82
+ # POST the road to the API
83
+ road = API.add_road(params)
84
+ # Get latest from API
85
+ roads = API.roads(@@maps[@@current_map]["_id"])
86
+ # Overwrite .roads with new latest list
87
+ Store.overwrite_roads(roads, @@current_map)
88
+
89
+ # Reprint the new road list
90
+ puts "\n#{road["title"]} was added successfully.\n".bright.color(:green)
91
+
92
+ end
93
+
94
+ # update
95
+ desc "update", "Update a road"
96
+ method_option :message, :type => :string, :aliases => "-m", :required => true, :desc => "A required update message."
97
+ method_option :status, :type => :boolean, :aliases => "-s", :default => false, :desc => "Displays a guide and prompts you for a new status code."
98
+ def update(roadID)
99
+ if @@roads[@@current_map][roadID] == nil
100
+ puts "\nA road with that shortcode does not exist.\n".bright.color(:red)
101
+ else
102
+ status = nil
103
+ if options.status == true
104
+ puts "\n" + "Message".bright + " #{options.message}"
105
+ Table.status
106
+ puts "Enter a new status code and press return".bright
107
+ status = STDIN.gets
108
+ end
109
+ id = @@roads[@@current_map][roadID]["_id"]
110
+ road = API.update_road(id, options.message, status)
111
+ staff = @@staff["#{@@current_map}"]
112
+ puts "\n#{road["title"]} was updated successfully.".bright.color(:green)
113
+ Table.road(road, roadID, staff)
114
+ end
115
+ end
116
+
117
+ # reset
118
+ desc "reset", "Reset all config files"
119
+ def reset
120
+ Store.reset_config
121
+ end
122
+
123
+ end
124
+
125
+ Interstate.start
@@ -0,0 +1,3 @@
1
+ module Interstate
2
+ VERSION = "0.0.2.1"
3
+ end
File without changes
@@ -0,0 +1,118 @@
1
+ class Store
2
+
3
+ def self.load_config()
4
+ begin
5
+ Marshal.load(File.read(".config"))
6
+ rescue
7
+ puts "Welcome to Interstate! No config was detected. Enter API key to continue:".color:yellow
8
+ settings = {"api" => STDIN.gets, "current_map" => nil}
9
+ open('.config', 'wb') { |f| f.puts Marshal.dump(settings) }
10
+ Marshal.load(File.read(".config"))
11
+ end
12
+ end
13
+
14
+ def self.load_maps()
15
+ begin
16
+ Marshal.load(File.read(".maps"))
17
+ rescue
18
+ puts "Caching roadmaps...".color:green
19
+ apps = API.roadmaps
20
+ newData = {}
21
+ apps.each_pair do |key, app|
22
+ app.each do |roadmap|
23
+ shortcode = "#{Array.new(1) { (rand(122-97) + 97).chr }}#{10 + rand(89)}"
24
+ newData["#{shortcode}"] = {"title" => roadmap["title"], "_id" => roadmap["_id"]}
25
+ end
26
+ end
27
+ open('.maps', 'wb') { |f| f.puts Marshal.dump(newData) }
28
+ Marshal.load(File.read('.maps'))
29
+ end
30
+ end
31
+
32
+ def self.load_roads()
33
+ begin
34
+ Marshal.load(File.read(".roads"))
35
+ rescue
36
+ puts "Caching roads...".color:green
37
+ roadmapHash = {}
38
+ maps = self.load_maps
39
+ maps.each_pair do |key, roadmap|
40
+ roads = API.roads(roadmap["_id"])
41
+ roadHash = {}
42
+ roads.each do |road|
43
+ if road["isRoute"]
44
+ road["roads"].each do |subRoad|
45
+ shortcode = "#{Array.new(1) { (rand(122-97) + 97).chr }}#{10 + rand(89)}"
46
+ roadHash["#{shortcode}"] = {"title" => subRoad["title"], "_id" => subRoad["_id"], "description" => subRoad["description"], "route" => road["title"]}
47
+ end
48
+ else
49
+ shortcode = "#{Array.new(1) { (rand(122-97) + 97).chr }}#{10 + rand(89)}"
50
+ roadHash["#{shortcode}"] = {"title" => road["title"], "_id" => road["_id"], "description" => road["description"], "route" => ""}
51
+ end
52
+ end
53
+ roadmapHash[key] = roadHash
54
+ end
55
+ data = Marshal.dump(roadmapHash)
56
+ open('.roads', 'wb') { |f| f.puts data }
57
+ data = File.read('.roads')
58
+ Marshal.load(data)
59
+ end
60
+ end
61
+
62
+ def self.overwrite_roads(roads, current_map)
63
+ allRoads = self.load_roads
64
+ roadHash = {}
65
+ roads.each do |road|
66
+ if road["isRoute"]
67
+ road["roads"].each do |subRoad|
68
+ shortcode = "#{Array.new(1) { (rand(122-97) + 97).chr }}#{10 + rand(89)}"
69
+ roadHash["#{shortcode}"] = {"title" => subRoad["title"], "_id" => subRoad["_id"], "description" => subRoad["description"], "route" => road["title"]}
70
+ end
71
+ else
72
+ shortcode = "#{Array.new(1) { (rand(122-97) + 97).chr }}#{10 + rand(89)}"
73
+ roadHash["#{shortcode}"] = {"title" => road["title"], "_id" => road["_id"], "description" => road["description"], "route" => ""}
74
+ end
75
+ end
76
+ allRoads[current_map] = roadHash
77
+ open('.roads', 'wb') { |f| f.puts Marshal.dump(allRoads) }
78
+ return self.load_roads
79
+ end
80
+
81
+ def self.load_staff()
82
+ begin
83
+ Marshal.load(File.read('.staff'))
84
+ rescue
85
+ puts "Caching staff...".color(:green)
86
+ roadmapHash = {}
87
+ maps = self.load_maps
88
+ maps.each_pair do |key, roadmap|
89
+ roadmap = API.staff(roadmap["_id"])
90
+ staffHash = {}
91
+ roadmap.each do |staff|
92
+ staffHash[staff["_id"]] = staff["fullName"]
93
+ end
94
+ roadmapHash[key] = staffHash
95
+ end
96
+ open('.staff', 'wb') { |f| f.puts Marshal.dump(roadmapHash) }
97
+ Marshal.load(File.read('.staff'))
98
+ end
99
+ end
100
+
101
+ def self.set_current_map(id)
102
+ config = Marshal.load(File.read(".config"))
103
+ data = Marshal.dump({"api" => config["api"], "current_map" => id})
104
+ open('.config', 'wb') { |f| f.puts data }
105
+ end
106
+
107
+ def self.reset_config()
108
+ File.delete(".config")
109
+ File.delete(".maps")
110
+ File.delete(".roads")
111
+ File.delete(".staff")
112
+ self.load_config
113
+ self.load_maps
114
+ self.load_roads
115
+ self.load_staff
116
+ end
117
+
118
+ end
@@ -0,0 +1,79 @@
1
+ require "terminal-table/import"
2
+
3
+ class Table
4
+
5
+ # Print the maps table
6
+ def self.maps(maps, currentMap)
7
+ user_table = table do |t|
8
+ t.headings = 'ID', 'Title'
9
+ maps.each_pair do |key, roadmap|
10
+ t << [key ,roadmap["title"]]
11
+ end
12
+ end
13
+ puts "\n"
14
+ puts user_table
15
+ begin
16
+ puts "Current " + "#{currentMap}".bright.background(:blue) + " >> " + "#{maps[currentMap]["title"]}".bright
17
+ rescue
18
+ puts "None selected.".bright.color(:yellow)
19
+ end
20
+ puts "\n"
21
+ end
22
+
23
+ def self.roads(roads, currentMap)
24
+ begin
25
+ user_table = table do |t|
26
+ t.headings = 'ID', 'Title', 'Route', 'Description'
27
+ roads.each_pair do |shortcode, road|
28
+ t << [shortcode ,road["title"], road["route"], "#{road["description"][0, 100]}..."]
29
+ end
30
+ end
31
+ puts "\n"
32
+ puts "Roads for #{currentMap}".bright
33
+ puts user_table
34
+ puts "\n"
35
+ rescue
36
+ puts "Could not get roads"
37
+ end
38
+ end
39
+
40
+ def self.road(road, roadID, allStaff)
41
+ puts "\n"
42
+ puts "#{roadID.bright} >> ".background(:blue) + "#{road["title"]}".bright
43
+ puts "#{road["description"]}"
44
+ puts "#{road["status"]["status"]}".bright
45
+
46
+ updates = road["updates"]
47
+
48
+ if updates.count > 0
49
+ user_table = table do |t|
50
+ t.headings = 'Staff', 'Message', 'Time'
51
+ updates.each do |update|
52
+ staff = allStaff["#{update["staffId"]}"]
53
+ time = Time.at(update["time"])
54
+ t << ["#{staff}", "#{update["update"]}", time.ago_in_words]
55
+ end
56
+ end
57
+ puts "\n"
58
+ puts user_table
59
+ puts "\n"
60
+ else
61
+ puts "\n"
62
+ puts "No Updates"
63
+ puts "\n"
64
+ end
65
+ end
66
+
67
+ def self.status()
68
+ statuses = ["Stopped", "Started", "10%", "20%", "30%", "40%", "50%", "60%", "70%", "80%", "90%", "Ready", "Launched", "Proposed", "Postponed"]
69
+ user_table = table do |t|
70
+ t.headings = "Status", "Code"
71
+ statuses.each_with_index do |value, index|
72
+ t << [value, index]
73
+ end
74
+ end
75
+ puts "\n"
76
+ puts user_table
77
+ puts "\n"
78
+ end
79
+ end
metadata ADDED
@@ -0,0 +1,175 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: interstate
3
+ version: !ruby/object:Gem::Version
4
+ hash: 69
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 2
10
+ - 1
11
+ version: 0.0.2.1
12
+ platform: ruby
13
+ authors:
14
+ - Alec Sloman
15
+ autorequire:
16
+ bindir: bin
17
+ cert_chain: []
18
+
19
+ date: 2011-06-04 00:00:00 Z
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: thor
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: json
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ name: oauth2
51
+ prerelease: false
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ type: :runtime
62
+ version_requirements: *id003
63
+ - !ruby/object:Gem::Dependency
64
+ name: nestful
65
+ prerelease: false
66
+ requirement: &id004 !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ hash: 3
72
+ segments:
73
+ - 0
74
+ version: "0"
75
+ type: :runtime
76
+ version_requirements: *id004
77
+ - !ruby/object:Gem::Dependency
78
+ name: terminal-table
79
+ prerelease: false
80
+ requirement: &id005 !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ hash: 3
86
+ segments:
87
+ - 0
88
+ version: "0"
89
+ type: :runtime
90
+ version_requirements: *id005
91
+ - !ruby/object:Gem::Dependency
92
+ name: rainbow
93
+ prerelease: false
94
+ requirement: &id006 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ hash: 3
100
+ segments:
101
+ - 0
102
+ version: "0"
103
+ type: :runtime
104
+ version_requirements: *id006
105
+ - !ruby/object:Gem::Dependency
106
+ name: time-ago-in-words
107
+ prerelease: false
108
+ requirement: &id007 !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ hash: 3
114
+ segments:
115
+ - 0
116
+ version: "0"
117
+ type: :runtime
118
+ version_requirements: *id007
119
+ description: A command line utility for Interstate, in Ruby using Thor
120
+ email:
121
+ - alec@suprfrends.com
122
+ executables:
123
+ - interstate
124
+ extensions: []
125
+
126
+ extra_rdoc_files: []
127
+
128
+ files:
129
+ - .gitignore
130
+ - Gemfile
131
+ - Rakefile
132
+ - bin/interstate
133
+ - interstate.gemspec
134
+ - lib/.DS_Store
135
+ - lib/api.rb
136
+ - lib/interstate.rb
137
+ - lib/interstate/version.rb
138
+ - lib/memfetcher.rb
139
+ - lib/store.rb
140
+ - lib/table.rb
141
+ homepage: http://www.bakedcode.com
142
+ licenses: []
143
+
144
+ post_install_message:
145
+ rdoc_options: []
146
+
147
+ require_paths:
148
+ - lib
149
+ required_ruby_version: !ruby/object:Gem::Requirement
150
+ none: false
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ hash: 3
155
+ segments:
156
+ - 0
157
+ version: "0"
158
+ required_rubygems_version: !ruby/object:Gem::Requirement
159
+ none: false
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ hash: 3
164
+ segments:
165
+ - 0
166
+ version: "0"
167
+ requirements: []
168
+
169
+ rubyforge_project: interstate
170
+ rubygems_version: 1.8.5
171
+ signing_key:
172
+ specification_version: 3
173
+ summary: Interstate-CLI
174
+ test_files: []
175
+