noty 0.1.0 → 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: 92ebd84abb7bd6e2244b75cbb9702ad4fae00813
4
- data.tar.gz: 9c3767b0bda13dbe2b23afe18e511463343d2739
3
+ metadata.gz: 1ee94f9f7f6768a48b1797a647e0f7db4b3f9875
4
+ data.tar.gz: 0e490608feb4bef1374a4683a15e8430647aacbd
5
5
  SHA512:
6
- metadata.gz: 89042c9ce2695f8410c2f890137701c8e3743156f509d5e719dc32343a215c89fa6488c478a7e4ddc740ca6a301865032c3aac385e1eae566fdc4ffd9165487b
7
- data.tar.gz: bcce25349a539868bb0709a7dd4000f878b27e6c2688c64dfdf874e97f18b6f5838563f05d62a259b74de7e50ae0bff2c45425624096d1a84d9eb457a68b4008
6
+ metadata.gz: 34bb28fd6ea2e39789a0e9f73a2c8a0665cae5e10a5a0ffc513735a21a38e97d360f04a1163bdb8b1b79b81af972795f3235e077d45c2a07129545269755bbce
7
+ data.tar.gz: c2d8c9c6b976d8bde17d18e558b7f4ea40664dcc9424c7c9f234f9f9ce88bc84b7d8d6b5b397f49c574e7da434407200106d97b5e71aaaa19fdb628945a46238
data/README.md CHANGED
@@ -20,6 +20,14 @@ $ gem install noty
20
20
  1. xsel : could be found on most distros official repositories
21
21
  2. xdg-open : should be installed with most opendesktop compatible desktop environments
22
22
 
23
+ ## Environment
24
+
25
+ by default Noty saves your files in `~/.notes` if you want to change that path, define an Environment variable in your shell init file `.bashrc` or `.zshrc`
26
+
27
+ ```bash
28
+ export NOTES_PATH=/path/to/your/notes/dir
29
+ ```
30
+
23
31
 
24
32
  ## Usage
25
33
 
@@ -36,6 +44,28 @@ Snippets and bookmarks manager.
36
44
  2. **keyword:** search bookmarks and perform action on it, a single word of multiple words or regex, it is passed to "ag silver searcher"
37
45
  3. **snippet text:** any multiword text, it will search first if no files contain this text you'll be asked if you want to create a snippet for it
38
46
 
47
+ ## Examples
48
+
49
+ Add a bookmark
50
+ ```bash
51
+ noty https://www.youtube.com
52
+ ```
53
+
54
+ Search for bookmark
55
+ ```bash
56
+ noty youtube
57
+ ```
58
+
59
+ Add a snippet text
60
+ ```bash
61
+ noty this is a long text that I need to save in my stash
62
+ ```
63
+
64
+ Search for a snippet (same as searching for bookmarks)
65
+ ```bash
66
+ noty need
67
+ ```
68
+
39
69
  ## Contributing
40
70
 
41
71
  Bug reports and pull requests are welcome on GitHub at https://github.com/blazeeboy/noty.
data/exe/noty CHANGED
@@ -1,167 +1,15 @@
1
1
  #!/usr/bin/env ruby
2
- require 'open-uri'
3
- require 'yaml'
4
- require 'fileutils'
5
- require 'io/console'
6
2
 
7
- STORAGE = File.expand_path(ENV['NOTES_PATH'] || '~/.notes')
8
- FileUtils.mkdir_p STORAGE
9
-
10
- # ------------------------------------------
11
- # HELPERS
12
- # ------------------------------------------
13
-
14
- def edit(file_path)
15
- editor = ENV['EDITOR'] || 'vi'.freeze
16
- system "#{editor} #{file_path}"
17
- end
18
-
19
- def copy(file)
20
- case RUBY_PLATFORM
21
- when /darwin/
22
- `cat #{file} | pbcopy`
23
- when /linux/
24
- `cat #{file} | xsel --clipboard --input`
25
- end
26
- end
27
-
28
- def open_url(url)
29
- case RUBY_PLATFORM
30
- when /darwin/
31
- system "open #{url}"
32
- when /linux/
33
- system "xdg-open #{url}"
34
- end
35
- end
36
-
37
- # ------------------------------------------
38
- # PRESENTATION METHODS
39
- # ------------------------------------------
40
-
41
- def short_display(file)
42
- case File.extname(file)
43
- when '.bookmark'
44
- content = YAML.load_file(file)
45
- puts content['title'].to_s + ' (' + content['url'].to_s + ')'
46
- when '.snippet'
47
- content = File.read(file)
48
- puts content.tr("\n", ' ')[0..100]
49
- else
50
- puts File.open(file).read(100).to_s.lines.first
51
- end
52
- end
53
-
54
- def long_display(file)
55
- puts File.read(file)
56
- end
57
-
58
- def choose(files)
59
- if files.empty?
60
- exit 0
61
- elsif files.one?
62
- long_display files.first
63
- operations(files.first)
64
- else
65
-
66
- files.each_with_index do |file, index|
67
- print "#{index + 1}. "
68
- short_display file
69
- end
70
-
71
- print '-> (1..9) or Q to exit: '
72
- puts choice = $stdin.getch
73
-
74
- case choice
75
- when 'q'
76
- exit 0
77
- when /\A[1-9]\z/
78
- long_display files[choice.to_i - 1]
79
- operations(files[choice.to_i - 1])
80
- end
81
- end
82
- end
83
-
84
- def operations(file)
85
- print '[E]dit [D]elete [O]pen [C]opy, Else to Quit: '
86
- puts choice = $stdin.getch
87
-
88
- case choice
89
- when 'e'
90
- edit file
91
- when 'd'
92
- File.delete file
93
- when 'o'
94
- content = YAML.load_file(file)
95
- open_url content['url']
96
- when 'c'
97
- copy file
98
- else
99
- exit 0
100
- end
101
- end
102
-
103
- def create_snippet(text)
104
- print 'Do you want to save it as a snippet? [y/N]: '
105
- puts choice = $stdin.getch
106
- return unless choice.casecmp 'y'
107
-
108
- file_path = File.join(STORAGE, Time.now.to_i.to_s + '.snippet')
109
- File.write(file_path, text)
110
- end
111
-
112
- # -----------------------------------------------------------
113
- # TOP LEVEL COMMANDS
114
- # -----------------------------------------------------------
115
- def help
116
- exec_name = File.basename(__FILE__)
117
- puts <<-EOT
118
- Snippets and bookmarks manager.
119
- Usage:
120
- #{exec_name} [command|inputs]
121
-
122
- Commands:
123
- #{exec_name} help, --help : print this message
124
-
125
- Input types:
126
- url: e.g "http://www.example.com", add URL as a bookmark file
127
- keyword: search bookmarks and perform action on it, a single word of multiple words or regex, it is passed to "ag silver searcher"
128
- snippet text: any multiword text, it will search first if no files contain this text you'll be asked if you want to create a snippet for it
129
- EOT
130
- end
131
-
132
- def bookmark
133
- url = ARGV.first
134
- content = begin
135
- open(url).read
136
- rescue
137
- ""
138
- end
139
- file_path = File.join(STORAGE, Time.now.to_i.to_s + '.bookmark')
140
- bookmark_object = {
141
- 'url' => url,
142
- 'title' => content.match(%r{<title>(.+)<\/title>}im).to_a[1]
143
- }
144
- File.write(file_path, bookmark_object.to_yaml)
145
- edit file_path
146
- end
147
-
148
- def search
149
- keyword = ARGV.join ' '
150
- files = `ag -l "#{keyword}" #{STORAGE}`.lines
151
- top_matches = files[0...9].map(&:chomp)
152
-
153
- if top_matches.empty? && keyword.include?(' ')
154
- create_snippet(keyword)
155
- else
156
- choose top_matches
157
- end
158
- end
159
-
160
- send case ARGV.first
161
- when /\Ahttp/
162
- :bookmark
163
- when 'help', '--help'
164
- :help
165
- else
166
- :search
167
- end
3
+ $LOAD_PATH.unshift(File.dirname(File.realpath(__FILE__)) + '/../lib')
4
+ require 'noty'
5
+
6
+ Noty.send case ARGV.first
7
+ when /\Ahttp/
8
+ :bookmark
9
+ when 'help', '-h', '--help'
10
+ :help
11
+ when 'version', '-v', '--version'
12
+ :version
13
+ else
14
+ :search
15
+ end
@@ -1,5 +1,60 @@
1
- require "noty/version"
1
+ require 'noty/version'
2
+ require 'noty/ui'
3
+ require 'noty/storage'
4
+ require 'noty/models/bookmark'
5
+ require 'noty/models/snippet'
6
+ require 'noty/services/search'
2
7
 
3
8
  module Noty
4
- # Your code goes here...
9
+ module_function
10
+
11
+ def version
12
+ puts "Noty version #{VERSION}"
13
+ end
14
+
15
+ def help
16
+ version
17
+ puts <<-EOT
18
+ Snippets and bookmarks manager.
19
+
20
+ Usage:
21
+ noty [command|inputs]
22
+
23
+ Commands:
24
+ help, -h, --help : print this message
25
+ version, -v, --version : print noty version
26
+
27
+ Input types:
28
+ url: e.g "http://www.example.com", add URL as a bookmark file
29
+ keyword: search bookmarks and perform action on it, a single word of multiple words or regex, it is passed to "ag silver searcher"
30
+ snippet text: any multiword text, it will search first if no files contain this text you'll be asked if you want to create a snippet for it
31
+ EOT
32
+ end
33
+
34
+ def search
35
+ keyword = ARGV.join ' '
36
+ result = Services.search(keyword)
37
+
38
+ if !result.empty?
39
+ UI.choose result
40
+ elsif keyword.include?(' ')
41
+ choice = ask 'Do you want to save it as a snippet? [y/N]: '
42
+ snippet if choice.casecmp 'y'
43
+ end
44
+ end
45
+
46
+ def snippet
47
+ content = ARGV.join ' '
48
+ path = File.join(Noty::STORAGE_PATH, Time.now.to_i.to_s + '.snippet')
49
+
50
+ snippet = Snippet.new(path)
51
+ snippet.content = content
52
+ snippet.save
53
+ end
54
+
55
+ def bookmark
56
+ bm = Bookmark.from_url(ARGV.first)
57
+ bm.save
58
+ bm.edit
59
+ end
5
60
  end
@@ -0,0 +1,7 @@
1
+ require 'io/console'
2
+
3
+ def ask(question)
4
+ print question
5
+ puts choice = $stdin.getch
6
+ choice
7
+ end
@@ -0,0 +1,30 @@
1
+ require 'open3'
2
+
3
+ module Noty
4
+ module Helpers
5
+ module_function
6
+
7
+ def edit(file_path)
8
+ editor = ENV['EDITOR'] || 'vi'.freeze
9
+ system "#{editor} #{file_path}"
10
+ end
11
+
12
+ def copy(text)
13
+ case RUBY_PLATFORM
14
+ when /darwin/
15
+ Open3.capture2('pbcopy', stdin_data: text)
16
+ when /linux/
17
+ Open3.capture2('xsel --clipboard --input', stdin_data: text)
18
+ end
19
+ end
20
+
21
+ def open_url(url)
22
+ case RUBY_PLATFORM
23
+ when /darwin/
24
+ system "open #{url}"
25
+ when /linux/
26
+ system "xdg-open #{url}"
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,64 @@
1
+ require 'open-uri'
2
+ require 'yaml'
3
+ require 'noty/storage'
4
+ require 'noty/helpers'
5
+
6
+ module Noty
7
+ class Bookmark
8
+ attr_accessor :path, :url, :title
9
+
10
+ def initialize(path)
11
+ content = File.exist?(path) ? YAML.load_file(path) : ''
12
+
13
+ @path = path
14
+ @url = content['url']
15
+ @title = content['title']
16
+ end
17
+
18
+ def self.from_url(url)
19
+ file_path = File.join(STORAGE_PATH, Time.now.to_i.to_s + '.bookmark')
20
+ content = begin
21
+ open(url).read
22
+ rescue
23
+ ''
24
+ end
25
+ bookmark = new(file_path)
26
+ bookmark.url = url
27
+ bookmark.title = content.match(%r{<title>(.+)<\/title>}im).to_a[1]
28
+ bookmark
29
+ end
30
+
31
+ def save
32
+ File.write(path, to_yaml)
33
+ end
34
+
35
+ def delete
36
+ File.delete path
37
+ end
38
+
39
+ def open
40
+ Helpers.open_url url
41
+ end
42
+
43
+ def edit
44
+ Helpers.edit path
45
+ end
46
+
47
+ def copy
48
+ Helpers.copy url
49
+ end
50
+
51
+ def to_s(short = false)
52
+ short ? title.to_s : "#{title} (#{url})"
53
+ end
54
+
55
+ private
56
+
57
+ def to_yaml
58
+ {
59
+ 'url' => url,
60
+ 'title' => title
61
+ }.to_yaml
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,37 @@
1
+ require 'noty/storage'
2
+ require 'noty/helpers'
3
+
4
+ module Noty
5
+ class Snippet
6
+ attr_accessor :path, :content
7
+
8
+ def initialize(path)
9
+ @path = path
10
+ @content = File.exist?(path) ? File.read(path) : ''
11
+ end
12
+
13
+ def save
14
+ File.write(path, content)
15
+ end
16
+
17
+ def delete
18
+ File.delete path
19
+ end
20
+
21
+ def open
22
+ edit
23
+ end
24
+
25
+ def copy
26
+ Helpers.copy content
27
+ end
28
+
29
+ def edit
30
+ Helpers.edit path
31
+ end
32
+
33
+ def to_s(short = false)
34
+ short ? content.tr("\n", ' ')[0..100] : content.to_s
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,18 @@
1
+ module Noty
2
+ module Services
3
+ module_function
4
+
5
+ def search(keyword)
6
+ files = `ag -l "#{keyword}" #{STORAGE_PATH}`.lines
7
+ top_matches = files[0...9].map(&:chomp)
8
+ top_matches.map do |file|
9
+ case File.extname(file)
10
+ when '.bookmark'
11
+ Bookmark.new(file)
12
+ when '.snippet'
13
+ Snippet.new(file)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,6 @@
1
+ require 'fileutils'
2
+
3
+ module Noty
4
+ STORAGE_PATH = File.expand_path(ENV['NOTES_PATH'] || '~/.notes')
5
+ FileUtils.mkdir_p STORAGE_PATH
6
+ end
@@ -0,0 +1,43 @@
1
+ require 'noty/ask'
2
+
3
+ module Noty
4
+ module UI
5
+ module_function
6
+
7
+ def choose(objects)
8
+ return if objects.empty?
9
+
10
+ if objects.one?
11
+ puts objects.first.to_s(false)
12
+ operations(objects.first)
13
+ else
14
+
15
+ objects.each_with_index do |object, index|
16
+ puts "#{index + 1}. " + object.to_s(true)
17
+ end
18
+
19
+ choice = ask '-> (1..9) or else to exit: '
20
+
21
+ if choice =~ /\A[1-9]\z/
22
+ puts objects[choice.to_i - 1].to_s(false)
23
+ operations(objects[choice.to_i - 1])
24
+ end
25
+ end
26
+ end
27
+
28
+ def operations(object)
29
+ case ask '[E]dit [D]elete [O]pen [C]opy, Else to Quit: '
30
+ when 'e'
31
+ object.edit
32
+ when 'd'
33
+ object.delete
34
+ when 'o'
35
+ object.open
36
+ when 'c'
37
+ object.copy
38
+ else
39
+ exit 0
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,3 +1,3 @@
1
1
  module Noty
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: noty
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emad Elsaid
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-05-04 00:00:00.000000000 Z
11
+ date: 2017-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -75,6 +75,14 @@ description: |
75
75
  1. xsel : could be found on most distros official repositories
76
76
  2. xdg-open : should be installed with most opendesktop compatible desktop environments
77
77
 
78
+ ## Environment
79
+
80
+ by default Noty saves your files in `~/.notes` if you want to change that path, define an Environment variable in your shell init file `.bashrc` or `.zshrc`
81
+
82
+ ```bash
83
+ export NOTES_PATH=/path/to/your/notes/dir
84
+ ```
85
+
78
86
 
79
87
  ## Usage
80
88
 
@@ -91,6 +99,28 @@ description: |
91
99
  2. **keyword:** search bookmarks and perform action on it, a single word of multiple words or regex, it is passed to "ag silver searcher"
92
100
  3. **snippet text:** any multiword text, it will search first if no files contain this text you'll be asked if you want to create a snippet for it
93
101
 
102
+ ## Examples
103
+
104
+ Add a bookmark
105
+ ```bash
106
+ noty https://www.youtube.com
107
+ ```
108
+
109
+ Search for bookmark
110
+ ```bash
111
+ noty youtube
112
+ ```
113
+
114
+ Add a snippet text
115
+ ```bash
116
+ noty this is a long text that I need to save in my stash
117
+ ```
118
+
119
+ Search for a snippet (same as searching for bookmarks)
120
+ ```bash
121
+ noty need
122
+ ```
123
+
94
124
  ## Contributing
95
125
 
96
126
  Bug reports and pull requests are welcome on GitHub at https://github.com/blazeeboy/noty.
@@ -115,6 +145,13 @@ files:
115
145
  - bin/setup
116
146
  - exe/noty
117
147
  - lib/noty.rb
148
+ - lib/noty/ask.rb
149
+ - lib/noty/helpers.rb
150
+ - lib/noty/models/bookmark.rb
151
+ - lib/noty/models/snippet.rb
152
+ - lib/noty/services/search.rb
153
+ - lib/noty/storage.rb
154
+ - lib/noty/ui.rb
118
155
  - lib/noty/version.rb
119
156
  - noty.gemspec
120
157
  homepage: https://www.github.com/blazeeboy/noty