pincerna 1.1.3
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 +7 -0
- data/.gitignore +7 -0
- data/.rubocop.yml +77 -0
- data/.travis-gemfile +17 -0
- data/.travis.yml +7 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +23 -0
- data/LICENSE.md +21 -0
- data/README.md +211 -0
- data/Rakefile +45 -0
- data/bin/pincernad +56 -0
- data/docs/Pincerna.html +130 -0
- data/docs/Pincerna/Base.html +3051 -0
- data/docs/Pincerna/Bookmark.html +523 -0
- data/docs/Pincerna/Cache.html +767 -0
- data/docs/Pincerna/ChromeBookmark.html +308 -0
- data/docs/Pincerna/CurrencyConversion.html +589 -0
- data/docs/Pincerna/FirefoxBookmark.html +328 -0
- data/docs/Pincerna/Ip.html +1017 -0
- data/docs/Pincerna/Map.html +399 -0
- data/docs/Pincerna/SafariBookmark.html +308 -0
- data/docs/Pincerna/Server.html +673 -0
- data/docs/Pincerna/Translation.html +517 -0
- data/docs/Pincerna/UnitConversion.html +1042 -0
- data/docs/Pincerna/Version.html +189 -0
- data/docs/Pincerna/Vpn.html +561 -0
- data/docs/Pincerna/Weather.html +837 -0
- data/docs/_index.html +298 -0
- data/docs/class_list.html +54 -0
- data/docs/css/common.css +1 -0
- data/docs/css/full_list.css +57 -0
- data/docs/css/style.css +338 -0
- data/docs/file.README.html +327 -0
- data/docs/file_list.html +56 -0
- data/docs/frames.html +28 -0
- data/docs/index.html +327 -0
- data/docs/js/app.js +214 -0
- data/docs/js/full_list.js +178 -0
- data/docs/js/jquery.js +4 -0
- data/docs/method_list.html +389 -0
- data/docs/top-level-namespace.html +112 -0
- data/icon.png +0 -0
- data/images/chrome.png +0 -0
- data/images/currency.png +0 -0
- data/images/firefox.png +0 -0
- data/images/map.png +0 -0
- data/images/network.png +0 -0
- data/images/safari.png +0 -0
- data/images/translate.png +0 -0
- data/images/unit.png +0 -0
- data/images/vpn.png +0 -0
- data/images/weather.png +0 -0
- data/info.plist +961 -0
- data/it.cowtech.pincernad.plist +19 -0
- data/lib/pincerna.rb +30 -0
- data/lib/pincerna/base.rb +258 -0
- data/lib/pincerna/bookmark.rb +80 -0
- data/lib/pincerna/cache.rb +61 -0
- data/lib/pincerna/chrome_bookmark.rb +40 -0
- data/lib/pincerna/currency_conversion.rb +134 -0
- data/lib/pincerna/firefox_bookmark.rb +92 -0
- data/lib/pincerna/ip.rb +135 -0
- data/lib/pincerna/map.rb +30 -0
- data/lib/pincerna/safari_bookmark.rb +40 -0
- data/lib/pincerna/server.rb +85 -0
- data/lib/pincerna/translation.rb +67 -0
- data/lib/pincerna/unit_conversion.rb +120 -0
- data/lib/pincerna/version.rb +24 -0
- data/lib/pincerna/vpn.rb +74 -0
- data/lib/pincerna/weather.rb +188 -0
- data/pincerna.alfredworkflow +0 -0
- data/pincerna.gemspec +36 -0
- data/pincerna.sh +9 -0
- data/spec/cassettes/Pincerna_CurrencyConversion/_perform_filtering/should_return_valid_values.yml +38 -0
- data/spec/cassettes/Pincerna_Ip/_get_local_addresses/should_return_a_list_of_addresses.yml +47 -0
- data/spec/cassettes/Pincerna_Ip/_get_public_address/should_return_public_IP_address.yml +44 -0
- data/spec/cassettes/Pincerna_Translation/_perform_filtering/should_default_from_English_to_the_given_language_when_only_one_is_present.yml +124 -0
- data/spec/cassettes/Pincerna_Translation/_perform_filtering/should_query_Google_Translate_for_sentences_returning_no_alternatives.yml +51 -0
- data/spec/cassettes/Pincerna_Translation/_perform_filtering/should_query_Google_Translate_for_single_words.yml +71 -0
- data/spec/cassettes/Pincerna_Weather/_get_forecast/should_append_name.yml +177 -0
- data/spec/cassettes/Pincerna_Weather/_get_forecast/should_get_correct_forecasts.yml +339 -0
- data/spec/cassettes/Pincerna_Weather/_lookup_places/should_return_an_existing_WOEID_without_making_any_request.yml +56 -0
- data/spec/cassettes/Pincerna_Weather/_lookup_places/should_search_for_places.yml +189 -0
- data/spec/cassettes/Pincerna_Weather/_perform_filtering/should_get_forecast.yml +56 -0
- data/spec/coverage_helper.rb +44 -0
- data/spec/pincerna/base_spec.rb +166 -0
- data/spec/pincerna/bookmark_spec.rb +65 -0
- data/spec/pincerna/cache_spec.rb +88 -0
- data/spec/pincerna/chrome_bookmark_spec.rb +114 -0
- data/spec/pincerna/currency_conversion_spec.rb +46 -0
- data/spec/pincerna/firefox_bookmark_spec.rb +46 -0
- data/spec/pincerna/ip_spec.rb +194 -0
- data/spec/pincerna/map_spec.rb +24 -0
- data/spec/pincerna/safari_bookmark_spec.rb +237 -0
- data/spec/pincerna/server_spec.rb +108 -0
- data/spec/pincerna/translation_spec.rb +55 -0
- data/spec/pincerna/unit_conversion_spec.rb +98 -0
- data/spec/pincerna/vpn_spec.rb +68 -0
- data/spec/pincerna/weather_spec.rb +131 -0
- data/spec/spec_helper.rb +48 -0
- metadata +283 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
http_interactions:
|
|
3
|
+
- request:
|
|
4
|
+
method: get
|
|
5
|
+
uri: http://where.yahooapis.com/v1/places.q(QUERY);count=5?appid=dj0yJmk9ZUpBZk1hQTJGRHM5JmQ9WVdrOVlUSnBjMGhUTjJVbWNHbzlOemsyTURNeU5EWXkmcz1jb25zdW1lcnNlY3JldCZ4PWRi&format=json
|
|
6
|
+
body:
|
|
7
|
+
encoding: US-ASCII
|
|
8
|
+
string: ''
|
|
9
|
+
headers:
|
|
10
|
+
Accept:
|
|
11
|
+
- application/json
|
|
12
|
+
Accept-Encoding:
|
|
13
|
+
- gzip, deflate
|
|
14
|
+
User-Agent:
|
|
15
|
+
- Ruby
|
|
16
|
+
response:
|
|
17
|
+
status:
|
|
18
|
+
code: 200
|
|
19
|
+
message: OK
|
|
20
|
+
headers:
|
|
21
|
+
Access-Control-Allow-Origin:
|
|
22
|
+
- '*'
|
|
23
|
+
Cache-Control:
|
|
24
|
+
- public, must-revalidate
|
|
25
|
+
Connection:
|
|
26
|
+
- Keep-Alive
|
|
27
|
+
Content-Encoding:
|
|
28
|
+
- gzip
|
|
29
|
+
Content-Language:
|
|
30
|
+
- en-US
|
|
31
|
+
Content-Type:
|
|
32
|
+
- application/json; charset=UTF-8
|
|
33
|
+
Date:
|
|
34
|
+
- Wed, 07 Aug 2013 16:16:16 GMT
|
|
35
|
+
P3p:
|
|
36
|
+
- policyref="http://info.yahoo.com/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV
|
|
37
|
+
TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY
|
|
38
|
+
ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV"
|
|
39
|
+
Server:
|
|
40
|
+
- HTTP/1.1 UserFiberFramework/1.0
|
|
41
|
+
Transfer-Encoding:
|
|
42
|
+
- chunked
|
|
43
|
+
Vary:
|
|
44
|
+
- Accept-Encoding
|
|
45
|
+
Via:
|
|
46
|
+
- HTTP/1.1 r08.ycpi.gq1.yahoo.net UserFiberFramework/1.0
|
|
47
|
+
X-Yahoo-Serving-Host:
|
|
48
|
+
- wws3.geotech.gq1.yahoo.com
|
|
49
|
+
body:
|
|
50
|
+
encoding: ASCII-8BIT
|
|
51
|
+
string: !binary |-
|
|
52
|
+
H4sIAAAAAAAAA6pWKshJTE4tVrKqViouSSwqUbIy0FFKzi/Ng7BK8ksSc4Cs
|
|
53
|
+
2loAAAAA//8DAACYu9cqAAAA
|
|
54
|
+
http_version:
|
|
55
|
+
recorded_at: Wed, 07 Aug 2013 16:16:16 GMT
|
|
56
|
+
recorded_with: VCR 2.5.0
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# This file is part of the pincerna gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
|
|
4
|
+
# Licensed under the MIT license, which can be found at https://choosealicense.com/licenses/mit.
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
require "pathname"
|
|
8
|
+
require "simplecov"
|
|
9
|
+
require "coveralls"
|
|
10
|
+
require "json"
|
|
11
|
+
|
|
12
|
+
Coveralls.wear! if ENV["CI"] || ENV["JENKINS_URL"] # Do not load outside Travis
|
|
13
|
+
|
|
14
|
+
SimpleCov.start do
|
|
15
|
+
root = Pathname.new(File.dirname(__FILE__)) + ".."
|
|
16
|
+
|
|
17
|
+
add_filter do |src_file|
|
|
18
|
+
path = Pathname.new(src_file.filename).relative_path_from(root).to_s
|
|
19
|
+
path !~ /^lib/
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Backport this to fix an issue with ruby-units (https://github.com/colszowka/simplecov/pull/175).
|
|
24
|
+
# Remove once Simplecov reaches v-0.8.0.
|
|
25
|
+
class SimpleCov::FileList < Array
|
|
26
|
+
def covered_strength
|
|
27
|
+
return 0 if empty? or lines_of_code == 0
|
|
28
|
+
map {|f| f.covered_strength }.reduce(&:+).to_f / size
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
class SimpleCov::SourceFile
|
|
33
|
+
def covered_percent
|
|
34
|
+
return 100.0 if lines.length == 0 or lines.length == never_lines.count
|
|
35
|
+
relevant_lines = lines.count - never_lines.count - skipped_lines.count
|
|
36
|
+
if relevant_lines == 0
|
|
37
|
+
0
|
|
38
|
+
else
|
|
39
|
+
(covered_lines.count) * 100.0 / relevant_lines.to_f
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# This file is part of the pincerna gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
|
|
4
|
+
# Licensed under the MIT license, which can be found at https://choosealicense.com/licenses/mit.
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
require "spec_helper"
|
|
8
|
+
require "yaml"
|
|
9
|
+
|
|
10
|
+
describe Pincerna::Base do
|
|
11
|
+
subject { Pincerna::Base.new("QUERY", "yml") }
|
|
12
|
+
|
|
13
|
+
let(:reference_xml) {
|
|
14
|
+
<<EOXML
|
|
15
|
+
<?xml version="1.0"?>
|
|
16
|
+
<items>
|
|
17
|
+
<item first="FIRST" second="SECOND" third="THIRD">
|
|
18
|
+
<title>TITLE 1</title>
|
|
19
|
+
<subtitle>SUBTITLE 1</subtitle>
|
|
20
|
+
<icon>ICON 1</icon>
|
|
21
|
+
</item>
|
|
22
|
+
<item fourth="FOURTH" fifth="FIFTH" sixth="SIXTH">
|
|
23
|
+
<title>TITLE 2</title>
|
|
24
|
+
<subtitle>SUBTITLE 2</subtitle>
|
|
25
|
+
<icon>ICON 2</icon>
|
|
26
|
+
</item>
|
|
27
|
+
</items>
|
|
28
|
+
EOXML
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
describe ".execute" do
|
|
32
|
+
it "should find relevant class" do
|
|
33
|
+
expect(Pincerna::Map).to receive(:new).and_call_original
|
|
34
|
+
expect(Pincerna::Base.execute!("map", "QUERY"))
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should create a query and then filter" do
|
|
38
|
+
query = ::Object.new
|
|
39
|
+
expect(query).to receive(:filter).and_return("FILTER")
|
|
40
|
+
expect(Pincerna::Map).to receive(:new).with("QUERY", "FORMAT", "DEBUG").and_return(query)
|
|
41
|
+
expect(Pincerna::Base.execute!("map", "QUERY", "FORMAT", "DEBUG"))
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "should not fail if a matching class is not found" do
|
|
45
|
+
expect { expect(Pincerna::Base.execute!("invalid", "QUERY")) }.not_to raise_error
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
describe "#initalize" do
|
|
50
|
+
it "should initialize correct attributes" do
|
|
51
|
+
expect(subject.instance_variable_get(:@query)).to eq("QUERY")
|
|
52
|
+
expect(subject.instance_variable_get(:@cache_dir)).to eq(::File.expand_path("~/Library/Caches/com.runningwithcrayons.Alfred-2/Workflow Data/it.cowtech.pincerna"))
|
|
53
|
+
expect(subject.instance_variable_get(:@feedback_items)).to eq([])
|
|
54
|
+
expect(subject.format).to eq(:yml)
|
|
55
|
+
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "should save debug mode" do
|
|
59
|
+
reference = Pincerna::Base.new("QUERY", "yml", "DEBUG")
|
|
60
|
+
expect(reference.instance_variable_get(:@debug)).to eq("DEBUG")
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "should save format" do
|
|
64
|
+
reference = Pincerna::Base.new("QUERY", "yml", "DEBUG")
|
|
65
|
+
expect(reference.format).to eq(:yml)
|
|
66
|
+
expect(reference.format_content_type).to eq("text/x-yaml")
|
|
67
|
+
|
|
68
|
+
reference = Pincerna::Base.new("QUERY", "yaml", "DEBUG")
|
|
69
|
+
expect(reference.format).to eq(:yml)
|
|
70
|
+
expect(reference.format_content_type).to eq("text/x-yaml")
|
|
71
|
+
|
|
72
|
+
reference = Pincerna::Base.new("QUERY", "FOO", "DEBUG")
|
|
73
|
+
expect(reference.format).to eq(:xml)
|
|
74
|
+
expect(reference.format_content_type).to eq("text/xml")
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
describe "#filter" do
|
|
79
|
+
before(:each) do
|
|
80
|
+
allow(subject).to receive(:perform_filtering).with("QUERY").and_return([{query: "query"}])
|
|
81
|
+
allow(subject).to receive(:process_results).with([{query: "query"}]).and_return([{title: "QUERY", arg: "query"}])
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "match the query, filter it and then process" do
|
|
85
|
+
expect(subject.filter).to eq_as_yaml([{title: "QUERY", arg: "query"}])
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it "should return an array if a failure occurs" do
|
|
89
|
+
allow(subject).to receive(:perform_filtering).and_raise(::ArgumentError)
|
|
90
|
+
allow(subject).to receive(:process_results).with([]).and_return([])
|
|
91
|
+
expect(subject.filter).to eq_as_yaml([])
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
describe "#perform_filtering" do
|
|
96
|
+
it "should abort with a warning" do
|
|
97
|
+
expect { subject.perform_filtering([]) }.to raise_error(::ArgumentError)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
describe "#process_results" do
|
|
102
|
+
it "should abort with a warning" do
|
|
103
|
+
expect { subject.process_results([]) }.to raise_error(::ArgumentError)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
describe "#add_feedback_item" do
|
|
108
|
+
before(:each) do
|
|
109
|
+
subject.add_feedback_item("ITEM 1")
|
|
110
|
+
subject.add_feedback_item("ITEM 2")
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it "should append to the internal items list" do
|
|
114
|
+
expect(subject.instance_variable_get(:@feedback_items)).to eq(["ITEM 1", "ITEM 2"])
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
describe "#output_feedback" do
|
|
119
|
+
describe "when not in debug" do
|
|
120
|
+
before(:each) do
|
|
121
|
+
subject.add_feedback_item({title: "TITLE 1", subtitle: "SUBTITLE 1", icon: "ICON 1", first: "FIRST", second: "SECOND", third: "THIRD"})
|
|
122
|
+
subject.add_feedback_item({title: "TITLE 2", subtitle: "SUBTITLE 2", icon: "ICON 2", fourth: "FOURTH", fifth: "FIFTH", sixth: "SIXTH"})
|
|
123
|
+
allow(subject).to receive(:format).and_return(:xml)
|
|
124
|
+
allow(subject).to receive(:debug_mode).and_return(nil)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it "should return items as XML" do
|
|
128
|
+
expect(subject.output_feedback.gsub(/\s/, "")).to eq(reference_xml.gsub(/\s/, ""))
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
describe "when in debug" do
|
|
133
|
+
before(:each) do
|
|
134
|
+
subject.add_feedback_item("ITEM 1")
|
|
135
|
+
subject.add_feedback_item("ITEM 2")
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
it "should return items as YAML" do
|
|
139
|
+
expect(subject.output_feedback).to eq_as_yaml(["ITEM 1", "ITEM 2"])
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
describe "#round_float" do
|
|
145
|
+
it "should round a float to a certain precision" do
|
|
146
|
+
expect(subject.round_float(1)).to eq(1.000)
|
|
147
|
+
expect(subject.round_float(123.4567)).to eq(123.457)
|
|
148
|
+
expect(subject.round_float(123.456781, 5)).to eq(123.45678)
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
describe "#format_float" do
|
|
153
|
+
it "should format a float to a certain precision" do
|
|
154
|
+
expect(subject.format_float(1)).to eq("1")
|
|
155
|
+
expect(subject.format_float(123.45, 5)).to eq("123.45")
|
|
156
|
+
expect(subject.format_float(123.4567)).to eq("123.457")
|
|
157
|
+
expect(subject.format_float(123.456781, 5)).to eq("123.45678")
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
describe "#execute_command" do
|
|
162
|
+
it "should return the output of a command" do
|
|
163
|
+
expect(subject.send(:execute_command, "date", "+%s")).to match(/\d+/)
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# This file is part of the pincerna gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
|
|
4
|
+
# Licensed under the MIT license, which can be found at https://choosealicense.com/licenses/mit.
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
require "spec_helper"
|
|
8
|
+
|
|
9
|
+
describe Pincerna::Bookmark do
|
|
10
|
+
subject { Pincerna::Bookmark.new("QUERY", "yml") }
|
|
11
|
+
|
|
12
|
+
describe "#perform_filtering" do
|
|
13
|
+
before(:each) do
|
|
14
|
+
cache = Object.new
|
|
15
|
+
allow(cache).to receive(:use).and_yield
|
|
16
|
+
allow(Pincerna::Cache).to receive(:instance).and_return(cache)
|
|
17
|
+
|
|
18
|
+
allow(subject).to receive(:read_bookmarks) {
|
|
19
|
+
subject.instance_variable_set(:@bookmarks, [
|
|
20
|
+
{name: "NAME 1", url: "URL 1", path: " \u2192 Barra dei Preferiti \u2192 FOLDER 1 \u2192 FOLDER 2"},
|
|
21
|
+
{name: "2", url: "2", path: " \u2192 Barra dei Preferiti \u2192 FOLDER 1 \u2192 FOLDER 2"},
|
|
22
|
+
{name: "NAME 3", url: "URL 3", path: " \u2192 Barra dei Preferiti \u2192 FOLDER 1"},
|
|
23
|
+
{name: "NAME 3", url: "URL 3", path: " \u2192 Altri Preferiti"}
|
|
24
|
+
])
|
|
25
|
+
}
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "should call #read_bookmarks" do
|
|
29
|
+
expect(subject).to receive(:read_bookmarks)
|
|
30
|
+
subject.perform_filtering("1")
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "should filter by query and sort correctly" do
|
|
34
|
+
expect(subject.perform_filtering("")).to eq([
|
|
35
|
+
{name: "2", url: "2", path: " \u2192 Barra dei Preferiti \u2192 FOLDER 1 \u2192 FOLDER 2"},
|
|
36
|
+
{name: "NAME 1", url: "URL 1", path: " \u2192 Barra dei Preferiti \u2192 FOLDER 1 \u2192 FOLDER 2"},
|
|
37
|
+
{name: "NAME 3", url: "URL 3", path: " \u2192 Altri Preferiti"},
|
|
38
|
+
{name: "NAME 3", url: "URL 3", path: " \u2192 Barra dei Preferiti \u2192 FOLDER 1"}
|
|
39
|
+
])
|
|
40
|
+
|
|
41
|
+
expect(subject.perform_filtering("NAME")).to eq([
|
|
42
|
+
{name: "NAME 1", url: "URL 1", path: " \u2192 Barra dei Preferiti \u2192 FOLDER 1 \u2192 FOLDER 2"},
|
|
43
|
+
{name: "NAME 3", url: "URL 3", path: " \u2192 Altri Preferiti"},
|
|
44
|
+
{name: "NAME 3", url: "URL 3", path: " \u2192 Barra dei Preferiti \u2192 FOLDER 1"}
|
|
45
|
+
])
|
|
46
|
+
|
|
47
|
+
expect(subject.perform_filtering("2")).to eq([{name: "2", url: "2", path: " \u2192 Barra dei Preferiti \u2192 FOLDER 1 \u2192 FOLDER 2"}])
|
|
48
|
+
|
|
49
|
+
expect(subject.perform_filtering("3")).to eq([])
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
describe "#read_bookmarks" do
|
|
54
|
+
it "should abort with a warning" do
|
|
55
|
+
expect { subject.read_bookmarks }.to raise_error(::ArgumentError)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
describe "#process_results" do
|
|
60
|
+
it "should correctly prepare results" do
|
|
61
|
+
expect(subject.process_results([{name: "TITLE", url: "URL"}])).to eq([{title: "TITLE", arg: "URL", subtitle: "Action this item to open the URL in the browser ...", icon: Pincerna::Bookmark::ICON}])
|
|
62
|
+
expect(subject.process_results([{name: "TITLE", url: "URL", path: "PATH"}])).to eq([{title: "TITLE", arg: "URL", subtitle: "PATH", icon: Pincerna::Bookmark::ICON}])
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# This file is part of the pincerna gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
|
|
4
|
+
# Licensed under the MIT license, which can be found at https://choosealicense.com/licenses/mit.
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
require "spec_helper"
|
|
8
|
+
|
|
9
|
+
describe Pincerna::Cache do
|
|
10
|
+
before(:each) do
|
|
11
|
+
Pincerna::Cache.instance_variable_set(:@instance, nil)
|
|
12
|
+
stub_const("Pincerna::Cache::FILE", "/tmp/pincerna-cache.db")
|
|
13
|
+
allow_any_instance_of(EventMachine::PeriodicTimer).to receive(:schedule)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
after(:each) do
|
|
17
|
+
Pincerna::Cache.instance.destroy
|
|
18
|
+
FileUtils.rm_f(Pincerna::Cache::FILE)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
describe ".instance" do
|
|
22
|
+
it "should return the instance" do
|
|
23
|
+
expect(Pincerna::Cache).to receive(:new).once.and_call_original
|
|
24
|
+
instance = Pincerna::Cache.instance
|
|
25
|
+
expect(instance).to be_a(Pincerna::Cache)
|
|
26
|
+
expect(instance).to be(Pincerna::Cache.instance)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe "#initialize" do
|
|
31
|
+
it "should initialize variables" do
|
|
32
|
+
expect(Pincerna::Cache.instance.instance_variable_get(:@flusher)).to be_a(EventMachine::PeriodicTimer)
|
|
33
|
+
expect(Pincerna::Cache.instance.instance_variable_get(:@data)).to be_a(Daybreak::DB)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe "#use" do
|
|
38
|
+
before(:each) do
|
|
39
|
+
allow(Time).to receive(:now).and_return(1000)
|
|
40
|
+
@control = ""
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "should read data from the store and not call the block, if present" do
|
|
44
|
+
Pincerna::Cache.instance.data["KEY"] = {expiration: Time.now.to_f + 1800, data: "1"}
|
|
45
|
+
expect(Pincerna::Cache.instance.use("KEY", 1800) { @control = "2" }).to eq("1")
|
|
46
|
+
expect(@control).to eq("")
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should fetch new data if nothing is in cache, then save it back" do
|
|
50
|
+
Pincerna::Cache.instance.data["KEY"] = nil
|
|
51
|
+
expect(Pincerna::Cache.instance.use("KEY", 1800) { @control = "2" }).to eq("2")
|
|
52
|
+
expect(Pincerna::Cache.instance.data["KEY"]).to eq({data: "2", expiration: 2800})
|
|
53
|
+
expect(@control).to eq("2")
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "should fetch new data if the old one expired" do
|
|
57
|
+
Pincerna::Cache.instance.data["KEY"] = {expiration: 800, data: "1"}
|
|
58
|
+
expect(Pincerna::Cache.instance.use("KEY", 1800) { @control = "2" }).to eq("2")
|
|
59
|
+
expect(Pincerna::Cache.instance.data["KEY"]).to eq({data: "2", expiration: 2800})
|
|
60
|
+
expect(@control).to eq("2")
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
describe "#destroy" do
|
|
65
|
+
before(:each) do
|
|
66
|
+
flusher = Pincerna::Cache.instance.instance_variable_get(:@flusher)
|
|
67
|
+
data = Pincerna::Cache.instance.instance_variable_get(:@data)
|
|
68
|
+
expect(flusher).to receive(:cancel).twice
|
|
69
|
+
expect(data).to receive(:close).twice.and_call_original
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it "should cancel the flusher and close the data" do
|
|
73
|
+
Pincerna::Cache.instance.destroy
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
describe "#flush" do
|
|
78
|
+
before(:each) do
|
|
79
|
+
data = Pincerna::Cache.instance.instance_variable_get(:@data)
|
|
80
|
+
expect(data).to receive(:flush)
|
|
81
|
+
expect(data).to receive(:compact)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "should flush and compact data" do
|
|
85
|
+
Pincerna::Cache.instance.flush
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# This file is part of the pincerna gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
|
|
4
|
+
# Licensed under the MIT license, which can be found at https://choosealicense.com/licenses/mit.
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
require "spec_helper"
|
|
8
|
+
|
|
9
|
+
describe Pincerna::ChromeBookmark do
|
|
10
|
+
subject { Pincerna::ChromeBookmark.new("QUERY", "yml") }
|
|
11
|
+
|
|
12
|
+
describe "#Chrome_bookmarks" do
|
|
13
|
+
before(:each) do
|
|
14
|
+
@json = <<EOJSON
|
|
15
|
+
{
|
|
16
|
+
"checksum": "",
|
|
17
|
+
"roots": {
|
|
18
|
+
"bookmark_bar": {
|
|
19
|
+
"children": [
|
|
20
|
+
{
|
|
21
|
+
"children": [
|
|
22
|
+
{
|
|
23
|
+
"children": [
|
|
24
|
+
{
|
|
25
|
+
"date_added": "13018920348983801",
|
|
26
|
+
"id": "1145",
|
|
27
|
+
"name": "NAME 1",
|
|
28
|
+
"type": "url",
|
|
29
|
+
"url": "URL 1"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"date_added": "13018920348983801",
|
|
33
|
+
"id": "1145",
|
|
34
|
+
"name": "NAME 2",
|
|
35
|
+
"type": "url",
|
|
36
|
+
"url": "URL 2"
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"date_added": "13018920348874387",
|
|
40
|
+
"date_modified": "13018920348996854",
|
|
41
|
+
"id": "1087",
|
|
42
|
+
"name": "FOLDER 2",
|
|
43
|
+
"type": "folder"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"date_added": "13018920348983801",
|
|
47
|
+
"id": "1145",
|
|
48
|
+
"name": "NAME 3",
|
|
49
|
+
"type": "url",
|
|
50
|
+
"url": "URL 3"
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
"date_added": "13018920348873174",
|
|
54
|
+
"date_modified": "13018920348989347",
|
|
55
|
+
"id": "1086",
|
|
56
|
+
"name": "FOLDER 1",
|
|
57
|
+
"type": "folder"
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
"date_added": "12980910274469592",
|
|
61
|
+
"date_modified": "13005935882687426",
|
|
62
|
+
"id": "1",
|
|
63
|
+
"name": "Barra dei Preferiti",
|
|
64
|
+
"type": "folder"
|
|
65
|
+
},
|
|
66
|
+
"other": {
|
|
67
|
+
"children": [
|
|
68
|
+
{
|
|
69
|
+
"date_added": "13018920348983801",
|
|
70
|
+
"id": "1145",
|
|
71
|
+
"name": "NAME 4",
|
|
72
|
+
"type": "url",
|
|
73
|
+
"url": "URL 4"
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
"date_added": "12980910274469613",
|
|
77
|
+
"date_modified": "13020577556062605",
|
|
78
|
+
"id": "2",
|
|
79
|
+
"name": "Altri Preferiti",
|
|
80
|
+
"type": "folder"
|
|
81
|
+
},
|
|
82
|
+
"synced": {
|
|
83
|
+
"children": [ ],
|
|
84
|
+
"date_added": "12980910274469615",
|
|
85
|
+
"date_modified": "0",
|
|
86
|
+
"id": "3",
|
|
87
|
+
"name": "Preferiti su disp. mobili",
|
|
88
|
+
"type": "folder"
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
"version": 1
|
|
92
|
+
}
|
|
93
|
+
EOJSON
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it "should read the JSON file to get latest bookmarks" do
|
|
97
|
+
expect(File).to receive(:read).with(File.expand_path("~/Library/Application Support/Google/Chrome/Default/Bookmarks")).and_return("{}")
|
|
98
|
+
expect(Oj).to receive(:load).with("{}").and_return({"roots" => {}})
|
|
99
|
+
subject.read_bookmarks
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "should return the correct list of bookmarks" do
|
|
103
|
+
expect(subject.instance_variable_set(:@bookmarks, []))
|
|
104
|
+
expect(File).to receive(:read).and_return(@json)
|
|
105
|
+
subject.read_bookmarks
|
|
106
|
+
expect(subject.instance_variable_get(:@bookmarks)).to eq([
|
|
107
|
+
{name: "NAME 1", url: "URL 1", path: " \u2192 Barra dei Preferiti \u2192 FOLDER 1 \u2192 FOLDER 2"},
|
|
108
|
+
{name: "NAME 2", url: "URL 2", path: " \u2192 Barra dei Preferiti \u2192 FOLDER 1 \u2192 FOLDER 2"},
|
|
109
|
+
{name: "NAME 3", url: "URL 3", path: " \u2192 Barra dei Preferiti \u2192 FOLDER 1"},
|
|
110
|
+
{name: "NAME 4", url: "URL 4", path: " \u2192 Altri Preferiti"}
|
|
111
|
+
])
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|