alfred-workflow 1.1.5 → 1.2.0
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/.autotest +9 -18
- data/.rspec +1 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +24 -0
- data/Manifest.txt +8 -0
- data/README.md +2 -2
- data/Rakefile +17 -1
- data/autotest/discover.rb +1 -0
- data/lib/alfred/feedback.rb +5 -141
- data/lib/alfred/feedback/file_item.rb +47 -0
- data/lib/alfred/feedback/item.rb +101 -0
- data/lib/alfred/version.rb +1 -1
- data/spec/item_spec.rb +20 -0
- data/spec/spec_helper.rb +22 -0
- metadata +10 -2
data/.autotest
CHANGED
@@ -2,22 +2,13 @@
|
|
2
2
|
|
3
3
|
require 'autotest/restart'
|
4
4
|
|
5
|
-
#
|
6
|
-
|
7
|
-
|
8
|
-
# at.libs << ":../some/external"
|
9
|
-
#
|
10
|
-
# at.add_exception 'vendor'
|
11
|
-
#
|
12
|
-
# at.add_mapping(/dependency.rb/) do |f, _|
|
13
|
-
# at.files_matching(/test_.*rb$/)
|
14
|
-
# end
|
15
|
-
#
|
16
|
-
# %w(TestA TestB).each do |klass|
|
17
|
-
# at.extra_class_map[klass] = "test/test_misc.rb"
|
18
|
-
# end
|
19
|
-
# end
|
5
|
+
# Include plugins
|
6
|
+
require 'autotest/fsevent'
|
7
|
+
require 'autotest/growl'
|
20
8
|
|
21
|
-
|
22
|
-
|
23
|
-
|
9
|
+
Autotest.add_hook :initialize do |at|
|
10
|
+
%w{.git .DS_Store ._* vendor}.each { |exception| at.add_exception(exception) }
|
11
|
+
|
12
|
+
at.add_exception %r{^./tmp} # ignore temp files, lest autotest will run again, and again...
|
13
|
+
false
|
14
|
+
end
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/Gemfile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
# DO NOT EDIT THIS FILE. Instead, edit Rakefile, and run `rake bundler:gemfile`.
|
4
|
+
|
5
|
+
source "https://rubygems.org/"
|
6
|
+
|
7
|
+
gem "plist", "~>3.1.0"
|
8
|
+
gem "logging", "~>1.8.0"
|
9
|
+
|
10
|
+
gem "rdoc", "~>3.10", :group => [:development, :test]
|
11
|
+
gem "hoe", "~>3.5", :group => [:development, :test]
|
12
|
+
|
13
|
+
# vim: syntax=ruby
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
hoe (3.5.2)
|
5
|
+
rake (>= 0.8, < 11.0)
|
6
|
+
json (1.7.7)
|
7
|
+
little-plugger (1.1.3)
|
8
|
+
logging (1.8.0)
|
9
|
+
little-plugger (>= 1.1.3)
|
10
|
+
multi_json (>= 1.3.6)
|
11
|
+
multi_json (1.3.7)
|
12
|
+
plist (3.1.0)
|
13
|
+
rake (10.0.3)
|
14
|
+
rdoc (3.12.2)
|
15
|
+
json (~> 1.4)
|
16
|
+
|
17
|
+
PLATFORMS
|
18
|
+
ruby
|
19
|
+
|
20
|
+
DEPENDENCIES
|
21
|
+
hoe (~> 3.5)
|
22
|
+
logging (~> 1.8.0)
|
23
|
+
plist (~> 3.1.0)
|
24
|
+
rdoc (~> 3.10)
|
data/Manifest.txt
CHANGED
@@ -1,10 +1,18 @@
|
|
1
1
|
.autotest
|
2
2
|
.gemtest
|
3
|
+
.rspec
|
4
|
+
Gemfile
|
5
|
+
Gemfile.lock
|
3
6
|
History.txt
|
4
7
|
Manifest.txt
|
5
8
|
README.md
|
6
9
|
Rakefile
|
10
|
+
autotest/discover.rb
|
7
11
|
lib/alfred.rb
|
8
12
|
lib/alfred/feedback.rb
|
13
|
+
lib/alfred/feedback/file_item.rb
|
14
|
+
lib/alfred/feedback/item.rb
|
9
15
|
lib/alfred/ui.rb
|
10
16
|
lib/alfred/version.rb
|
17
|
+
spec/item_spec.rb
|
18
|
+
spec/spec_helper.rb
|
data/README.md
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# alfred-workflow
|
2
2
|
|
3
3
|
* home :: https://github.com/zhaocai/alfred-workflow
|
4
|
+
* rdoc :: http://rubydoc.info/gems/alfred-workflow/
|
4
5
|
* code :: https://github.com/zhaocai/alfred-workflow
|
5
6
|
* bugs :: https://github.com/zhaocai/alfred-workflow/issues
|
6
|
-
* rdoc :: http://rubydoc.info/gems/alfred-workflow/
|
7
7
|
|
8
8
|
|
9
9
|
## DESCRIPTION:
|
@@ -33,7 +33,7 @@ Alfred.with_friendly_error do |alfred|
|
|
33
33
|
|
34
34
|
fb.add_file_item(File.expand_path "~/Applications/")
|
35
35
|
|
36
|
-
puts fb.
|
36
|
+
puts fb.to_alfred(ARGV)
|
37
37
|
end
|
38
38
|
```
|
39
39
|
|
data/Rakefile
CHANGED
@@ -4,7 +4,8 @@ require 'rubygems'
|
|
4
4
|
require 'hoe'
|
5
5
|
|
6
6
|
Hoe.plugin :bundler
|
7
|
-
Hoe.plugin :
|
7
|
+
Hoe.plugin :test
|
8
|
+
|
8
9
|
Hoe.plugin :git
|
9
10
|
Hoe.plugin :rubygems
|
10
11
|
Hoe.plugin :version
|
@@ -13,8 +14,23 @@ Hoe.spec 'alfred-workflow' do
|
|
13
14
|
|
14
15
|
developer('Zhao Cai', 'caizhaoff@gmail.com')
|
15
16
|
|
17
|
+
testlib = :minitest
|
16
18
|
extra_deps << ['plist', '~> 3.1.0']
|
17
19
|
extra_deps << ['logging', '~> 1.8.0']
|
18
20
|
end
|
19
21
|
|
22
|
+
desc "Bump Major Version and Commit"
|
23
|
+
task "bump:major" => ["version:bump:major"] do
|
24
|
+
sh "git commit -am '! Bump version to #{ENV["VERSION"]}'"
|
25
|
+
end
|
26
|
+
|
27
|
+
desc "Bump Minor Version and Commit"
|
28
|
+
task "bump:minor" => ["version:bump:minor"] do
|
29
|
+
sh "git commit -am '* Bump version to #{ENV["VERSION"]}'"
|
30
|
+
end
|
31
|
+
desc "Bump Patch Version and Commit"
|
32
|
+
task "bump:patch" => ["version:bump:patch"] do
|
33
|
+
sh "git commit -am 'Bump version to #{ENV["VERSION"]}'"
|
34
|
+
end
|
35
|
+
|
20
36
|
# vim: syntax=ruby
|
@@ -0,0 +1 @@
|
|
1
|
+
Autotest.add_discovery { "rspec2" }
|
data/lib/alfred/feedback.rb
CHANGED
@@ -1,148 +1,12 @@
|
|
1
1
|
require "rexml/document"
|
2
|
+
require 'alfred/feedback/item'
|
3
|
+
require 'alfred/feedback/file_item'
|
2
4
|
|
3
5
|
module Alfred
|
4
6
|
|
5
7
|
class Feedback
|
6
8
|
attr_accessor :items
|
7
9
|
|
8
|
-
class Item
|
9
|
-
attr_accessor :uid, :arg, :valid, :autocomplete, :title, :subtitle, :icon
|
10
|
-
|
11
|
-
def initialize(title, opts = {})
|
12
|
-
@title = title
|
13
|
-
@subtitle = opts[:subtitle] if opts[:subtitle]
|
14
|
-
|
15
|
-
if opts[:icon]
|
16
|
-
@icon = opts[:icon]
|
17
|
-
else
|
18
|
-
@icon = {:type => "default", :name => "icon.png"}
|
19
|
-
end
|
20
|
-
|
21
|
-
@uid = opts[:uid] if opts[:uid]
|
22
|
-
|
23
|
-
if opts[:arg]
|
24
|
-
@arg = opts[:arg]
|
25
|
-
else
|
26
|
-
@arg = @title
|
27
|
-
end
|
28
|
-
|
29
|
-
if opts[:type]
|
30
|
-
@type = opts[:type]
|
31
|
-
else
|
32
|
-
@type = 'default'
|
33
|
-
end
|
34
|
-
|
35
|
-
if opts[:valid]
|
36
|
-
@valid = opts[:valid]
|
37
|
-
else
|
38
|
-
@valid = 'yes'
|
39
|
-
end
|
40
|
-
|
41
|
-
if opts[:autocomplete]
|
42
|
-
@autocomplete = opts[:autocomplete]
|
43
|
-
else
|
44
|
-
@autocomplete = @title
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
## To customize a new match? function, overwrite it.
|
49
|
-
#
|
50
|
-
# Module Alfred
|
51
|
-
# class Feedback
|
52
|
-
# class Item
|
53
|
-
# alias_method :default_match?, :match?
|
54
|
-
# def match?(query)
|
55
|
-
# # define new match? function here
|
56
|
-
# end
|
57
|
-
# end
|
58
|
-
# end
|
59
|
-
# end
|
60
|
-
def match?(query)
|
61
|
-
return true if query.empty?
|
62
|
-
if smart_query(query).match(@title)
|
63
|
-
return true
|
64
|
-
else
|
65
|
-
return false
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
def to_xml
|
70
|
-
xml_element = REXML::Element.new('item')
|
71
|
-
xml_element.add_attributes({
|
72
|
-
'uid' => @uid,
|
73
|
-
'arg' => @arg,
|
74
|
-
'valid' => @valid,
|
75
|
-
'autocomplete' => @autocomplete
|
76
|
-
})
|
77
|
-
xml_element.add_attributes('type' => 'file') if @type == "file"
|
78
|
-
|
79
|
-
REXML::Element.new("title", xml_element).text = @title
|
80
|
-
REXML::Element.new("subtitle", xml_element).text = @subtitle
|
81
|
-
|
82
|
-
icon = REXML::Element.new("icon", xml_element)
|
83
|
-
icon.text = @icon[:name]
|
84
|
-
icon.add_attributes('type' => 'fileicon') if @icon[:type] == "fileicon"
|
85
|
-
|
86
|
-
xml_element
|
87
|
-
end
|
88
|
-
|
89
|
-
protected
|
90
|
-
|
91
|
-
def smart_query(query)
|
92
|
-
if query.is_a? Array
|
93
|
-
query = query.join(" ")
|
94
|
-
end
|
95
|
-
option = Regexp::IGNORECASE
|
96
|
-
if /[[:upper:]]/.match(query)
|
97
|
-
option = nil
|
98
|
-
end
|
99
|
-
Regexp.compile(".*#{query.gsub(/\s+/,'.*')}.*", option)
|
100
|
-
end
|
101
|
-
|
102
|
-
end
|
103
|
-
|
104
|
-
class FileItem < Item
|
105
|
-
|
106
|
-
def initialize(path)
|
107
|
-
if ['.ennote', '.webbookmark'].include? File.extname(path)
|
108
|
-
@title = %x{mdls -name kMDItemDisplayName -raw '#{path}'}
|
109
|
-
else
|
110
|
-
@title = File.basename(path)
|
111
|
-
end
|
112
|
-
@subtitle = path
|
113
|
-
@uid = path
|
114
|
-
@arg = path
|
115
|
-
@icon = {:type => "fileicon", :name => path}
|
116
|
-
@valid = 'yes'
|
117
|
-
@autocomplete = @title
|
118
|
-
@type = 'file'
|
119
|
-
end
|
120
|
-
|
121
|
-
def match?(query)
|
122
|
-
return true if query.empty?
|
123
|
-
if query.is_a? String
|
124
|
-
query = query.split("\s")
|
125
|
-
end
|
126
|
-
|
127
|
-
queries = []
|
128
|
-
query.each { |q|
|
129
|
-
queries << smart_query(q)
|
130
|
-
}
|
131
|
-
|
132
|
-
queries.delete_if { |q|
|
133
|
-
q.match(@title) or q.match(@subtitle)
|
134
|
-
}
|
135
|
-
|
136
|
-
if queries.empty?
|
137
|
-
return true
|
138
|
-
else
|
139
|
-
return false
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
end
|
144
|
-
|
145
|
-
|
146
10
|
def initialize
|
147
11
|
@items = []
|
148
12
|
end
|
@@ -156,15 +20,15 @@ module Alfred
|
|
156
20
|
@items << FileItem.new(path)
|
157
21
|
end
|
158
22
|
|
159
|
-
|
160
|
-
def to_xml(query = '', items = @items)
|
23
|
+
def to_xml(with_query = '', items = @items)
|
161
24
|
document = REXML::Element.new("items")
|
162
25
|
items.each do |item|
|
163
|
-
document << item.to_xml if item.match?(
|
26
|
+
document << item.to_xml if item.match?(with_query)
|
164
27
|
end
|
165
28
|
document.to_s
|
166
29
|
end
|
167
30
|
|
31
|
+
alias_method :to_alfred, :to_xml
|
168
32
|
end
|
169
33
|
|
170
34
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require "rexml/document"
|
2
|
+
require "alfred/feedback/item"
|
3
|
+
|
4
|
+
module Alfred
|
5
|
+
class Feedback
|
6
|
+
class FileItem < Item
|
7
|
+
|
8
|
+
def initialize(path)
|
9
|
+
if ['.ennote', '.webbookmark'].include? File.extname(path)
|
10
|
+
@title = %x{mdls -name kMDItemDisplayName -raw '#{path}'}
|
11
|
+
else
|
12
|
+
@title = File.basename(path)
|
13
|
+
end
|
14
|
+
@subtitle = path
|
15
|
+
@uid = path
|
16
|
+
@arg = path
|
17
|
+
@icon = {:type => "fileicon", :name => path}
|
18
|
+
@valid = 'yes'
|
19
|
+
@autocomplete = @title
|
20
|
+
@type = 'file'
|
21
|
+
end
|
22
|
+
|
23
|
+
def match?(query)
|
24
|
+
return true if query.empty?
|
25
|
+
if query.is_a? String
|
26
|
+
query = query.split("\s")
|
27
|
+
end
|
28
|
+
|
29
|
+
queries = []
|
30
|
+
query.each { |q|
|
31
|
+
queries << smart_query(q)
|
32
|
+
}
|
33
|
+
|
34
|
+
queries.delete_if { |q|
|
35
|
+
q.match(@title) or q.match(@subtitle)
|
36
|
+
}
|
37
|
+
|
38
|
+
if queries.empty?
|
39
|
+
return true
|
40
|
+
else
|
41
|
+
return false
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require "rexml/document"
|
2
|
+
|
3
|
+
module Alfred
|
4
|
+
class Feedback
|
5
|
+
class Item
|
6
|
+
attr_accessor :uid, :arg, :valid, :autocomplete, :title, :subtitle, :icon, :type
|
7
|
+
|
8
|
+
def initialize(title, opts = {})
|
9
|
+
@title = title
|
10
|
+
@subtitle = opts[:subtitle] if opts[:subtitle]
|
11
|
+
|
12
|
+
if opts[:icon]
|
13
|
+
@icon = opts[:icon]
|
14
|
+
else
|
15
|
+
@icon = {:type => "default", :name => "icon.png"}
|
16
|
+
end
|
17
|
+
|
18
|
+
@uid = opts[:uid] if opts[:uid]
|
19
|
+
|
20
|
+
if opts[:arg]
|
21
|
+
@arg = opts[:arg]
|
22
|
+
else
|
23
|
+
@arg = @title
|
24
|
+
end
|
25
|
+
|
26
|
+
if opts[:type]
|
27
|
+
@type = opts[:type]
|
28
|
+
else
|
29
|
+
@type = 'default'
|
30
|
+
end
|
31
|
+
|
32
|
+
if opts[:valid]
|
33
|
+
@valid = opts[:valid]
|
34
|
+
else
|
35
|
+
@valid = 'yes'
|
36
|
+
end
|
37
|
+
|
38
|
+
if opts[:autocomplete]
|
39
|
+
@autocomplete = opts[:autocomplete]
|
40
|
+
else
|
41
|
+
@autocomplete = @title
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
## To customize a new match? function, overwrite it.
|
46
|
+
#
|
47
|
+
# Module Alfred
|
48
|
+
# class Feedback
|
49
|
+
# class Item
|
50
|
+
# alias_method :default_match?, :match?
|
51
|
+
# def match?(query)
|
52
|
+
# # define new match? function here
|
53
|
+
# end
|
54
|
+
# end
|
55
|
+
# end
|
56
|
+
# end
|
57
|
+
def match?(query)
|
58
|
+
return true if query.empty?
|
59
|
+
if smart_query(query).match(@title)
|
60
|
+
return true
|
61
|
+
else
|
62
|
+
return false
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def to_xml
|
67
|
+
xml_element = REXML::Element.new('item')
|
68
|
+
xml_element.add_attributes({
|
69
|
+
'uid' => @uid,
|
70
|
+
'arg' => @arg,
|
71
|
+
'valid' => @valid,
|
72
|
+
'autocomplete' => @autocomplete
|
73
|
+
})
|
74
|
+
xml_element.add_attributes('type' => 'file') if @type == "file"
|
75
|
+
|
76
|
+
REXML::Element.new("title", xml_element).text = @title
|
77
|
+
REXML::Element.new("subtitle", xml_element).text = @subtitle
|
78
|
+
|
79
|
+
icon = REXML::Element.new("icon", xml_element)
|
80
|
+
icon.text = @icon[:name]
|
81
|
+
icon.add_attributes('type' => 'fileicon') if @icon[:type] == "fileicon"
|
82
|
+
|
83
|
+
xml_element
|
84
|
+
end
|
85
|
+
|
86
|
+
protected
|
87
|
+
|
88
|
+
def smart_query(query)
|
89
|
+
if query.is_a? Array
|
90
|
+
query = query.join(" ")
|
91
|
+
end
|
92
|
+
option = Regexp::IGNORECASE
|
93
|
+
if /[[:upper:]]/.match(query)
|
94
|
+
option = nil
|
95
|
+
end
|
96
|
+
Regexp.compile(".*#{query.gsub(/\s+/,'.*')}.*", option)
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
data/lib/alfred/version.rb
CHANGED
data/spec/item_spec.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "Feedback Item" do
|
4
|
+
it "should return raise ArgumentError without Item title" do
|
5
|
+
expect { Alfred::Feedback::Item.new }.to raise_error(ArgumentError)
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should match default xml item tags" do
|
9
|
+
item = Alfred::Feedback::Item.new("title")
|
10
|
+
item.title.should eql "title"
|
11
|
+
item.subtitle.should eql nil
|
12
|
+
item.autocomplete.should eql item.title
|
13
|
+
item.arg.should eql item.title
|
14
|
+
item.valid.should eql "yes"
|
15
|
+
item.type.should eql "default"
|
16
|
+
|
17
|
+
default_icon = {:type => "default", :name => "icon.png"}
|
18
|
+
item.icon.should eql default_icon
|
19
|
+
end
|
20
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
|
2
|
+
|
3
|
+
require "rspec"
|
4
|
+
require "alfred"
|
5
|
+
|
6
|
+
RSpec.configure do |c|
|
7
|
+
c.color_enabled = true
|
8
|
+
|
9
|
+
# Use color not only in STDOUT but also in pagers and files
|
10
|
+
c.tty = true
|
11
|
+
|
12
|
+
c.formatter = :documentation # :progress, :html, :textmate
|
13
|
+
|
14
|
+
c.mock_with :rspec
|
15
|
+
end
|
16
|
+
|
17
|
+
class String
|
18
|
+
def strip_heredoc
|
19
|
+
indent = scan(/^[ \t]*(?=\S)/).min.size || 0
|
20
|
+
gsub(/^[ \t]{#{indent}}/, '')
|
21
|
+
end
|
22
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alfred-workflow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: plist
|
@@ -87,14 +87,22 @@ extra_rdoc_files:
|
|
87
87
|
files:
|
88
88
|
- .autotest
|
89
89
|
- .gemtest
|
90
|
+
- .rspec
|
91
|
+
- Gemfile
|
92
|
+
- Gemfile.lock
|
90
93
|
- History.txt
|
91
94
|
- Manifest.txt
|
92
95
|
- README.md
|
93
96
|
- Rakefile
|
97
|
+
- autotest/discover.rb
|
94
98
|
- lib/alfred.rb
|
95
99
|
- lib/alfred/feedback.rb
|
100
|
+
- lib/alfred/feedback/file_item.rb
|
101
|
+
- lib/alfred/feedback/item.rb
|
96
102
|
- lib/alfred/ui.rb
|
97
103
|
- lib/alfred/version.rb
|
104
|
+
- spec/item_spec.rb
|
105
|
+
- spec/spec_helper.rb
|
98
106
|
homepage: https://github.com/zhaocai/alfred-workflow
|
99
107
|
licenses: []
|
100
108
|
post_install_message:
|