gist_directory 0.0.3 → 0.1.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.
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