gist_directory 0.0.3 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 00bc8e4663843087d2257991dca4102c3279c847
4
- data.tar.gz: 7c5ad3b33b8536f334a63d86fa6ca14e3d01292b
3
+ metadata.gz: 0080a71489798fc02f6e2a875949d6b490dc5ab9
4
+ data.tar.gz: f2216c59729f4a82451b568214bc78a1299ac892
5
5
  SHA512:
6
- metadata.gz: 05c47bccc6c9a2046e4893bdd4b78e740e1fecad5a5610bf5023db6e8ef0f0f2e16df7979d42067e79dcb7aebec1e4a3738769db3c3e76eed960a54692b7b52b
7
- data.tar.gz: bcbdb0028c86be4ea66d6bc958fe6e5059eb5d01a0945170d618bbb6d64ccc6b6d02262aae549c35fcaffb41aa1729518bdc1469de2a9b2247adc706d46a0bc2
6
+ metadata.gz: 9d348e279867f93f0911e24fcac2a8526e9bafcc6946f91acad84180a037b16bed1cb8d414d0d775e468127a7368adedaf98b953272498e09833dc6b3a9ed935
7
+ data.tar.gz: b362c710f3887e208150d6fb9782aef57452ad0c01161c425bd0c243b4c98162e9dcb2ffe016b43bc03c4f7c04f75da227e6c02596d561139fdc1ce9592e8c54
data/README.md CHANGED
@@ -1,18 +1,29 @@
1
1
  # gist_directory
2
2
 
3
- Create collections of public gists in a local directory
3
+ Create and maintain collections of public gists in a local directory
4
+
5
+ # Dependencies
6
+
7
+ ```
8
+ npm install gulp-octodown-livereload
9
+ ```
4
10
 
5
11
  # Usage
6
12
 
7
- Create a gist called `food.md` in a directory called `food`
13
+ Create a gist called `bacon.md` in a directory called `food`
8
14
  under your home directory:
9
15
 
10
16
  ```shell
11
- gist_directory create ~/food
17
+ gist_directory create ~/food/bacon.md
12
18
  ```
13
19
 
14
- Create a gist called `bacon.txt`:
20
+ Edit in your favourite editor (creating if necessary):
15
21
 
16
22
  ```shell
17
- gist_directory create ~/food bacon.txt
23
+ gist_directory edit ~/food/bacon.md
18
24
  ```
25
+
26
+ View compiled Markdown in your browser (ith livereload):
27
+
28
+ ```shell
29
+ gist_directory view ~/food/bacon.md
data/bin/gist_directory CHANGED
@@ -6,15 +6,17 @@ require "gist_directory"
6
6
 
7
7
  def usage
8
8
  puts <<-EOT
9
- #{$0} create DIRECTORY [FILE]"
9
+ #{$0} create|edit|view [FILE_PATH]"
10
10
 
11
- DIRECTORY:
12
- Creates a Gist with a single file.
11
+ create:
12
+ * if the directory already contains a Gist, add the file
13
+ * otherwise, creates a new Gist containing the file
13
14
 
14
- FILE:
15
+ edit:
16
+ * opens the file for editing
15
17
 
16
- By default, a Markdown file called basename([DIRECTORY]) + ".md" is created.
17
- Supply an optional filename to use instead of this default.
18
+ view (Markdown only):
19
+ * opens the converted file in your browser and watches for changes.
18
20
  EOT
19
21
  end
20
22
 
@@ -24,10 +26,17 @@ if ARGV.size < 2
24
26
  end
25
27
 
26
28
  command = ARGV[0]
27
- path = ARGV[1]
28
- directory = File.basename(path)
29
- file = ARGV[2] || directory + ".md"
30
-
31
- raise "Unknown command '#{command}'" unless command == "create"
32
-
33
- GistDirectory.new(path: path).create(filename: file)
29
+ filename = ARGV[1]
30
+
31
+ gist = GistDirectory.new(filename: filename)
32
+
33
+ case command
34
+ when "create"
35
+ gist.create
36
+ when "edit"
37
+ gist.edit
38
+ when "view"
39
+ gist.view
40
+ else
41
+ raise "Unknown command '#{command}'"
42
+ end
@@ -1,50 +1,111 @@
1
1
  require "gist"
2
2
  require "git"
3
3
 
4
+ class GistFile
5
+ attr_reader :pathname
6
+
7
+ def initialize(pathname)
8
+ @pathname = File.expand_path(pathname)
9
+ end
10
+
11
+ def create
12
+ if ! File.directory?(path)
13
+ create_gist
14
+ else
15
+ create_file_if_missing
16
+ end
17
+ end
18
+
19
+ def edit
20
+ create
21
+ raise "Please set the EDITOR environment variable" if ! ENV.include?("EDITOR")
22
+
23
+ exec "$SHELL $EDITOR '#{pathname}'"
24
+ end
25
+
26
+ def view
27
+ exec "$SHELL gulp-octodown-livereload '#{pathname}'"
28
+ end
29
+
30
+ private
31
+
32
+ def create_gist
33
+ result = Gist.gist(content_for_empty_file, filename: basename, public: true)
34
+ gist_hash = result["id"]
35
+
36
+ Git.clone("git@gist.github.com:#{gist_hash}", path)
37
+ end
38
+
39
+ def create_file_if_missing
40
+ raise "The file #{pathname} already exists" if exists?
41
+ create_empty_file pathname
42
+ add
43
+ end
44
+
45
+ def create_empty_file(pathname)
46
+ File.open(pathname, "w") { |f| f.puts content_for_empty_file }
47
+ end
48
+
49
+ def add
50
+ git = Git.open(path)
51
+ git.add(pathname)
52
+ git.commit("Added '#{basename}'")
53
+ git.push
54
+ end
55
+
56
+ def exists?
57
+ File.exist?(pathname)
58
+ end
59
+
60
+ def path
61
+ File.dirname(pathname)
62
+ end
63
+
64
+ def basename
65
+ File.basename(pathname)
66
+ end
67
+
68
+ def content_for_empty_file
69
+ "Empty Gist"
70
+ end
71
+ end
72
+
4
73
  class GistDirectory
5
74
  MAJOR = 0
6
- MINOR = 0
7
- REVISION = 3
75
+ MINOR = 1
76
+ REVISION = 1
8
77
  VERSION = [MAJOR, MINOR, REVISION].map(&:to_s).join('.')
9
78
 
10
- attr_reader :path
11
- attr_reader :git
79
+ attr_reader :filename
12
80
 
13
- def initialize(path: nil)
14
- @path = File.expand_path(path)
81
+ def initialize(filename: nil)
82
+ @filename = File.expand_path(filename)
15
83
  end
16
84
 
17
- def create(filename: nil)
18
- raise "No filename supplied" if filename.nil?
85
+ def path
86
+ @path = File.dirname(filename)
87
+ end
19
88
 
89
+ def create
20
90
  if path_exists?
21
91
  fail_unless_gist_directory
22
- fail_if_filename_exists filename
23
- add_file_to_directory filename: filename
24
- else
25
- do_gist_create filename: filename
26
92
  end
27
- end
28
-
29
- private
30
93
 
31
- def add_file_to_directory(filename: nil)
32
- do_file_add filename: filename
94
+ file.create
33
95
  end
34
96
 
35
- def do_gist_create(filename: nil)
36
- result = Gist.gist(content_for_empty_file, filename: filename, public: true)
37
- gist_hash = result["id"]
97
+ def edit
98
+ file.edit
99
+ end
38
100
 
39
- Git.clone("git@gist.github.com:#{gist_hash}", path)
101
+ def view
102
+ file.view
40
103
  end
41
104
 
42
- def do_file_add(filename: nil)
43
- absolute = filepath(filename: filename)
44
- File.open(absolute, "w") { |f| f.puts content_for_empty_file }
45
- git.add(absolute)
46
- git.commit("Added '#{filename}'")
47
- git.push
105
+ private
106
+
107
+ def file
108
+ @file ||= GistFile.new(filename)
48
109
  end
49
110
 
50
111
  def fail_unless_gist_directory
@@ -52,35 +113,30 @@ class GistDirectory
52
113
  raise "#{path} exists and does not contain a Gist repository"
53
114
  end
54
115
  end
55
-
56
- def fail_if_filename_exists(filename)
57
- absolute = filepath(filename: filename)
58
- if File.exist?(absolute)
59
- raise "A file called #{filename} already exists in #{path}"
60
- end
61
- end
62
116
 
63
- def git
64
- @git ||= Git.open(path)
117
+ def is_gist_directory?
118
+ return false if ! is_git_directory?
119
+ origin = origin_remote
120
+ return false if origin.nil?
121
+ is_gist_url? origin.url
65
122
  end
66
123
 
67
- def filepath(filename: nil)
68
- File.join(path, filename)
124
+ def is_git_directory?
125
+ git_path = File.join(path, ".git")
126
+ File.directory?(git_path)
69
127
  end
70
128
 
71
- def path_exists?
72
- File.directory?(path)
129
+ def origin_remote
130
+ git = Git.open(path)
131
+ git.remotes.select { |r| r.name == "origin" }[0]
73
132
  end
74
133
 
75
- def is_gist_directory?
76
- return false unless File.directory?(File.join(path, ".git"))
77
- origin = git.remotes.select { |r| r.name == "origin" }[0]
78
- return false if origin.nil?
79
- m = %r(^git@gist\.github\.com:\w+$).match(origin.url)
134
+ def is_gist_url?(url)
135
+ m = %r(^git@gist\.github\.com:\w+$).match(url)
80
136
  ! m.nil?
81
137
  end
82
138
 
83
- def content_for_empty_file
84
- "Empty Gist"
139
+ def path_exists?
140
+ File.directory?(path)
85
141
  end
86
142
  end
@@ -3,26 +3,27 @@ require "gist_directory"
3
3
  RSpec.describe GistDirectory do
4
4
  let(:path) { "/foo/bar" }
5
5
  let(:path_exists) { false }
6
- let(:filename) { "baz.txt" }
6
+ let(:filename) { File.join(path, "baz.txt") }
7
7
  let(:gist_result) { {"id" => gist_hash} }
8
8
  let(:gist_hash) { "gist_sha1_hash" }
9
9
  let(:git) { double(Git) }
10
- subject { described_class.new(path: path) }
10
+ subject { described_class.new(filename: filename) }
11
11
 
12
12
  before do
13
13
  allow(File).to receive(:directory?).and_call_original
14
14
  allow(File).to receive(:directory?).with(path) { path_exists }
15
15
  allow(Gist).to receive(:gist) { gist_result }
16
16
  allow(Git).to receive(:clone)
17
- allow(Git).to receive(:open) { git }
17
+ allow(Git).to receive(:open).and_raise("Unexpected path")
18
+ allow(Git).to receive(:open).with(path) { git }
18
19
  end
19
20
 
20
21
  describe "#create" do
21
22
  context "when the path doesn't exist" do
22
23
  it "creates a Gist, adding the file" do
23
- subject.create(filename: filename)
24
+ subject.create
24
25
  expect(Gist).to have_received(:gist).with(
25
- "Empty Gist", {filename: filename, public: true}
26
+ "Empty Gist", {filename: File.basename(filename), public: true}
26
27
  )
27
28
  end
28
29
  end
@@ -38,14 +39,13 @@ RSpec.describe GistDirectory do
38
39
  context "and contains a Git repo" do
39
40
  let(:dot_git_exists) { true }
40
41
  let(:remotes) { [double(Git::Remote, name: "origin", url: repo_url)] }
41
- let(:filepath) { File.join(path, filename) }
42
42
  let(:file) { double(File, puts: nil) }
43
43
 
44
44
  before do
45
45
  allow(File).to receive(:open).and_call_original
46
- allow(File).to receive(:open).with(filepath, "w").and_yield(file)
46
+ allow(File).to receive(:open).with(filename, "w").and_yield(file)
47
47
  allow(File).to receive(:exist?).and_call_original
48
- allow(File).to receive(:exist?).with(filepath) { file_exists }
48
+ allow(File).to receive(:exist?).with(filename) { file_exists }
49
49
  allow(git).to receive(:remotes) { remotes }
50
50
  allow(git).to receive(:add)
51
51
  allow(git).to receive(:commit)
@@ -59,13 +59,13 @@ RSpec.describe GistDirectory do
59
59
  let(:file_exists) { false }
60
60
 
61
61
  it "creates the file" do
62
- subject.create(filename: filename)
62
+ subject.create
63
63
  expect(file).to have_received(:puts)
64
64
  end
65
65
 
66
66
  it "adds the file" do
67
- subject.create(filename: filename)
68
- expect(git).to have_received(:add).with(filepath)
67
+ subject.create
68
+ expect(git).to have_received(:add).with(filename)
69
69
  expect(git).to have_received(:commit)
70
70
  end
71
71
  end
@@ -75,7 +75,7 @@ RSpec.describe GistDirectory do
75
75
 
76
76
  it "fails" do
77
77
  expect do
78
- subject.create(filename: filename)
78
+ subject.create
79
79
  end.to raise_error(RuntimeError, /#{filename} already exists/)
80
80
  end
81
81
  end
@@ -86,7 +86,7 @@ RSpec.describe GistDirectory do
86
86
 
87
87
  it "fails" do
88
88
  expect do
89
- subject.create(filename: filename)
89
+ subject.create
90
90
  end.to raise_error(RuntimeError, /not contain a Gist repository/)
91
91
  end
92
92
  end
@@ -97,7 +97,7 @@ RSpec.describe GistDirectory do
97
97
 
98
98
  it "fails" do
99
99
  expect do
100
- subject.create(filename: filename)
100
+ subject.create
101
101
  end.to raise_error(RuntimeError, /not contain a Gist repository/)
102
102
  end
103
103
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gist_directory
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Yates
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-09 00:00:00.000000000 Z
11
+ date: 2015-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: git