fjords 1.0.1

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/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .DS_Store
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem "fjords-client", :path => '~/Sites/fjords/fjords-client'
4
+
5
+ # Specify your gem's dependencies in fjords.gemspec
6
+ gemspec
7
+
8
+ group :development do
9
+ gem "rake"
10
+ gem "webmock"
11
+ gem "rspec"
12
+ gem "cucumber"
13
+ gem "aruba"
14
+ end
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
data/bin/fjords ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.expand_path('../../lib/fjords', __FILE__)
4
+ Fjords::Cli::Core.new(ARGV.dup).run
data/fjords.gemspec ADDED
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/fjords/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Thomas Reynolds"]
6
+ gem.email = ["me@tdreyno.com"]
7
+ gem.description = %q{Fjords.cc CLI}
8
+ gem.summary = %q{Fjords.cc CLI}
9
+ gem.homepage = ""
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "fjords"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Fjords::VERSION
17
+
18
+ gem.add_dependency("interact", "0.5.1")
19
+ gem.add_dependency("highline")
20
+ gem.add_dependency("progress_bar")
21
+ gem.add_dependency("fjords-client", "1.0.1")
22
+ end
@@ -0,0 +1,459 @@
1
+ require 'fileutils'
2
+ require 'shellwords'
3
+ require 'fjords-client'
4
+ require "highline/import"
5
+ require 'progress_bar'
6
+
7
+ # require "rbconfig"
8
+ # WINDOWS = !!(RbConfig::CONFIG['host_os'] =~ /mingw|mswin32|cygwin/)
9
+
10
+ class Fjords::Cli::Core
11
+ include Fjords::Cli::Runner
12
+ include Fjords::Cli::Usage
13
+ # include Interactive
14
+ # disable_rewind
15
+
16
+ def version
17
+ return if @help_only
18
+ say "fjords #{Fjords::VERSION}"
19
+ true
20
+ end
21
+
22
+ def help
23
+ say command_usage
24
+ exit
25
+ end
26
+
27
+ def signup
28
+ return if @help_only
29
+
30
+ puts
31
+ say "This process will create a new account for you."
32
+ say "Signup requires a valid US credit card which will"
33
+ say "be charged at a rate of $6 USD per month for basic"
34
+ say "service. Let's get started."
35
+ puts
36
+
37
+ username = get_unique_username
38
+ email = ask "Email: "
39
+
40
+ password = ask("Password: ") { |q| q.echo = "*" }
41
+ confirmed_password = ask("Confirm Password: ") { |q| q.echo = "*" }
42
+
43
+ if password != confirmed_password
44
+ say "Passwords do not match"
45
+ end
46
+
47
+ puts
48
+ say "Great! Now let's get your credit card information."
49
+ puts
50
+
51
+ stripe_token = get_credit_card_information
52
+
53
+ say "Creating account..."
54
+
55
+ begin
56
+ Fjords::Client.signup(email, username, password, stripe_token.id)
57
+
58
+ say "Success! Your account is ready and you have been logged-in."
59
+ rescue TooManyConnections
60
+ say "Sorry, we've reached our max users for this beta period. We're growing slowly, but surely."
61
+ end
62
+
63
+ true
64
+ end
65
+
66
+ def sites
67
+ return if @help_only
68
+ require_login!
69
+
70
+ sites = Fjords::Client.sites
71
+
72
+ if sites.length > 0
73
+ rows = sites.map do |site|
74
+ cost = "$#{(site['cost'] / 100.00).to_i}"
75
+ domain = site['internal_name']
76
+ domain = site['custom_name'] if site['custom_name'] != domain
77
+
78
+ d = DateTime.parse(site['created_at'])
79
+ [
80
+ domain,
81
+ site['type'],
82
+ cost,
83
+ site['type'] === 'temporary' ? time_to_expiry(d.to_time.to_i + (60 * 60 * 24 * 30)) : 'never'
84
+ ]
85
+ end
86
+
87
+ rows.unshift ["Domain", "Type", "Cost", "Expires"]
88
+ puts
89
+ print_table(rows, :indent => 2)
90
+ else
91
+ say "You don't currently have any sites."
92
+ end
93
+
94
+ true
95
+ end
96
+
97
+ def info
98
+ return if @help_only
99
+ require_login!
100
+
101
+ info = Fjords::Client.info
102
+ a = info["account"]
103
+ u = info["user"]
104
+
105
+ puts
106
+ print_table([
107
+ ["Username:", u["username"]],
108
+ ["Email:", u["email"]],
109
+ ["Total Cost:", "$#{(a['current_price'] / 100.00).to_i} USD per month"]
110
+ ], :indent => 2)
111
+
112
+ puts
113
+ say "For site information, see: fjords sites"
114
+
115
+ true
116
+ end
117
+
118
+ def push
119
+ return if @help_only
120
+ require_login!
121
+
122
+ path = File.expand_path(@options[:path] || Dir.pwd)
123
+ domain_file = @options[:domain_file] || "Fjordsfile"
124
+ full_domain_file_path = File.expand_path(domain_file, path)
125
+
126
+ overwrite = @options[:overwrite] || false
127
+ permanent = @options[:permanent] || nil
128
+
129
+ domain = if @options[:domain]
130
+ @options[:domain]
131
+ else
132
+ if File.exists?(full_domain_file_path)
133
+ overwrite = true
134
+ File.read(full_domain_file_path).chomp
135
+ else
136
+ nil
137
+ end
138
+ end
139
+
140
+ if domain
141
+ valid = Fjords::Client.validate_domain(domain)
142
+ if valid === false
143
+ say "The domain #{domain} is already taken by another account."
144
+ exit(0)
145
+ elsif !overwrite && valid["site"]["exists"]
146
+ unless agree("A site is already live at this domain. Overwrite?")
147
+ exit(0)
148
+ end
149
+ end
150
+ end
151
+
152
+ puts
153
+ say "Preparing to push: #{path}"
154
+
155
+ begin
156
+ zipfile, changeless, filesize = Fjords::Client.prepare_push(path, valid, domain_file)
157
+ rescue Fjords::Client::UploadTooLarge
158
+ say "Sorry, sites cannot be over 50M in size."
159
+ exit(0)
160
+ rescue Fjords::Client::NothingToUpload
161
+ say "There are no changes to push. Checksums match live site."
162
+ exit(0)
163
+ end
164
+
165
+ say "Compressed site down to #{filesize}"
166
+ say "Pushing..."
167
+
168
+ # seen_log_messages = {}
169
+
170
+ if !@options[:no_progress]
171
+ bar = ::ProgressBar.new(100, :bar, :percentage)
172
+ end
173
+
174
+ first_progress = true
175
+
176
+ last_uploaded = 0
177
+
178
+ site = Fjords::Client.push(zipfile, changeless, domain, permanent) do |data|
179
+ # data["site_logs"].each do |log|
180
+ # if !seen_log_messages[log["id"]]
181
+ # seen_log_messages[log["id"]] = log
182
+ # say "* #{log["message"]}"
183
+ # end
184
+ # end
185
+ if first_progress
186
+ puts
187
+ say "Deploying..."
188
+ first_progress = false
189
+ end
190
+
191
+ if !@options[:no_progress] && data["percentage_uploaded"] > last_uploaded
192
+ bar.count = data["percentage_uploaded"]
193
+ bar.write
194
+ last_uploaded = data["percentage_uploaded"]
195
+ end
196
+ end
197
+
198
+ if !@options[:no_progress] && last_uploaded < 100
199
+ bar.count = 100
200
+ bar.write
201
+ puts
202
+ end
203
+
204
+ puts
205
+ if site["site"]["dns_mode"] === 'alias'
206
+ cname = site["site"]["custom_name"]
207
+ say "Site is now available at: http://#{cname}"
208
+ say "Make sure your CNAME points to: #{site["site"]["internal_name"]}"
209
+ # say "Make sure your Nameservers points to us. See: fjords nameservers"
210
+ else
211
+ if site["site"]["dns_mode"] === 'random'
212
+ cname = site["site"]["internal_name"]
213
+ say %Q{Site is now available at: http://#{site["site"]["internal_name"]}}
214
+ elsif site["site"]["dns_mode"] === 'cname'
215
+ cname = site["site"]["custom_name"]
216
+ say %Q{Site is now available at: http://#{site["site"]["custom_name"]}}
217
+ if site["site"]["internal_name"] != site["site"]["custom_name"]
218
+ say "Make sure your CNAME points to: #{site["site"]["internal_name"]}"
219
+ end
220
+ end
221
+ end
222
+
223
+ if !File.exists?(full_domain_file_path)
224
+ say "Writing #{domain_file} for future pushes."
225
+
226
+ File.open(full_domain_file_path, 'w') { |f| f.write(cname) }
227
+ end
228
+
229
+ true
230
+ end
231
+
232
+ # def nameservers
233
+ # return if @help_only
234
+
235
+ # puts
236
+ # say "To setup a root domain, use our nameservers:"
237
+ # say "* ns1.fjords.cc"
238
+ # say "* ns2.fjords.cc"
239
+ # say "* ns3.fjords.cc"
240
+ # say "* ns4.fjords.cc"
241
+
242
+ # true
243
+ # end
244
+
245
+ def login
246
+ return if @help_only
247
+
248
+ if Fjords::Client.logged_in?
249
+ puts
250
+ say "Already logged-in"
251
+ return true
252
+ end
253
+
254
+ puts
255
+ username = ask "Username: "
256
+ password = ask("Password: ") { |q| q.echo = "*" }
257
+
258
+ begin
259
+ puts
260
+ say "Contacting server..."
261
+ Fjords::Client.login(username, password)
262
+
263
+ puts
264
+ say "Successfully logged in"
265
+
266
+ true
267
+ rescue Fjords::Client::ResourceNotFound => e
268
+ puts
269
+ say "Login Failed"
270
+ exit(0)
271
+ rescue Fjords::Client::LoginInvalid => e
272
+ puts
273
+ say "Login Failed"
274
+ exit(0)
275
+ end
276
+ end
277
+
278
+ def logout
279
+ return if @help_only
280
+
281
+ if !Fjords::Client.logged_in?
282
+ say "Not logged-in"
283
+ return true
284
+ end
285
+
286
+ Fjords::Client.logout
287
+ puts
288
+ say "Logged Out"
289
+
290
+ true
291
+ end
292
+
293
+ def bugreport
294
+ return if @help_only
295
+ require_login!
296
+
297
+ is_ready = agree("Ready to write your bug report? This will open your system $EDITOR: ") { |q| q.default = "yes" }
298
+
299
+ if !is_ready
300
+ exit(0)
301
+ end
302
+
303
+ body = ask_editor("Write your bug report below, then close your editor.\n----------------\n\n")
304
+
305
+ if body && !body.nil?
306
+ attach = @options[:attach] || nil
307
+
308
+ puts
309
+ say "Sending..."
310
+ Fjords::Client.bugreport(body, attach)
311
+ true
312
+ else
313
+ exit(0)
314
+ end
315
+ end
316
+
317
+ def remove(domain)
318
+ return if @help_only
319
+ require_login!
320
+
321
+ puts
322
+ if Fjords::Client::delete_site(domain)
323
+ say %Q{Successfully removed site "#{domain}"}
324
+ true
325
+ else
326
+ say %Q{Error: Could not find site "#{domain}" to remove.}
327
+ exit(0)
328
+ end
329
+ end
330
+
331
+ private
332
+
333
+ def available_editor(preferred=nil)
334
+ [preferred, ENV['EDITOR'], 'mate -w', 'vim', 'vi', 'emacs', 'nano', 'pico'].
335
+ compact.
336
+ find {|name| system("hash #{name.split.first} 2>&-") }
337
+ end
338
+
339
+ def ask_editor(input=nil, preferred_editor=nil)
340
+ editor = available_editor preferred_editor
341
+ tmpfile = Tempfile.new 'fjords-bugreport'
342
+ begin
343
+ tmpfile.write input if input
344
+ tmpfile.close
345
+ system("#{editor} #{tmpfile.path.shellescape}") ? IO.read(tmpfile.path) : nil
346
+ ensure
347
+ tmpfile.unlink
348
+ end
349
+ end
350
+
351
+ def print_table(array, options={})
352
+ return if array.empty?
353
+
354
+ formats, indent, colwidth = [], options[:indent].to_i, options[:colwidth]
355
+ # options[:truncate] = terminal_width if options[:truncate] == true
356
+
357
+ formats << "%-#{colwidth + 2}s" if colwidth
358
+ start = colwidth ? 1 : 0
359
+
360
+ colcount = array.max{|a,b| a.size <=> b.size }.size
361
+
362
+ maximas = []
363
+
364
+ start.upto(colcount - 1) do |index|
365
+ maxima = array.map {|row| row[index] ? row[index].to_s.size : 0 }.max
366
+ maximas << maxima
367
+ if index == colcount - 1
368
+ # Don't output 2 trailing spaces when printing the last column
369
+ formats << "%-s"
370
+ else
371
+ formats << "%-#{maxima + 2}s"
372
+ end
373
+ end
374
+
375
+ formats[0] = formats[0].insert(0, " " * indent)
376
+ formats << "%s"
377
+
378
+ array.each do |row|
379
+ sentence = ""
380
+
381
+ row.each_with_index do |column, index|
382
+ maxima = maximas[index]
383
+
384
+ if column.is_a?(Numeric)
385
+ if index == row.size - 1
386
+ # Don't output 2 trailing spaces when printing the last column
387
+ f = "%#{maxima}s"
388
+ else
389
+ f = "%#{maxima}s "
390
+ end
391
+ else
392
+ f = formats[index]
393
+ end
394
+ sentence << f % column.to_s
395
+ end
396
+
397
+ # sentence = truncate(sentence, options[:truncate]) if options[:truncate]
398
+ say sentence
399
+ end
400
+ end
401
+
402
+ def require_login!
403
+ if !Fjords::Client.logged_in?
404
+ puts
405
+ say "You must login you can run this command:"
406
+ say "fjords login"
407
+ puts
408
+ say "If you do not have an account, create one with:"
409
+ say "fjords signup"
410
+ exit(0)
411
+ end
412
+ end
413
+
414
+ def get_unique_username
415
+ username = ask "Desired Username: "
416
+
417
+ if Fjords::Client.username_available?(username)
418
+ username
419
+ else
420
+ say "Sorry, that username (#{username}) is already taken. Please try another."
421
+ get_unique_username
422
+ end
423
+ end
424
+
425
+ def get_credit_card_information
426
+ name_on_card = ask "Name on Card: "
427
+ card_number = ask "Card Number: "
428
+ exp_month = ask "Expiration Month (MM): "
429
+ exp_year = ask "Expiration Year (YY): "
430
+ cvc = ask("Security CVC Number: ") { |q| q.echo = "*" }
431
+
432
+ puts
433
+ say "Verifying information..."
434
+
435
+ begin
436
+ Fjords::Client.get_stripe_token(name_on_card, card_number, exp_month, exp_year, cvc)
437
+ rescue => e
438
+ puts
439
+ say "Sorry, there was an error."
440
+ say e.message
441
+ end
442
+ end
443
+
444
+ def time_to_expiry(from_time)
445
+ to_time = DateTime.now.to_time.to_i
446
+ distance_in_minutes = (((from_time - to_time))/60).round
447
+
448
+ case distance_in_minutes
449
+ when 0..1 then distance_in_minutes == 0 ? "in less than a minute" : "in 1 minute"
450
+ when 2..44 then "in #{distance_in_minutes} minutes"
451
+ when 45..89 then "in 1 hour"
452
+ when 90..1439 then "in #{(distance_in_minutes.to_f / 60.0).round} hours"
453
+ when 1440..2519 then "in 1 day"
454
+ when 2520..43199 then "in #{(distance_in_minutes.to_f / 1440.0).round} days"
455
+ else
456
+ "already expired"
457
+ end
458
+ end
459
+ end
@@ -0,0 +1,176 @@
1
+ require 'optparse'
2
+
3
+ module Fjords::Cli::Runner
4
+ def initialize(args=[])
5
+ @args = args
6
+ @options = {}
7
+ @exit_status = true
8
+ end
9
+
10
+ def parse_options!
11
+ opts_parser = OptionParser.new do |opts|
12
+ opts.banner = "\nAvailable options:\n\n"
13
+
14
+ opts.on('--attach ERROR_FILE') { |attach| @options[:attach] = attach }
15
+ opts.on('--host PATH') { |host| @options[:host] = host }
16
+ opts.on('--path PATH') { |path| @options[:path] = path }
17
+ opts.on('--domain DOMAIN') { |domain| @options[:domain] = domain }
18
+ opts.on('--overwrite') { |overwrite| @options[:overwrite] = overwrite }
19
+ opts.on('--no-zip') { |no_zip| @options[:no_zip] = !no_zip }
20
+ opts.on('--no-progress') { |no_progress| @options[:no_progress] = !no_progress }
21
+ opts.on('--permanent') { |permanent| @options[:permanent] = permanent }
22
+ opts.on('--domain-file DOMAIN_FILE') { |domain_file| @options[:domain_file] = domain_file }
23
+ opts.on('-h', '--help') { puts "#{command_usage}\n"; exit }
24
+ end
25
+
26
+ @args = opts_parser.parse!(@args)
27
+ end
28
+
29
+ def parse_command!
30
+ verb = @args.shift
31
+ case verb
32
+
33
+ when 'help'
34
+ help if @args.size == 0
35
+ @help_only = true
36
+ parse_command!
37
+ when 'nameservers'
38
+ usage('fjords nameservers')
39
+ nameservers
40
+ when 'sites'
41
+ usage('fjords sites')
42
+ sites
43
+ when 'push'
44
+ usage('fjords push [--path PATH] [--domain DOMAIN] [--domain-file DOMAIN_FILE]')
45
+ push
46
+ when 'login'
47
+ usage('fjords login')
48
+ login
49
+ when 'logout'
50
+ usage('fjords logout')
51
+ logout
52
+ when 'signup'
53
+ usage('fjords signup')
54
+ signup
55
+ when 'remove'
56
+ usage('fjords remove DOMAIN')
57
+ remove(@args[0])
58
+ when 'bugreport'
59
+ usage('fjords bugreport [--attach ERROR_FILE]')
60
+ bugreport
61
+ when 'info'
62
+ usage('fjords info')
63
+ info
64
+ when 'version'
65
+ usage('fjords version')
66
+ version
67
+ else
68
+ if verb
69
+ puts "fjords: Unknown command [#{verb}]"
70
+ puts basic_usage
71
+ exit(false)
72
+ end
73
+ end
74
+ end
75
+
76
+ def save_error_report(e)
77
+ dir = File.expand_path("~/.fjords-errors")
78
+
79
+ FileUtils.mkdir_p(dir)
80
+
81
+ filename = File.join(dir, "exception-#{Time.now.to_i}.txt")
82
+
83
+ File.open(filename, 'w') do |file|
84
+ file.write("#{e.to_s}\n\n")
85
+
86
+ if e.respond_to?(:report_data)
87
+ file.write(e.report_data.join("\n"))
88
+ elsif e.respond_to?(:backtrace)
89
+ file.write(e.backtrace.join("\n"))
90
+ else
91
+ file.write("Unknown exception format")
92
+ end
93
+ end
94
+
95
+ filename
96
+ end
97
+
98
+ def run
99
+ trap('TERM') { print "\nTerminated\n"; exit(false)}
100
+
101
+ parse_options!
102
+
103
+ if @options[:host]
104
+ Fjords::Client.host = @options[:host]
105
+ puts "Using API host: #{Fjords::Client.host}"
106
+ end
107
+
108
+ if @options[:no_zip]
109
+ Fjords::Client.ruby_zip = @options[:no_zip]
110
+ puts "Using built-in Ruby Zip"
111
+ end
112
+
113
+ begin
114
+ res = parse_command!
115
+ rescue Fjords::Client::PreconditionFailed => e
116
+ puts
117
+ puts "Error: Your login token has expired. Please login again with: fjords login"
118
+ exit(0)
119
+ rescue Fjords::Client::ConnectionRefused => e
120
+ puts
121
+ puts "Error: Could not connect to server"
122
+ exit(0)
123
+ rescue => e
124
+ file_name = save_error_report(e)
125
+
126
+ puts
127
+ puts "Sorry, an unexpected error has occured (#{e.to_s})"
128
+ puts
129
+ puts "The details of this error have been logged to: "
130
+ puts " #{file_name}"
131
+ puts
132
+ puts "You can report this bug to the developer by running:"
133
+ puts
134
+ puts " fjords bugreport --attach=#{file_name}"
135
+
136
+ exit(0)
137
+ end
138
+
139
+ if res
140
+
141
+ elsif @help_only || @usage
142
+ display_usage
143
+ else
144
+ puts basic_usage
145
+ exit(false)
146
+ end
147
+
148
+ rescue OptionParser::InvalidOption => e
149
+ puts(e.message)
150
+ puts("\n")
151
+ puts(basic_usage)
152
+ @exit_status = false
153
+ rescue OptionParser::AmbiguousOption => e
154
+ puts(e.message)
155
+ puts("\n")
156
+ puts(basic_usage)
157
+ @exit_status = false
158
+ rescue SystemExit => e
159
+ @exit_status = e.success?
160
+ rescue SyntaxError => e
161
+ puts e.message
162
+ puts e.backtrace
163
+ @exit_status = false
164
+ rescue Interrupt => e
165
+ puts("\nInterrupted")
166
+ @exit_status = false
167
+ rescue Exception => e
168
+ puts e.message
169
+ puts e.backtrace
170
+ @exit_status = false
171
+ ensure
172
+ puts("\n")
173
+ @exit_status == true if @exit_status.nil?
174
+ exit(@exit_status)
175
+ end
176
+ end
@@ -0,0 +1,57 @@
1
+ module Fjords::Cli::Usage
2
+ def usage(msg = nil)
3
+ @usage = msg if msg
4
+ @usage
5
+ end
6
+
7
+ def usage_error(msg = nil)
8
+ @usage_error = msg if msg
9
+ @usage_error
10
+ end
11
+
12
+ def display_usage
13
+ if @usage
14
+ puts @usage_error if @usage_error
15
+ puts "Usage: #{@usage}"
16
+ return
17
+ elsif @verb_usage
18
+ puts @verb_usage
19
+ return
20
+ end
21
+ puts command_usage
22
+ end
23
+
24
+ def basic_usage
25
+ "Usage: fjords [options] command [<args>] [command_options]\n" +
26
+ "Try 'fjords help [command]' or 'fjords help options' for more information."
27
+ end
28
+
29
+ def command_usage
30
+ # nameservers List the nameservers for using a root domain
31
+ <<-USAGE
32
+
33
+ #{basic_usage}
34
+
35
+ Currently available af commands are:
36
+
37
+ Getting Started
38
+ login Login to Fjords
39
+ logout Logout of Fjords
40
+ signup Create an account
41
+ info Get your account information, including current plan costs
42
+
43
+ Sites
44
+ sites List deployed sites
45
+ remove DOMAIN Remove a deployed site
46
+
47
+ Site Creation
48
+ push Push a new site
49
+
50
+ Help
51
+ help [command] Get general help or help on a specific command
52
+ help options Get help on available options
53
+ bugreport Send a bug-report
54
+ USAGE
55
+
56
+ end
57
+ end
@@ -0,0 +1,3 @@
1
+ module Fjords
2
+ VERSION = "1.0.1"
3
+ end
data/lib/fjords.rb ADDED
@@ -0,0 +1,11 @@
1
+ FJORDS_CLI_ROOT = File.join(File.expand_path(File.dirname(__FILE__)), 'fjords')
2
+
3
+ module Fjords
4
+ module Cli
5
+ autoload :Core, "#{FJORDS_CLI_ROOT}/cli/core"
6
+ autoload :Usage, "#{FJORDS_CLI_ROOT}/cli/usage"
7
+ autoload :Runner, "#{FJORDS_CLI_ROOT}/cli/runner"
8
+ end
9
+ end
10
+
11
+ require "#{FJORDS_CLI_ROOT}/version"
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fjords
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Thomas Reynolds
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: interact
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - '='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.5.1
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - '='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.5.1
30
+ - !ruby/object:Gem::Dependency
31
+ name: highline
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: progress_bar
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: fjords-client
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - '='
68
+ - !ruby/object:Gem::Version
69
+ version: 1.0.1
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - '='
76
+ - !ruby/object:Gem::Version
77
+ version: 1.0.1
78
+ description: Fjords.cc CLI
79
+ email:
80
+ - me@tdreyno.com
81
+ executables:
82
+ - fjords
83
+ extensions: []
84
+ extra_rdoc_files: []
85
+ files:
86
+ - .gitignore
87
+ - Gemfile
88
+ - Rakefile
89
+ - bin/fjords
90
+ - fjords.gemspec
91
+ - lib/fjords.rb
92
+ - lib/fjords/cli/core.rb
93
+ - lib/fjords/cli/runner.rb
94
+ - lib/fjords/cli/usage.rb
95
+ - lib/fjords/version.rb
96
+ homepage: ''
97
+ licenses: []
98
+ post_install_message:
99
+ rdoc_options: []
100
+ require_paths:
101
+ - lib
102
+ required_ruby_version: !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ! '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ segments:
109
+ - 0
110
+ hash: -1246193583979943233
111
+ required_rubygems_version: !ruby/object:Gem::Requirement
112
+ none: false
113
+ requirements:
114
+ - - ! '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ segments:
118
+ - 0
119
+ hash: -1246193583979943233
120
+ requirements: []
121
+ rubyforge_project:
122
+ rubygems_version: 1.8.23
123
+ signing_key:
124
+ specification_version: 3
125
+ summary: Fjords.cc CLI
126
+ test_files: []