yassh 0.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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/bin/yassh +135 -0
  3. metadata +87 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 11af146bac5df12226fe31a4783677c84c3ef2a2
4
+ data.tar.gz: cd3d4fe214af8229cd803052f251d7a7248b33ec
5
+ SHA512:
6
+ metadata.gz: d76fcb15656deb2cd4ecaf37d3ae5d7dd0413e624a5c27053669e0ba956f5872fbc67cc9d9ac3e0abbadf23356809b550bb720b5ba53a1206eea79decd93c298
7
+ data.tar.gz: 899ff9f60ef7475e5ff0085dcdb277612c011acd5e32eaf2ce4d8e6be5c481e92f2dad4dd4e1e86b4441fcf55ad08f7fe8f1634d8d6618a4a020cc66976df1da
data/bin/yassh ADDED
@@ -0,0 +1,135 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'digest'
4
+ require 'fileutils'
5
+ require 'json'
6
+ require 'net/http'
7
+
8
+ require 'commander/import'
9
+ require "mimemagic"
10
+ require 'rest-client'
11
+
12
+ program :description, 'CLI for publishing websites to yas.sh'
13
+ program :version, "1.0.0"
14
+
15
+ class RestClient::Response
16
+ def json
17
+ JSON.parse(body)
18
+ end
19
+ end
20
+
21
+ $api = RestClient::Resource.new("https://api.yas.sh", headers: {content_type: 'application/json; charset=utf-8', accept: 'application/json'})
22
+
23
+ def load_default_domain
24
+ File.read("CNAME").strip.split.first
25
+ rescue
26
+ nil
27
+ end
28
+
29
+ def load_default_token
30
+ dir_path = File.join(ENV["HOME"], ".config/yassh/")
31
+ path = File.join(dir_path, "access_token")
32
+ File.read(path).strip.split.first
33
+ rescue
34
+ nil
35
+ end
36
+
37
+ def create_site(domain, token)
38
+ $api['/sites'].post({ domain: domain }.to_json, {Authorization: "Bearer #{token}"}).json
39
+ end
40
+
41
+ def create_revision(domain, token)
42
+ $api["/sites/#{domain}/revisions"].post("", {Authorization: "Bearer #{token}"}).json["revision"]["number"]
43
+ end
44
+
45
+ def post_file(domain, revision, metadata, token)
46
+ $api["/sites/#{domain}/revisions/#{revision}/files"].post(metadata.to_json, {Authorization: "Bearer #{token}"}).json
47
+ end
48
+
49
+ def commit_revision(domain, revision, token)
50
+ $api["/sites/#{domain}/revisions/#{revision}/commit"].post("", {Authorization: "Bearer #{token}"}).json
51
+ end
52
+
53
+ def authenticate(email, password)
54
+ $api["/auth"].post({username: email, password: password}.to_json).json
55
+ end
56
+
57
+ command :auth do |c|
58
+ c.syntax = "yassh auth"
59
+ c.description = "Authenticate your user account and store API key in ~/.config/yassh/"
60
+ c.action do |args, opts|
61
+ email = ask("Email: ")
62
+ pass = password
63
+
64
+ begin
65
+ result = authenticate(email, pass)
66
+ dir_path = File.join(ENV["HOME"], ".config/yassh/")
67
+ FileUtils.mkdir_p(dir_path)
68
+ path = File.join(dir_path, "access_token")
69
+ File.write(path, result["access_token"] + "\n")
70
+ puts "Access token written to: #{path}"
71
+ rescue RestClient::RequestFailed
72
+ puts "Incorrect email or password"
73
+ end
74
+ end
75
+ end
76
+
77
+ command :push do |c|
78
+ c.syntax = "yassh push [options]"
79
+ c.description = "Create a new revision and recursively upload files"
80
+ c.option '-d', '--domain DOMAIN', String, 'Domain to push site to (default loaded from CNAME)'
81
+ c.option '--root PATH', String, 'Root directory for the website (default .)'
82
+ c.option '--token TOKEN', String, 'Yassh access token'
83
+ c.action do |args, opts|
84
+ opts.default domain: load_default_domain, root: Dir.pwd, token: load_default_token
85
+
86
+ create_site(opts.domain, opts.token)
87
+
88
+ print "Creating revision ... "
89
+ revision_number = create_revision(opts.domain, opts.token)
90
+ puts "#{opts.domain} v#{revision_number}"
91
+
92
+ failure_encountered = false
93
+
94
+
95
+ Dir.chdir opts.root
96
+ Dir.glob("**/*") do |path|
97
+ payload = File.open(path) do |f|
98
+ metadata = {
99
+ domain: opts.domain,
100
+ size: f.size,
101
+ md5: Digest::MD5.file(f).hexdigest,
102
+ path: path,
103
+ content_type: (MimeMagic.by_path(path) || MimeMagic.by_magic(f) || 'application/octet-stream').to_s
104
+ }
105
+
106
+ print "Uploading #{path} ... "
107
+
108
+ begin
109
+ response = post_file(opts.domain, revision_number, metadata, opts.token)
110
+ if response["file"]["new_file"]
111
+ RestClient.put response["file"]["upload_url"], f, content_type: metadata[:content_type]
112
+ puts "SUCCESS"
113
+ else
114
+ puts "EXISTS"
115
+ end
116
+ rescue RestClient::RequestFailed
117
+ failure_encountered = true
118
+ puts "FAILED"
119
+ end
120
+ end
121
+ end
122
+
123
+ force_commit = false
124
+ if failure_encountered
125
+ force_commit = agree("Failed to succesfuly upload all files. Would you still like to commit this version?")
126
+ end
127
+
128
+ if force_commit || !failure_encountered
129
+ print "Committing #{opts.domain} v#{revision_number} ... "
130
+
131
+ commit_revision(opts.domain, revision_number, opts.token)
132
+ puts "SUCCESS"
133
+ end
134
+ end
135
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: yassh
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Andrew Hamon
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-01-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: commander
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.4'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.4'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mimemagic
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.3.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.3.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: rest-client
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.0'
55
+ description: Publish a folder instantly to yas.sh
56
+ email: andrew@hamon.cc
57
+ executables:
58
+ - yassh
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - bin/yassh
63
+ homepage: http://rubygems.org/gems/yassh
64
+ licenses:
65
+ - MIT
66
+ metadata: {}
67
+ post_install_message:
68
+ rdoc_options: []
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ requirements: []
82
+ rubyforge_project:
83
+ rubygems_version: 2.4.5.2
84
+ signing_key:
85
+ specification_version: 4
86
+ summary: yassh push .
87
+ test_files: []