code_snippet 0.2.7 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe CodeSnippet::Commands::ListSnippets do
4
+ let(:options) { Hashie::Mash.new }
5
+
6
+ let(:snippet_list_table) do
7
+ <<~TABLE
8
+ NAME LANG
9
+ some-snippet .go
10
+ TABLE
11
+ end
12
+
13
+ let(:manager) { double(CodeSnippet::Manager) }
14
+ let(:snippets) { [snippet] }
15
+
16
+ let(:snip_name) { 'some-snippet' }
17
+ let(:snip_ext) { '.go' }
18
+
19
+ let(:snippet) do
20
+ double(
21
+ CodeSnippet::Snip,
22
+ name: snip_name,
23
+ ext: snip_ext,
24
+ content: 'stuff'
25
+ )
26
+ end
27
+
28
+ subject { described_class.new(manager, options) }
29
+
30
+ before do
31
+ allow(manager)
32
+ .to receive(:snippets)
33
+ .and_return(snippets)
34
+
35
+ allow(snippet)
36
+ .to receive(:name)
37
+ .and_return(snip_name)
38
+
39
+ allow(snippet)
40
+ .to receive(:ext)
41
+ .and_return(snip_ext)
42
+
43
+ allow(TTY::Table).to receive(:new).and_call_original
44
+ allow(subject).to receive(:puts)
45
+ end
46
+
47
+ describe '#run' do
48
+ before { subject.run }
49
+
50
+ it 'retrieves snippets from manager' do
51
+ expect(manager).to have_received(:snippets)
52
+ end
53
+
54
+ it 'renders table' do
55
+ expect(TTY::Table).to have_received(:new).with(
56
+ header: CodeSnippet::Commands::ListSnippets::RESULT_HEADER,
57
+ rows: [['some-snippet', '.go']]
58
+ )
59
+ end
60
+
61
+ it 'prints table to STDOUT' do
62
+ expect(subject)
63
+ .to have_received(:puts)
64
+ .with(snippet_list_table.strip)
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe CodeSnippet::Commands::PrintPath do
4
+ let(:options) { Hashie::Mash.new }
5
+ let(:snippet_dir) { '/path/to/snippets' }
6
+
7
+ subject { described_class.new(snippet_dir, options) }
8
+
9
+ before do
10
+ allow(subject).to receive(:puts)
11
+ end
12
+
13
+ describe '#run' do
14
+ before { subject.run }
15
+
16
+ it 'prints given template path to STDOUT' do
17
+ expect(subject)
18
+ .to have_received(:puts)
19
+ .with(snippet_dir)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe CodeSnippet::Commands::PrintVersion do
4
+ let(:options) { Hashie::Mash.new }
5
+
6
+ subject { described_class.new(options) }
7
+
8
+ before do
9
+ allow(subject).to receive(:puts)
10
+ end
11
+
12
+ describe '#run' do
13
+ before { subject.run }
14
+
15
+ it 'prints current version to STDOUT' do
16
+ expect(subject)
17
+ .to have_received(:puts)
18
+ .with(CodeSnippet::VERSION)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,202 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe CodeSnippet::Commands::ShowSnippet do
4
+ let(:snip_name) { 'some-snippet' }
5
+ let(:manager) { double(CodeSnippet::Manager) }
6
+ let(:options) do
7
+ Hashie::Mash.new(
8
+ name: snip_name
9
+ )
10
+ end
11
+
12
+ let(:prompt) { double(TTY::Prompt) }
13
+
14
+ subject { described_class.new(manager, options) }
15
+
16
+ before do
17
+ subject.instance_variable_set(:@prompt, prompt)
18
+ end
19
+
20
+ describe '#run' do
21
+ let(:snip_path) { 'path/to/snippet' }
22
+ let(:snip) do
23
+ double(
24
+ CodeSnippet::Snip,
25
+ name: snip_name,
26
+ path: snip_path
27
+ )
28
+ end
29
+
30
+ let(:found_snips) { [snip, snip] }
31
+ let(:snip_content) { 'snippet content' }
32
+ let(:snip_names) { [snip_name, snip_name] }
33
+
34
+ before do
35
+ allow(prompt).to receive(:select)
36
+ .and_return(snip_name)
37
+
38
+ allow(manager)
39
+ .to receive(:snippet_names)
40
+ .and_return(snip_names)
41
+
42
+ allow(subject)
43
+ .to receive(:find_snippets)
44
+ .and_return(found_snips)
45
+
46
+ allow(subject)
47
+ .to receive(:pick_snippet)
48
+ .and_return(snip)
49
+
50
+ allow(snip)
51
+ .to receive(:content)
52
+ .and_return(snip_content)
53
+
54
+ allow(Clipboard).to receive(:copy)
55
+ allow(subject).to receive(:puts)
56
+
57
+ subject.run
58
+ end
59
+
60
+ context 'when name option is provided' do
61
+ it 'finds snippets' do
62
+ expect(subject)
63
+ .to have_received(:find_snippets)
64
+ .with(snip_name)
65
+ end
66
+
67
+ it 'prompts user to choose snippet' do
68
+ expect(subject)
69
+ .to have_received(:pick_snippet)
70
+ .with(found_snips)
71
+ end
72
+
73
+ it 'prints snippet content' do
74
+ expect(subject)
75
+ .to have_received(:puts)
76
+ .with(snip_content)
77
+ end
78
+ end
79
+
80
+ context 'when name option is not provided' do
81
+ let(:options) { Hashie::Mash.new }
82
+
83
+ it 'asks user to choose snippet' do
84
+ expect(prompt)
85
+ .to have_received(:select)
86
+ .with(
87
+ 'Please choose snippet',
88
+ snip_names
89
+ )
90
+ end
91
+
92
+ it 'finds snippets' do
93
+ expect(subject)
94
+ .to have_received(:find_snippets)
95
+ .with(snip_name)
96
+ end
97
+
98
+ it 'prompts user to choose snippet' do
99
+ expect(subject)
100
+ .to have_received(:pick_snippet)
101
+ .with(found_snips)
102
+ end
103
+
104
+ it 'prints snippet content' do
105
+ expect(subject)
106
+ .to have_received(:puts)
107
+ .with(snip_content)
108
+ end
109
+ end
110
+
111
+ context 'when copy flag is provided' do
112
+ let(:options) do
113
+ Hashie::Mash.new(
114
+ copy: true
115
+ )
116
+ end
117
+
118
+ it 'copies snippet content to clipboard' do
119
+ expect(Clipboard)
120
+ .to have_received(:copy)
121
+ .with(snip_content)
122
+ end
123
+
124
+ it 'prints copied message' do
125
+ expect(subject)
126
+ .to have_received(:puts)
127
+ .with("COPIED: #{snip_path}")
128
+ end
129
+ end
130
+ end
131
+
132
+ describe '#find_snippets' do
133
+ let(:snip) { double(CodeSnippet::Snip, name: snip_name) }
134
+ let(:found_snips) { [snip, snip] }
135
+
136
+ before do
137
+ allow(manager).to receive(:find).and_return(found_snips)
138
+ end
139
+
140
+ context 'when snippet exists' do
141
+ before { @result = subject.find_snippets(snip_name) }
142
+
143
+ it 'returns snippets that match the search term' do
144
+ expect(@result).to eq found_snips
145
+ end
146
+ end
147
+
148
+ context 'when snippet does not exist' do
149
+ let(:found_snips) { [] }
150
+
151
+ it 'raises unable to find snippet runtime error' do
152
+ expect do
153
+ subject.find_snippets(snip_name)
154
+ end.to raise_error(
155
+ RuntimeError,
156
+ "unable to find #{snip_name}"
157
+ )
158
+ end
159
+ end
160
+ end
161
+
162
+ describe '#pick_snippet' do
163
+ let(:snip) { double(CodeSnippet::Snip, name: snip_name) }
164
+ let(:found_snips) { [snip, snip] }
165
+
166
+ before do
167
+ allow(prompt).to receive(:select).and_return(snip_name)
168
+ allow(manager).to receive(:find).and_return(found_snips)
169
+
170
+ @result = subject.pick_snippet(found_snips)
171
+ end
172
+
173
+ context 'when there are multiple snippets' do
174
+ it 'prompts user to select a snippet from list' do
175
+ expect(prompt)
176
+ .to have_received(:select)
177
+ .with(
178
+ 'Multiple snippets found, which one would you like to view?',
179
+ [snip_name, snip_name]
180
+ )
181
+ end
182
+
183
+ it 'finds snippet' do
184
+ expect(manager).to have_received(:find).with(snip_name)
185
+ end
186
+
187
+ it 'returns snippet' do
188
+ expect(@result).to eq snip
189
+ end
190
+ end
191
+
192
+ context 'when there is one snippet' do
193
+ it 'finds snippet' do
194
+ expect(manager).to have_received(:find).with(snip_name)
195
+ end
196
+
197
+ it 'returns snippet' do
198
+ expect(@result).to eq snip
199
+ end
200
+ end
201
+ end
202
+ end
@@ -7,7 +7,7 @@ RSpec.describe CodeSnippet::Manager do
7
7
  described_class.new(snippet_dir)
8
8
  end
9
9
 
10
- describe '#load_snippets' do
10
+ describe '#load' do
11
11
  let(:directory) { File.join(snippet_dir, 'path/to/dir') }
12
12
  let(:file) { File.join(snippet_dir, 'path/to/dir/file') }
13
13
 
@@ -32,7 +32,7 @@ RSpec.describe CodeSnippet::Manager do
32
32
  allow(CodeSnippet::Snip).to receive(:new_from_file)
33
33
  .and_return(file_snip)
34
34
 
35
- subject.load_snippets
35
+ subject.load
36
36
  end
37
37
 
38
38
  it 'creates snips from files' do
@@ -163,4 +163,27 @@ RSpec.describe CodeSnippet::Manager do
163
163
  expect(@result[1]).to be another_target_snip
164
164
  end
165
165
  end
166
+
167
+ describe '#snippet_names' do
168
+ let(:snip) do
169
+ CodeSnippet::Snip.new('path/to/snip.rb', 'snip.go', '.go')
170
+ end
171
+
172
+ let(:snips) do
173
+ [
174
+ snip,
175
+ snip,
176
+ snip
177
+ ]
178
+ end
179
+
180
+ before do
181
+ subject.instance_variable_set(:@snippets, snips)
182
+ @result = subject.snippet_names
183
+ end
184
+
185
+ it 'returns array of snippet names' do
186
+ expect(@result).to eq %w[snip snip snip]
187
+ end
188
+ end
166
189
  end
File without changes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: code_snippet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.7
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Bigger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-11 00:00:00.000000000 Z
11
+ date: 2021-11-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: clipboard
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '1.4'
83
+ - !ruby/object:Gem::Dependency
84
+ name: thor
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: tty-prompt
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -250,6 +264,7 @@ description:
250
264
  email:
251
265
  - andrew.bigger@gmail.com
252
266
  executables:
267
+ - code_snippet
253
268
  - snippet
254
269
  extensions: []
255
270
  extra_rdoc_files: []
@@ -264,21 +279,26 @@ files:
264
279
  - LICENCE
265
280
  - README.md
266
281
  - Rakefile
282
+ - bin/code_snippet
267
283
  - bin/snippet
268
- - bitbucket-pipelines.yml
269
284
  - code_snippet.gemspec
270
285
  - lib/code_snippet.rb
271
286
  - lib/code_snippet/cli.rb
272
- - lib/code_snippet/cli/commands.rb
273
- - lib/code_snippet/cli/presenters.rb
287
+ - lib/code_snippet/commands.rb
288
+ - lib/code_snippet/commands/list_snippets.rb
289
+ - lib/code_snippet/commands/print_path.rb
290
+ - lib/code_snippet/commands/print_version.rb
291
+ - lib/code_snippet/commands/show_snippet.rb
274
292
  - lib/code_snippet/manager.rb
275
293
  - lib/code_snippet/snip.rb
276
294
  - lib/code_snippet/version.rb
277
- - spec/snippet/cli/commands_spec.rb
278
- - spec/snippet/cli/presenters_spec.rb
279
- - spec/snippet/cli_spec.rb
280
- - spec/snippet/manager_spec.rb
281
- - spec/snippet/snip_spec.rb
295
+ - spec/code_snippet/cli_spec.rb
296
+ - spec/code_snippet/commands/list_snippets_spec.rb
297
+ - spec/code_snippet/commands/print_path_spec.rb
298
+ - spec/code_snippet/commands/print_version_spec.rb
299
+ - spec/code_snippet/commands/show_snippet_spec.rb
300
+ - spec/code_snippet/manager_spec.rb
301
+ - spec/code_snippet/snip_spec.rb
282
302
  - spec/spec_helper.rb
283
303
  homepage: https://github.com/andrewbigger/code_snippet
284
304
  licenses:
@@ -304,9 +324,11 @@ signing_key:
304
324
  specification_version: 4
305
325
  summary: A code snippet handling tool
306
326
  test_files:
307
- - spec/snippet/cli/commands_spec.rb
308
- - spec/snippet/cli/presenters_spec.rb
309
- - spec/snippet/cli_spec.rb
310
- - spec/snippet/manager_spec.rb
311
- - spec/snippet/snip_spec.rb
327
+ - spec/code_snippet/cli_spec.rb
328
+ - spec/code_snippet/commands/list_snippets_spec.rb
329
+ - spec/code_snippet/commands/print_path_spec.rb
330
+ - spec/code_snippet/commands/print_version_spec.rb
331
+ - spec/code_snippet/commands/show_snippet_spec.rb
332
+ - spec/code_snippet/manager_spec.rb
333
+ - spec/code_snippet/snip_spec.rb
312
334
  - spec/spec_helper.rb
@@ -1,18 +0,0 @@
1
- image: ruby:2.6.4
2
-
3
- pipelines:
4
- branches:
5
- master:
6
- - step:
7
- name: Build and Test
8
- caches:
9
- - bundler
10
- script:
11
- - gem install bundler
12
- - bundle install --path .bundle
13
- - bundle exec rake
14
- deployment: production
15
-
16
- definitions:
17
- caches:
18
- bundler: .bundle
@@ -1,82 +0,0 @@
1
- require 'clipboard'
2
-
3
- module CodeSnippet
4
- # Command line interface helpers and actions
5
- module CLI
6
- # CLI Actions
7
- module Commands
8
- ##
9
- # Show displays a snippet
10
- #
11
- def self.show(
12
- lang,
13
- copy,
14
- args = []
15
- )
16
- name = args.first
17
- snippet_dir = CodeSnippet::CLI.snip_dir
18
-
19
- manager = CodeSnippet::Manager.new(snippet_dir)
20
- manager.load_snippets
21
-
22
- snips = manager.find(name, lang)
23
- raise "unable to find #{name}" if snips.empty?
24
-
25
- snip = snips.first
26
- if snips.length > 1
27
- snip = CLI::Presenters.pick_from(
28
- 'Multiple snippets found, which one would you like to view?',
29
- snips
30
- )
31
- end
32
-
33
- if copy
34
- Clipboard.copy(snip.content)
35
- CLI.print_message("COPIED: #{snip.path}")
36
- end
37
-
38
- CLI::Presenters.show(snip)
39
- end
40
-
41
- ##
42
- # List lists snippets
43
- #
44
- def self.list(
45
- lang,
46
- _copy,
47
- _args = []
48
- )
49
- snippet_dir = CodeSnippet::CLI.snip_dir
50
-
51
- manager = CodeSnippet::Manager.new(snippet_dir)
52
- manager.load_snippets
53
-
54
- snippets = lang ? manager.filter_by_extension(lang) : manager.snippets
55
-
56
- CLI::Presenters.list_snippets(snippets)
57
- end
58
-
59
- ##
60
- # Show snippet directory path
61
- #
62
- def self.path(
63
- _lang,
64
- _copy,
65
- _args = []
66
- )
67
- CLI.print_message(CLI.snip_dir)
68
- end
69
-
70
- ##
71
- # Show snippet gem version
72
- #
73
- def self.version(
74
- _lang,
75
- _copy,
76
- _args = []
77
- )
78
- CLI.print_message(CodeSnippet::VERSION)
79
- end
80
- end
81
- end
82
- end
@@ -1,42 +0,0 @@
1
- require 'tty-table'
2
- require 'tty-prompt'
3
-
4
- module CodeSnippet
5
- # Command line interface helpers and actions
6
- module CLI
7
- # CLI Presentation functions
8
- module Presenters
9
- def self.pick_from(question, snips)
10
- prompt = TTY::Prompt.new
11
-
12
- choice = prompt.select(
13
- question,
14
- snips.map(&:path)
15
- )
16
-
17
- snips.find { |snip| snip.path == choice }
18
- end
19
-
20
- def self.show(snip)
21
- CLI.print_message(snip.content)
22
- end
23
-
24
- def self.list_snippets(snippets)
25
- result_header = %w[NAME LANG PATH]
26
-
27
- results = TTY::Table.new(
28
- result_header,
29
- snippets.map do |snippet|
30
- [
31
- snippet.name,
32
- snippet.ext,
33
- snippet.path
34
- ]
35
- end
36
- )
37
-
38
- CLI.print_message(results.render(:ascii))
39
- end
40
- end
41
- end
42
- end
@@ -1,104 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe CodeSnippet::CLI::Commands do
4
- let(:snippet_dir) { 'path/to/snippets' }
5
- let(:lang) { '.rb' }
6
- let(:copy) { false }
7
- let(:vars) { [] }
8
-
9
- before do
10
- allow(ENV)
11
- .to receive(:[]).with('SNIPPET_DIR')
12
- .and_return(snippet_dir)
13
-
14
- allow(File)
15
- .to receive(:exist?)
16
- .with(snippet_dir)
17
- .and_return(true)
18
- end
19
-
20
- describe '.show' do
21
- end
22
-
23
- describe '.list' do
24
- let(:manager) { double(CodeSnippet::Manager) }
25
- let(:lang) { nil }
26
-
27
- let(:snip) { double(CodeSnippet::Snip) }
28
- let(:filtered_snips) { [snip, snip] }
29
- let(:all_snips) { [snip, snip, snip, snip] }
30
-
31
- before do
32
- allow(CodeSnippet::CLI).to receive(:snip_dir)
33
- .and_return('path/to/snips')
34
-
35
- allow(CodeSnippet::Manager)
36
- .to receive(:new)
37
- .and_return(manager)
38
-
39
- allow(manager).to receive(:load_snippets)
40
- allow(manager)
41
- .to receive(:filter_by_extension)
42
- .and_return(filtered_snips)
43
-
44
- allow(manager)
45
- .to receive(:snippets)
46
- .and_return(all_snips)
47
-
48
- allow(CodeSnippet::CLI::Presenters)
49
- .to receive(:list_snippets)
50
-
51
- described_class.list(lang, copy, vars)
52
- end
53
-
54
- it 'loads snippets' do
55
- expect(manager).to have_received(:load_snippets)
56
- end
57
-
58
- it 'presents a list of snippets' do
59
- expect(CodeSnippet::CLI::Presenters)
60
- .to have_received(:list_snippets)
61
- .with(all_snips)
62
- end
63
-
64
- context 'when language filter is applied' do
65
- let(:lang) { '.rb' }
66
-
67
- it 'presents a list of filtered snippets' do
68
- expect(CodeSnippet::CLI::Presenters)
69
- .to have_received(:list_snippets)
70
- .with(filtered_snips)
71
- end
72
- end
73
- end
74
-
75
- describe '.path' do
76
- before do
77
- allow(CodeSnippet::CLI)
78
- .to receive(:print_message)
79
- .and_return(nil)
80
-
81
- described_class.path(lang, copy, vars)
82
- end
83
-
84
- it 'prints snippet dir' do
85
- expect(CodeSnippet::CLI).to have_received(:print_message)
86
- .with(snippet_dir)
87
- end
88
- end
89
-
90
- describe '.version' do
91
- before do
92
- allow(CodeSnippet::CLI)
93
- .to receive(:print_message)
94
- .and_return(nil)
95
-
96
- described_class.version(lang, copy, vars)
97
- end
98
-
99
- it 'prints snippet version' do
100
- expect(CodeSnippet::CLI).to have_received(:print_message)
101
- .with(CodeSnippet::VERSION)
102
- end
103
- end
104
- end