accio 0.0.2
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 +2 -0
- data/CHANGELOG +12 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +40 -0
- data/LICENSE.txt +22 -0
- data/README.md +59 -0
- data/Rakefile +1 -0
- data/accio.gemspec +28 -0
- data/bin/accio +34 -0
- data/lib/accio/code.rb +20 -0
- data/lib/accio/comment.rb +20 -0
- data/lib/accio/content.rb +55 -0
- data/lib/accio/formatter.rb +55 -0
- data/lib/accio/group.rb +14 -0
- data/lib/accio/parser.rb +118 -0
- data/lib/accio/snippet.rb +22 -0
- data/lib/accio/version.rb +3 -0
- data/lib/accio.rb +62 -0
- data/spec/fixtures/snippets.md +29 -0
- data/spec/lib/code_spec.rb +20 -0
- data/spec/lib/comment_spec.rb +20 -0
- data/spec/lib/content_spec.rb +40 -0
- data/spec/lib/group_spec.rb +18 -0
- data/spec/lib/parser_spec.rb +53 -0
- data/spec/lib/snippet_spec.rb +24 -0
- data/spec/spec_helper.rb +16 -0
- metadata +198 -0
data/.gitignore
ADDED
data/CHANGELOG
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
accio (0.0.2)
|
5
|
+
clipboard
|
6
|
+
term-ansicolor
|
7
|
+
terminal-table
|
8
|
+
thor
|
9
|
+
|
10
|
+
GEM
|
11
|
+
remote: https://rubygems.org/
|
12
|
+
specs:
|
13
|
+
clipboard (1.0.1)
|
14
|
+
diff-lcs (1.1.3)
|
15
|
+
multi_json (1.5.0)
|
16
|
+
rake (10.0.3)
|
17
|
+
rspec (2.12.0)
|
18
|
+
rspec-core (~> 2.12.0)
|
19
|
+
rspec-expectations (~> 2.12.0)
|
20
|
+
rspec-mocks (~> 2.12.0)
|
21
|
+
rspec-core (2.12.2)
|
22
|
+
rspec-expectations (2.12.1)
|
23
|
+
diff-lcs (~> 1.1.3)
|
24
|
+
rspec-mocks (2.12.2)
|
25
|
+
simplecov (0.7.1)
|
26
|
+
multi_json (~> 1.0)
|
27
|
+
simplecov-html (~> 0.7.1)
|
28
|
+
simplecov-html (0.7.1)
|
29
|
+
term-ansicolor (1.0.7)
|
30
|
+
terminal-table (1.4.5)
|
31
|
+
thor (0.17.0)
|
32
|
+
|
33
|
+
PLATFORMS
|
34
|
+
ruby
|
35
|
+
|
36
|
+
DEPENDENCIES
|
37
|
+
accio!
|
38
|
+
rake
|
39
|
+
rspec
|
40
|
+
simplecov
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Dennis Schneider
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# Accio - A command line code snippet manager
|
2
|
+
|
3
|
+
With **Accio** it's possible to categorize and organize snippets in a
|
4
|
+
markdown file. The snippets can then be searched and used via the terminal.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
```
|
9
|
+
gem install accio
|
10
|
+
```
|
11
|
+
|
12
|
+
## Usage
|
13
|
+
|
14
|
+
Create a **snippets.md** file in a folder and configure accio with the following
|
15
|
+
command (you must point to the folder relative to your home directory):
|
16
|
+
|
17
|
+
```
|
18
|
+
# Or wherever you wish to have the snippets.md file
|
19
|
+
accio configure "Dropbox/Accio"
|
20
|
+
```
|
21
|
+
|
22
|
+
Show all snippet groups:
|
23
|
+
|
24
|
+
```
|
25
|
+
$ accio groups
|
26
|
+
Ruby
|
27
|
+
Erlang
|
28
|
+
Clojure
|
29
|
+
Haskell
|
30
|
+
Amazon Web Services
|
31
|
+
...
|
32
|
+
```
|
33
|
+
|
34
|
+
Show commands for a specific group or snippet:
|
35
|
+
|
36
|
+
```
|
37
|
+
$ accio show Ruby [Files]
|
38
|
+
Ruby
|
39
|
+
Read Files
|
40
|
+
CODE_SNIPPET
|
41
|
+
...
|
42
|
+
```
|
43
|
+
|
44
|
+
Copy a snippet to clipboard:
|
45
|
+
|
46
|
+
```
|
47
|
+
$ accio copy Ruby [Files]
|
48
|
+
Ruby
|
49
|
+
Read Files
|
50
|
+
CODE_SNIPPET
|
51
|
+
...
|
52
|
+
```
|
53
|
+
|
54
|
+
There are shortcuts like `accio c Ruby ...` and `accio s Ruby` for copy and show.
|
55
|
+
|
56
|
+
|
57
|
+
## Example Snippet File (snippets.md)
|
58
|
+
|
59
|
+
An example snippet file can be found in the spec/fixtures folder.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/accio.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'accio/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "accio"
|
8
|
+
gem.version = Accio::VERSION
|
9
|
+
gem.authors = ["Dennis Schneider"]
|
10
|
+
gem.email = ["sinned.schneider@gmail.com"]
|
11
|
+
gem.description = %q{Accio is a code snippet management tool for the terminal}
|
12
|
+
gem.summary = %q{Accio - A code snippet management tool for the terminal}
|
13
|
+
gem.homepage = "https://github.com/dschneider/snip"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.add_runtime_dependency('thor')
|
21
|
+
gem.add_runtime_dependency('term-ansicolor')
|
22
|
+
gem.add_runtime_dependency('clipboard')
|
23
|
+
gem.add_runtime_dependency('terminal-table')
|
24
|
+
|
25
|
+
gem.add_development_dependency('rspec')
|
26
|
+
gem.add_development_dependency('rake')
|
27
|
+
gem.add_development_dependency('simplecov')
|
28
|
+
end
|
data/bin/accio
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "thor"
|
4
|
+
require "accio"
|
5
|
+
|
6
|
+
class AccioCMD < Thor
|
7
|
+
desc "configure", "configures accio with the path of your snippet file"
|
8
|
+
def configure(path)
|
9
|
+
::Accio.configure(path)
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "groups", "show all groups"
|
13
|
+
def groups
|
14
|
+
::Accio.show_groups
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "show [GROUP][SNIPPET TITLE]", "show snippets for a specific group"
|
18
|
+
def show(group, snippet = nil)
|
19
|
+
::Accio.show(group, snippet)
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "s [GROUP][SNIPPET TITLE]", "show snippets for a specific group"
|
23
|
+
alias :s :show
|
24
|
+
|
25
|
+
desc "copy [GROUP][SNIPPET TITLE]", "copy snippets for a specific group"
|
26
|
+
def copy(group, snippet = nil)
|
27
|
+
::Accio.copy(group, snippet)
|
28
|
+
end
|
29
|
+
|
30
|
+
desc "c [GROUP][SNIPPET TITLE]", "copy snippets for a specific group"
|
31
|
+
alias :c :copy
|
32
|
+
end
|
33
|
+
|
34
|
+
AccioCMD.start
|
data/lib/accio/code.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Accio
|
2
|
+
# Public: Represents a code snippet.
|
3
|
+
class Code
|
4
|
+
attr_reader :text
|
5
|
+
|
6
|
+
# Public: Constructor.
|
7
|
+
#
|
8
|
+
# text - The code text.
|
9
|
+
def initialize(text)
|
10
|
+
@text = text
|
11
|
+
end
|
12
|
+
|
13
|
+
# Public: Adds text to the code text.
|
14
|
+
#
|
15
|
+
# text - The code text.
|
16
|
+
def add(text)
|
17
|
+
@text << text
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Accio
|
2
|
+
# Public: Represents a comment.
|
3
|
+
class Comment
|
4
|
+
attr_reader :text
|
5
|
+
|
6
|
+
# Public: Constructor.
|
7
|
+
#
|
8
|
+
# text - The comment text.
|
9
|
+
def initialize(text)
|
10
|
+
@text = text
|
11
|
+
end
|
12
|
+
|
13
|
+
# Public: Adds text to the comment text.
|
14
|
+
#
|
15
|
+
# text - The comment text.
|
16
|
+
def add(text)
|
17
|
+
@text << text
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Accio
|
2
|
+
# Public: Represents the content of a snippet file.
|
3
|
+
class Content
|
4
|
+
attr_accessor :groups
|
5
|
+
|
6
|
+
# Public: Constructor.
|
7
|
+
def initialize
|
8
|
+
@groups = []
|
9
|
+
end
|
10
|
+
|
11
|
+
# Public: Search the groups and snippets for a specific text match.
|
12
|
+
#
|
13
|
+
# text - The text for main group titles to search for.
|
14
|
+
# subtext - The subtext for snippet titles to search for.
|
15
|
+
#
|
16
|
+
# Returns Array of Group matches with Snippet matches.
|
17
|
+
def search(text, subtext = nil)
|
18
|
+
matches = []
|
19
|
+
snippets = []
|
20
|
+
@groups.each do |group|
|
21
|
+
if group.title.downcase.include?(text.downcase)
|
22
|
+
# Search for matches in the snippets if a subtext is given.
|
23
|
+
if subtext
|
24
|
+
snippets = snippets | search_snippets(group, subtext)
|
25
|
+
|
26
|
+
# Reallocate the found snippets.
|
27
|
+
group.snippets = snippets
|
28
|
+
end
|
29
|
+
|
30
|
+
matches << group
|
31
|
+
end
|
32
|
+
end
|
33
|
+
matches
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
# Internal: Search the snippets for a specific text match.
|
39
|
+
#
|
40
|
+
# group - The parent group that includes all the snippets.
|
41
|
+
# text - The text for snippet titles to search for.
|
42
|
+
#
|
43
|
+
# Returns Array of snippet matches.
|
44
|
+
def search_snippets(group, text)
|
45
|
+
matches = []
|
46
|
+
group.snippets.each do |snippet|
|
47
|
+
# Only include the snippet if the text is found in the title.
|
48
|
+
if snippet.title.downcase.include?(text.downcase)
|
49
|
+
matches << snippet
|
50
|
+
end
|
51
|
+
end
|
52
|
+
matches
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'term/ansicolor'
|
2
|
+
require 'terminal-table'
|
3
|
+
|
4
|
+
module Accio
|
5
|
+
# Public: Formats the snippet output for the terminal.
|
6
|
+
module Formatter
|
7
|
+
COLOR = Term::ANSIColor
|
8
|
+
|
9
|
+
class << self
|
10
|
+
# Public: Colorizes the title of a group.
|
11
|
+
#
|
12
|
+
# Returns a colorized String.
|
13
|
+
def print_group_title(title)
|
14
|
+
COLOR.send(:red, title)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Public: Colorizes the title of a snippet.
|
18
|
+
#
|
19
|
+
# Returns a colorized String.
|
20
|
+
def print_snippet_title(title)
|
21
|
+
COLOR.send(:blue, title)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Public: Colorizes a code snippet.
|
25
|
+
#
|
26
|
+
# Returns a colorized String.
|
27
|
+
def print_code(snippet)
|
28
|
+
COLOR.send(:green, snippet)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Public: Colorizes a code comment.
|
32
|
+
#
|
33
|
+
# Returns a colorized String.
|
34
|
+
def print_comment(comment)
|
35
|
+
COLOR.send(:yellow, comment)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Public: Prints a table with group title, snippet title, comment and
|
39
|
+
# code.
|
40
|
+
def template(group_title, snippet_title, comment, code)
|
41
|
+
rows = []
|
42
|
+
rows << [print_group_title(group_title)]
|
43
|
+
rows << :separator
|
44
|
+
rows << [print_snippet_title(snippet_title)]
|
45
|
+
unless comment.text.length == 0
|
46
|
+
rows << :separator
|
47
|
+
rows << [print_comment(comment.text)]
|
48
|
+
end
|
49
|
+
|
50
|
+
puts Terminal::Table.new(rows: rows)
|
51
|
+
puts print_code(code.text)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/accio/group.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
module Accio
|
2
|
+
# Public: Represents a snippet group (e. g. Ruby, Networking, AWS etc.).
|
3
|
+
class Group
|
4
|
+
attr_accessor :title, :snippets
|
5
|
+
|
6
|
+
# Public: Constructor.
|
7
|
+
#
|
8
|
+
# title - The title of the group.
|
9
|
+
def initialize(title)
|
10
|
+
@title = title
|
11
|
+
@snippets = []
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/accio/parser.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'accio/content'
|
2
|
+
require 'accio/group'
|
3
|
+
require 'accio/snippet'
|
4
|
+
|
5
|
+
module Accio
|
6
|
+
# Public: The snippet parser module is responsible for parsing markdown based
|
7
|
+
# snippet documents.
|
8
|
+
module Parser
|
9
|
+
|
10
|
+
class NoConfigError < StandardError; end
|
11
|
+
class NoSnippetFileError < StandardError; end
|
12
|
+
|
13
|
+
class << self
|
14
|
+
# Public: Reads the snippet markdown file, parses the codelines and
|
15
|
+
# collects groups and snippets.
|
16
|
+
#
|
17
|
+
# Returns a Content object.
|
18
|
+
def read
|
19
|
+
content = Accio::Content.new
|
20
|
+
code_area = false
|
21
|
+
|
22
|
+
while (line = file.gets)
|
23
|
+
header_count = line.count("#")
|
24
|
+
|
25
|
+
# Whenever a code area starts we flip this code_area.
|
26
|
+
if line.count("`") == 3
|
27
|
+
code_area = !code_area
|
28
|
+
end
|
29
|
+
|
30
|
+
# If markdown header character found and not a code group.
|
31
|
+
if header_count == 1 && code_area == false
|
32
|
+
# Main Group. Sets the group globally so that snippets get
|
33
|
+
# associated with this group.
|
34
|
+
group = Accio::Group.new(parse_headline(line))
|
35
|
+
content.groups << group
|
36
|
+
elsif header_count == 2 && code_area == false
|
37
|
+
# Snippet.
|
38
|
+
snippet = Accio::Snippet.new(parse_headline(line))
|
39
|
+
group.snippets << snippet
|
40
|
+
else
|
41
|
+
# Code text or comments.
|
42
|
+
if snippet
|
43
|
+
if line.count("*") == 4
|
44
|
+
snippet.comment.add(parse_comment(line))
|
45
|
+
else
|
46
|
+
unless line.length < 2 || line == "\n"
|
47
|
+
snippet.code.add(parse_code(line))
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
file.close
|
54
|
+
content
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
# Public: Parse headline. Remove hashtags, line breaks and the first
|
60
|
+
# space.
|
61
|
+
#
|
62
|
+
# line - The read line.
|
63
|
+
#
|
64
|
+
# Returns the text line.
|
65
|
+
def parse_headline(line)
|
66
|
+
line.gsub("#", "").gsub("\n", "").sub(" ", "")
|
67
|
+
end
|
68
|
+
|
69
|
+
# Public: Parse code area.
|
70
|
+
#
|
71
|
+
# line - The read line.
|
72
|
+
#
|
73
|
+
# Returns the text line.
|
74
|
+
def parse_code(line)
|
75
|
+
line.gsub("```", "")
|
76
|
+
end
|
77
|
+
|
78
|
+
# Public: Parse comment area.
|
79
|
+
#
|
80
|
+
# line - The read line.
|
81
|
+
#
|
82
|
+
# Returns the text line.
|
83
|
+
def parse_comment(line)
|
84
|
+
line.gsub("**", "")
|
85
|
+
end
|
86
|
+
|
87
|
+
# Public: Loads the config file.
|
88
|
+
#
|
89
|
+
# Returns a String path.
|
90
|
+
def config
|
91
|
+
return @config if @config
|
92
|
+
|
93
|
+
config_path = File.join(Dir.home, ".accio")
|
94
|
+
|
95
|
+
unless File.exists?(config_path)
|
96
|
+
raise NoConfigError, "Please run accio configure to create a config"
|
97
|
+
end
|
98
|
+
|
99
|
+
@config ||= File.new(config_path, "r").gets
|
100
|
+
end
|
101
|
+
|
102
|
+
# Public: Loads the snippet file.
|
103
|
+
#
|
104
|
+
# Returns a File object.
|
105
|
+
def file
|
106
|
+
return @file if @file
|
107
|
+
|
108
|
+
snippet_path = File.join(Dir.home, config.gsub("\n", ""), "snippets.md")
|
109
|
+
|
110
|
+
unless File.exists?(snippet_path)
|
111
|
+
raise NoSnippetFileError, "Please create a snippet file"
|
112
|
+
end
|
113
|
+
|
114
|
+
@file ||= File.new(snippet_path, "r")
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'accio/code'
|
2
|
+
require 'accio/comment'
|
3
|
+
|
4
|
+
module Accio
|
5
|
+
# Public: Represents a snippet (e. g. Read Files, Establish SSH Connection
|
6
|
+
# etc.). A snippet consists of a title, a code part and optionally of a
|
7
|
+
# comment.
|
8
|
+
class Snippet
|
9
|
+
attr_accessor :title, :code, :comment
|
10
|
+
|
11
|
+
# Public: Constructor.
|
12
|
+
#
|
13
|
+
# title - The title of the snippet.
|
14
|
+
# code - The associated code.
|
15
|
+
# comment - The associated comment.
|
16
|
+
def initialize(title, code = "", comment = "")
|
17
|
+
@title = title
|
18
|
+
@code = Code.new(code)
|
19
|
+
@comment = Comment.new(comment)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/accio.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
require "accio/version"
|
2
|
+
require "accio"
|
3
|
+
require "accio/parser"
|
4
|
+
require "accio/formatter"
|
5
|
+
require "clipboard"
|
6
|
+
|
7
|
+
# Public: Accio is a module that helps to organize and categorize code
|
8
|
+
# snippets in the terminal.
|
9
|
+
module Accio
|
10
|
+
class << self
|
11
|
+
# Public: Rewrites the snip configuration file in the home directory.
|
12
|
+
def configure(path)
|
13
|
+
File.open(File.join(Dir.home, ".accio"), "w") do |file|
|
14
|
+
file.puts path
|
15
|
+
end
|
16
|
+
puts "Accio was configured successfully"
|
17
|
+
end
|
18
|
+
|
19
|
+
# Public: Shows all the groups that are existing in the markdown file.
|
20
|
+
def show_groups
|
21
|
+
content = Accio::Parser.read
|
22
|
+
content.groups.each do |group|
|
23
|
+
puts "#{group.title}\n"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Public: Shows the code snippets for the specified group and optionally
|
28
|
+
# for the specified snippet title.
|
29
|
+
def show(group, snippet = nil)
|
30
|
+
content = Accio::Parser.read
|
31
|
+
matches = content.search(group, snippet)
|
32
|
+
matches.each do |match|
|
33
|
+
match.snippets.each do |submatch|
|
34
|
+
# Format the output and display it.
|
35
|
+
Accio::Formatter.template(
|
36
|
+
match.title, submatch.title, submatch.comment, submatch.code
|
37
|
+
)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Public: Searches code snippets for a specified group and optionally for a
|
43
|
+
# specified snippet title and copies the last found code snippet to the
|
44
|
+
# clipboard.
|
45
|
+
def copy(group, snippet = nil)
|
46
|
+
content = Accio::Parser.read
|
47
|
+
matches = content.search(group, snippet)
|
48
|
+
matches.each do |match|
|
49
|
+
match.snippets.each do |submatch|
|
50
|
+
# Copy code to clipboard.
|
51
|
+
Clipboard.copy submatch.code.text.gsub(/^$\n/, '')
|
52
|
+
|
53
|
+
# Format the output and display it.
|
54
|
+
Accio::Formatter.template(
|
55
|
+
match.title, submatch.title, submatch.comment, submatch.code
|
56
|
+
)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
puts "The last found code snippet has been copied to the clipboard"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Vim
|
2
|
+
|
3
|
+
## Search and replace in open buffers
|
4
|
+
|
5
|
+
```
|
6
|
+
bufdo %s/pattern/replace/ge | update
|
7
|
+
```
|
8
|
+
|
9
|
+
## Delete all occurences of search
|
10
|
+
|
11
|
+
```
|
12
|
+
g/occurrence/d
|
13
|
+
```
|
14
|
+
|
15
|
+
# Git
|
16
|
+
|
17
|
+
## Reset to head hard
|
18
|
+
|
19
|
+
```
|
20
|
+
git reset --hard HEAD
|
21
|
+
```
|
22
|
+
|
23
|
+
## Delete branch
|
24
|
+
|
25
|
+
**Deletes a whole branch**
|
26
|
+
|
27
|
+
```
|
28
|
+
git branch -D
|
29
|
+
```
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Accio::Code do
|
4
|
+
|
5
|
+
subject { Accio::Code.new("puts 'yes'") }
|
6
|
+
|
7
|
+
describe "#text" do
|
8
|
+
it "contains the code" do
|
9
|
+
expect(subject.text).to eq("puts 'yes'")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#add" do
|
14
|
+
it "adds text to the code text" do
|
15
|
+
subject.add(" if true")
|
16
|
+
|
17
|
+
expect(subject.text).to eq("puts 'yes' if true")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Accio::Comment do
|
4
|
+
|
5
|
+
subject { Accio::Comment.new("This is code that does something") }
|
6
|
+
|
7
|
+
describe "#text" do
|
8
|
+
it "contains the comment" do
|
9
|
+
expect(subject.text).to eq("This is code that does something")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#add" do
|
14
|
+
it "adds text to the comment text" do
|
15
|
+
subject.add(" strange")
|
16
|
+
|
17
|
+
expect(subject.text).to eq("This is code that does something strange")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Accio::Content do
|
4
|
+
|
5
|
+
subject { Accio::Content.new }
|
6
|
+
|
7
|
+
let(:group) { Accio::Group.new("Group") }
|
8
|
+
let(:snippet) { Accio::Snippet.new("Recursively delete folder") }
|
9
|
+
let(:another_snippet) { Accio::Snippet.new("Read Files") }
|
10
|
+
|
11
|
+
before do
|
12
|
+
snippet.code.add("puts 1 + 2")
|
13
|
+
group.snippets << snippet
|
14
|
+
group.snippets << another_snippet
|
15
|
+
subject.groups << group
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#search" do
|
19
|
+
it "searches for included text" do
|
20
|
+
matches = subject.search("Gro")
|
21
|
+
|
22
|
+
expect(matches).to eq([group])
|
23
|
+
end
|
24
|
+
|
25
|
+
it "searches case insensitive" do
|
26
|
+
matches = subject.search("GROU")
|
27
|
+
|
28
|
+
expect(matches).to eq([group])
|
29
|
+
end
|
30
|
+
|
31
|
+
context "subtext is specified" do
|
32
|
+
it "searches according to the subtext" do
|
33
|
+
matches = subject.search("Gro", "File")
|
34
|
+
|
35
|
+
expect(matches.count).to eq(1)
|
36
|
+
expect(matches.first.snippets).to eq([another_snippet])
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Accio::Group do
|
4
|
+
|
5
|
+
subject { Accio::Group.new("Group") }
|
6
|
+
|
7
|
+
let(:snippet) { Accio::Snippet.new("Recursively delete folder") }
|
8
|
+
|
9
|
+
before do
|
10
|
+
subject.snippets << snippet
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "snippets" do
|
14
|
+
it "contains the snippet" do
|
15
|
+
expect(subject.snippets).to include(snippet)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Accio::Parser do
|
4
|
+
|
5
|
+
subject { Accio::Parser }
|
6
|
+
|
7
|
+
before :each do
|
8
|
+
subject.stub(:config).and_return('')
|
9
|
+
subject.stub(:file).and_return(File.new('spec/fixtures/snippets.md', 'r'))
|
10
|
+
end
|
11
|
+
|
12
|
+
describe ".read" do
|
13
|
+
it "parses two groups" do
|
14
|
+
content = subject.read
|
15
|
+
|
16
|
+
expect(content.groups.count).to eq(2)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "parses four snippets" do
|
20
|
+
content = subject.read
|
21
|
+
first_group_count = content.groups.first.snippets.count
|
22
|
+
second_group_count = content.groups.last.snippets.count
|
23
|
+
total_count = first_group_count + second_group_count
|
24
|
+
|
25
|
+
expect(total_count).to eq(4)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "parses one comment" do
|
29
|
+
content = subject.read
|
30
|
+
comment_text = content.groups.last.snippets.last.comment.text
|
31
|
+
|
32
|
+
expect(comment_text).to eq("Deletes a whole branch\n")
|
33
|
+
end
|
34
|
+
|
35
|
+
context "no config file" do
|
36
|
+
it "raises a NoConfigError" do
|
37
|
+
subject.unstub(:config)
|
38
|
+
subject.unstub(:file)
|
39
|
+
File.stub(:join).and_return('xyz')
|
40
|
+
|
41
|
+
expect { subject.read }.to raise_error(subject::NoConfigError)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "no snippet file" do
|
46
|
+
it "raises a NoSnippetFileError" do
|
47
|
+
subject.unstub(:file)
|
48
|
+
|
49
|
+
expect { subject.read }.to raise_error(subject::NoSnippetFileError)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Accio::Snippet do
|
4
|
+
|
5
|
+
subject { Accio::Snippet.new("Do arithmetics", "1 + 1", "Addition") }
|
6
|
+
|
7
|
+
describe "#title" do
|
8
|
+
it "holds a code object" do
|
9
|
+
expect(subject.title).to eq("Do arithmetics")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#code" do
|
14
|
+
it "holds a code object" do
|
15
|
+
expect(subject.code).to be_a(Accio::Code)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#comment" do
|
20
|
+
it "holds a comment object" do
|
21
|
+
expect(subject.comment).to be_a(Accio::Comment)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
if ENV['COVERAGE']
|
2
|
+
require 'simplecov'
|
3
|
+
SimpleCov.start do
|
4
|
+
add_filter "/spec"
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
require "rspec"
|
9
|
+
require "accio"
|
10
|
+
|
11
|
+
RSpec.configure do |config|
|
12
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
13
|
+
config.run_all_when_everything_filtered = true
|
14
|
+
config.filter_run :focus
|
15
|
+
config.order = "random"
|
16
|
+
end
|
metadata
ADDED
@@ -0,0 +1,198 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: accio
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Dennis Schneider
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-03-10 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: thor
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
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'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: term-ansicolor
|
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: clipboard
|
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: terminal-table
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
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: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: rspec
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: rake
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: simplecov
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
description: Accio is a code snippet management tool for the terminal
|
127
|
+
email:
|
128
|
+
- sinned.schneider@gmail.com
|
129
|
+
executables:
|
130
|
+
- accio
|
131
|
+
extensions: []
|
132
|
+
extra_rdoc_files: []
|
133
|
+
files:
|
134
|
+
- .gitignore
|
135
|
+
- CHANGELOG
|
136
|
+
- Gemfile
|
137
|
+
- Gemfile.lock
|
138
|
+
- LICENSE.txt
|
139
|
+
- README.md
|
140
|
+
- Rakefile
|
141
|
+
- accio.gemspec
|
142
|
+
- bin/accio
|
143
|
+
- lib/accio.rb
|
144
|
+
- lib/accio/code.rb
|
145
|
+
- lib/accio/comment.rb
|
146
|
+
- lib/accio/content.rb
|
147
|
+
- lib/accio/formatter.rb
|
148
|
+
- lib/accio/group.rb
|
149
|
+
- lib/accio/parser.rb
|
150
|
+
- lib/accio/snippet.rb
|
151
|
+
- lib/accio/version.rb
|
152
|
+
- spec/fixtures/snippets.md
|
153
|
+
- spec/lib/code_spec.rb
|
154
|
+
- spec/lib/comment_spec.rb
|
155
|
+
- spec/lib/content_spec.rb
|
156
|
+
- spec/lib/group_spec.rb
|
157
|
+
- spec/lib/parser_spec.rb
|
158
|
+
- spec/lib/snippet_spec.rb
|
159
|
+
- spec/spec_helper.rb
|
160
|
+
homepage: https://github.com/dschneider/snip
|
161
|
+
licenses: []
|
162
|
+
post_install_message:
|
163
|
+
rdoc_options: []
|
164
|
+
require_paths:
|
165
|
+
- lib
|
166
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
167
|
+
none: false
|
168
|
+
requirements:
|
169
|
+
- - ! '>='
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: '0'
|
172
|
+
segments:
|
173
|
+
- 0
|
174
|
+
hash: 1446051849502590714
|
175
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
176
|
+
none: false
|
177
|
+
requirements:
|
178
|
+
- - ! '>='
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
segments:
|
182
|
+
- 0
|
183
|
+
hash: 1446051849502590714
|
184
|
+
requirements: []
|
185
|
+
rubyforge_project:
|
186
|
+
rubygems_version: 1.8.24
|
187
|
+
signing_key:
|
188
|
+
specification_version: 3
|
189
|
+
summary: Accio - A code snippet management tool for the terminal
|
190
|
+
test_files:
|
191
|
+
- spec/fixtures/snippets.md
|
192
|
+
- spec/lib/code_spec.rb
|
193
|
+
- spec/lib/comment_spec.rb
|
194
|
+
- spec/lib/content_spec.rb
|
195
|
+
- spec/lib/group_spec.rb
|
196
|
+
- spec/lib/parser_spec.rb
|
197
|
+
- spec/lib/snippet_spec.rb
|
198
|
+
- spec/spec_helper.rb
|