[alfred] Add Forecast workflow
change
commit 570c726cd9b138fd642caef9969252713c2e1278
author Alpha Chen <alpha.chen@gmail.com>
date
parent a1f3a335
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/2A5C0A87-204E-49EA-94A7-8E62BB4EFD8A.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/2A5C0A87-204E-49EA-94A7-8E62BB4EFD8A.png
new file mode 100644
index 00000000..3c02bab8
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/2A5C0A87-204E-49EA-94A7-8E62BB4EFD8A.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/CHANGELOG.md b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/CHANGELOG.md
new file mode 100644
index 00000000..a74c4fbc
--- /dev/null
+++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/CHANGELOG.md	
@@ -0,0 +1,28 @@
+## 0.0.5 - 2014.11.22
+### Changed
+- Use `forecast-config` for managing API keys.
+- Fixed bug when precipitation intensity/probability was all 0's.
+
+## 0.0.4 - 2014.11.21
+### Added
+- Sparklines for precipitation intensity and probability for the next hour
+  (where applicable) and day.
+
+### Changed
+- Bugfix for when `DEFAULT_LAT_LONG` is set and `DEFAULT_LOCATION` is not.
+
+## 0.0.3 - 2014.11.19
+### Added
+- Forecast now uses units appropriate to the location.
+
+### Changed
+- Fix `DEFAULT_LAT_LONG`.
+
+## 0.0.2 - 2014.11.19
+### Changed
+- Remove minutely result for non-US locations since Forecast doesn't have this
+  data.
+
+## 0.0.1 - 2014.11.18
+### Added
+- Initial release
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/README.md b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/README.md
new file mode 100644
index 00000000..0fef7b18
--- /dev/null
+++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/README.md	
@@ -0,0 +1,42 @@
+# Forecast Workflow for Alfred
+
+![screenshot][screenshot]
+
+[screenshot]: http://i.imgur.com/mxGnovo.png
+
+# Requirements
+
+- [Alfred](http://www.alfredapp.com/)
+- [Alfred Powerpack](http://www.alfredapp.com/powerpack/)
+- OS X Mavericks
+
+# Installation
+
+Download and install the [workflow][download].
+
+[download]: https://github.com/kejadlen/forecast.alfredworkflow/releases/download/0.0.5/Forecast.alfredworkflow
+
+Run `forecast-config VALUE` to set API keys and the default location:
+
+- `FORECAST_API_KEY`: Get an API key [here][forecast-api-key].
+- `GOOGLE_API_KEY`: Get an API key [here][google-api-key]. (Used for geocoding.
+  If you never need to search for a location, this can be omitted by using
+  `DEFAULT_LAT_LONG`.)
+- `DEFAULT_LOCATION`: Ex. "Seattle, WA".
+- `DEFAULT_LAT_LONG`: Only required if `GOOGLE_API_KEY` is unavailable, since
+  `DEFAULT_LOCATION` can't be geocoded. Format: `lat,long`.
+
+[forecast-api-key]: https://developer.forecast.io/register
+[google-api-key]: https://developers.google.com/maps/documentation/geocoding/#api_key
+
+# TODO
+
+- Handle errors gracefully
+- Caching? (Probably unnecessary...)
+- Use `Accept-Encoding: gzip` for Forecast calls
+
+# Attributions
+
+- [Climacons](http://adamwhitcroft.com/climacons/)
+- [Forecast API](https://developer.forecast.io/docs/v2)
+- [Google Geocoding API](https://developers.google.com/maps/documentation/geocoding/)
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/alfred.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/alfred.rb
new file mode 100644
index 00000000..67085f35
--- /dev/null
+++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/alfred.rb	
@@ -0,0 +1,89 @@
+require 'delegate'
+require 'erb'
+require 'yaml'
+
+class Items < DelegateClass(Array)
+  attr_reader :items
+
+  def initialize
+    @items = []
+    super(@items)
+  end
+
+  def to_s
+    ERB.new(<<-XML).result(binding)
+<?xml version="1.0"?>
+<items>
+  <%= items.map {|item| item.to_s.split("\n").map {|line| '  ' << line }}.join("\n").strip %>
+</items>
+    XML
+  end
+end
+
+class Item
+  attr_reader *%i[ uid arg valid
+                   title subtitle icon ]
+  def initialize(**kwargs)
+    @uid = kwargs.fetch(:uid).to_s.encode(xml: :attr)
+    @arg = kwargs[:arg].to_s.encode(xml: :attr)
+    @valid = kwargs.fetch(:valid, false) ? 'yes' : 'no'
+    @title = kwargs.fetch(:title).encode(xml: :text)
+    @subtitle = kwargs[:subtitle] && kwargs[:subtitle].encode(xml: :text)
+    @icon = kwargs[:icon] && kwargs[:icon].encode(xml: :text)
+  end
+
+  def to_s
+    ERB.new(<<-XML, nil, '%>').result(binding)
+<item arg=<%= arg %> uid=<%= uid %> valid="<%= valid %>">
+  <title><%= title %></title>
+% if subtitle
+  <subtitle><%= subtitle %></subtitle>
+% end
+% if icon
+  <icon><%= icon %></icon>
+% end
+</item>
+    XML
+  end
+end
+
+module Alfred
+  class Config
+    def self.[](key)
+      config[key]
+    end
+
+    def self.[]=(key, value)
+      config[key] = value
+    end
+
+    def self.config
+      return @config if defined?(@config)
+
+      bundle_id = `/usr/libexec/PlistBuddy info.plist -c 'print :bundleid'`.strip
+      @config = self.new(bundle_id)
+    end
+
+    WORKFLOW_DATA = '~/Library/Application Support/Alfred 2/Workflow Data/'
+
+    attr_reader :path
+    attr_accessor :config
+
+    def initialize(bundle_id)
+      dir = File.expand_path(File.join(WORKFLOW_DATA, bundle_id))
+      Dir.mkdir(dir) unless Dir.exist?(dir)
+
+      @path = File.join(dir, 'config.yml')
+      @config = File.exist?(@path) ? YAML.load_file(@path) : {}
+    end
+
+    def [](key)
+      config.fetch(key) { '' }
+    end
+
+    def []=(key, value)
+      config[key] = value
+      File.write(path, YAML.dump(config))
+    end
+  end
+end
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/forecast-config.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/forecast-config.rb
new file mode 100644
index 00000000..df614174
--- /dev/null
+++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/forecast-config.rb	
@@ -0,0 +1,26 @@
+require_relative 'alfred'
+
+OPTIONS = %w[ FORECAST_API_KEY
+              GOOGLE_API_KEY
+              DEFAULT_LOCATION
+              DEFAULT_LAT_LONG ]
+
+input = ARGV.shift || ''
+
+items = Items.new
+OPTIONS.each do |option|
+  title = if input.empty?
+            "Unset #{option}"
+          else
+            "Set #{option} to #{input}"
+          end
+  items << Item.new(
+    uid: option,
+    arg: "Alfred::Config['#{option}'] = '#{input}'",
+    valid: true,
+    title: title,
+    subtitle: Alfred::Config[option],
+  )
+end
+
+puts items.to_s
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/forecast.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/forecast.rb
new file mode 100644
index 00000000..dd24d3e2
--- /dev/null
+++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/forecast.rb	
@@ -0,0 +1,138 @@
+require 'delegate'
+require 'erb'
+require 'yaml'
+
+require_relative 'alfred'
+require_relative 'forecaster'
+require_relative 'location'
+require_relative 'spark'
+
+ICONS = {
+  'clear-day' => 'Sun',
+  'clear-night' => 'Moon',
+  'rain' => 'Cloud-Rain',
+  'snow' => 'Cloud-Snow',
+  'sleet' => 'Cloud-Snow-Alt',
+  'wind' => 'Wind',
+  'fog' => 'Cloud-Fog',
+  'cloudy' => 'Cloud',
+  'partly-cloudy-day' => 'Cloud-Sun',
+  'partly-cloudy-night' => 'Cloud-Moon',
+}
+
+Precipitation = Struct.new(:intensity, :probability) do
+  def self.from_forecast(forecast)
+    self.new(*forecast.values_at('precipIntensity', 'precipProbability'))
+  end
+
+  def human_intensity
+    case intensity
+    when 0...0.002
+      'no'
+    when 0.002...0.017
+      'very light'
+    when 0.017...0.1
+      'light'
+    when 0.1...0.4
+      'moderate'
+    else
+      'heavy'
+    end
+  end
+
+  def to_s
+    "#{(probability*100).to_i}% chance of #{human_intensity} rain."
+  end
+end
+
+query = ARGV.shift || ''
+location = if query.empty?
+             lat, long = Alfred::Config['DEFAULT_LAT_LONG'].split(?,).map(&:to_f)
+             Location.new(Alfred::Config['DEFAULT_LOCATION'], lat, long)
+           else
+             Location.new(query)
+           end
+forecast = Forecaster.forecast(location)
+
+items = Items.new
+
+items << Item.new(
+  uid: :location,
+  arg: "#{location.lat.round(4)},#{location.long.round(4)}",
+  valid: true,
+  title: location.name,
+  icon: 'icons/forecast.ico',
+)
+
+currently = forecast['currently']
+precip = Precipitation.from_forecast(currently)
+subtitle = [ "#{currently['temperature'].round}°" ]
+subtitle << "Feels like #{currently['apparentTemperature'].round}°"
+subtitle << precip.to_s if precip.probability > 0
+items << Item.new(
+  uid: :currently,
+  title: currently['summary'],
+  subtitle: subtitle.join(' · '),
+  icon: "icons/#{ICONS[currently['icon']]}.png",
+)
+
+minutely = forecast['minutely']
+if minutely
+  intensity = minutely['data'].map {|m| 1000 * m['precipIntensity'] }
+  intensity = intensity.select.with_index {|_,i| i % 5 == 0 }
+  min, max = intensity.minmax
+
+  subtitle = ["#{min.round}\" #{Spark.new(intensity)} #{max.round}\""]
+
+  probability = minutely['data'].map {|m| (100 * m['precipProbability']).round }
+  probability = probability.select.with_index {|_,i| i % 5 == 0 }
+  min, max = probability.minmax
+
+  subtitle << "#{min}% #{Spark.new(probability, max: 100)} #{max}%"
+
+  items << Item.new(
+    uid: :minutely,
+    title: minutely['summary'],
+    subtitle: subtitle.join(' · '),
+    icon: "icons/#{ICONS[minutely['icon']]}.png",
+  )
+end
+
+hourly = forecast['hourly']
+
+intensity = hourly['data'].map {|m| 1000 * m['precipIntensity'] }
+intensity = intensity.select.with_index {|_,i| i % 4 == 0 }
+min, max = intensity.minmax
+
+subtitle = ["#{min.round}\" #{Spark.new(intensity)} #{max.round}\""]
+
+probability = hourly['data'].map {|m| (100 * m['precipProbability']).round }
+probability = probability.select.with_index {|_,i| i % 4 == 0 }
+min, max = probability.minmax
+
+subtitle << "#{min}% #{Spark.new(probability, max: 100)} #{max}%"
+
+items << Item.new(
+  uid: :hourly,
+  title: hourly['summary'],
+  subtitle: subtitle.join(' · '),
+  icon: "icons/#{ICONS[hourly['icon']]}.png",
+)
+
+forecast['daily']['data'][1..6].each do |data|
+  wday = Time.at(data['time']).strftime('%A')
+  precip = Precipitation.from_forecast(data)
+
+  subtitle = [ "Low: #{data['apparentTemperatureMin'].round}°",
+               "High: #{data['apparentTemperatureMax'].round}°" ]
+  subtitle << precip.to_s if precip.probability > 0
+
+  items << Item.new(
+    uid: wday,
+    title: "#{wday} - #{data['summary']}",
+    subtitle: subtitle.join(' · '),
+    icon: "icons/#{ICONS[data['icon']]}.png",
+  )
+end
+
+puts items.to_s
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/forecaster.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/forecaster.rb
new file mode 100644
index 00000000..7379bd3a
--- /dev/null
+++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/forecaster.rb	
@@ -0,0 +1,23 @@
+require 'json'
+require 'open-uri'
+
+require_relative 'alfred'
+
+Forecaster = Struct.new(:api_key) do
+  def self.forecast(location)
+    forecaster.forecast(location)
+  end
+
+  def self.forecaster
+    return @forecaster if defined?(@forecaster)
+
+    @forecaster = self.new(Alfred::Config['FORECAST_API_KEY'])
+  end
+
+  def forecast(location)
+    lat, long = location.lat, location.long
+    url = "https://api.forecast.io/forecast/#{api_key}/#{lat},#{long}?units=auto"
+    response = JSON.load(open(url))
+  end
+end
+
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/geocoder.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/geocoder.rb
new file mode 100644
index 00000000..e397a8e2
--- /dev/null
+++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/geocoder.rb	
@@ -0,0 +1,30 @@
+require 'json'
+require 'open-uri'
+require 'uri'
+
+require_relative 'alfred'
+
+Geocoder = Struct.new(:api_key) do
+  def self.geocode(location)
+    geocoder.geocode(location)
+  end
+
+  def self.geocoder
+    return @geocoder if defined?(@geocoder)
+
+    @geocoder = self.new(Alfred::Config['GOOGLE_API_KEY'])
+  end
+
+  def geocode(location)
+    url = 'https://maps.googleapis.com/maps/api/geocode/json'
+    query = URI.encode_www_form(address: location, api_key: api_key)
+    response = JSON.load(open("#{url}?#{query}"))
+    result = response['results'][0]
+
+    name = result['formatted_address']
+    location = result['geometry']['location']
+    lat, long = location.values_at('lat', 'lng')
+
+    [name, lat, long]
+  end
+end
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icon.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icon.png
new file mode 100644
index 00000000..1d96821d
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icon.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Download.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Download.png
new file mode 100644
index 00000000..4187ce2b
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Download.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Drizzle-Alt.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Drizzle-Alt.png
new file mode 100644
index 00000000..31f4e8d4
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Drizzle-Alt.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Drizzle-Moon-Alt.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Drizzle-Moon-Alt.png
new file mode 100644
index 00000000..d51e6358
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Drizzle-Moon-Alt.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Drizzle-Moon.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Drizzle-Moon.png
new file mode 100644
index 00000000..079ae740
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Drizzle-Moon.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Drizzle-Sun-Alt.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Drizzle-Sun-Alt.png
new file mode 100644
index 00000000..f40345e5
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Drizzle-Sun-Alt.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Drizzle-Sun.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Drizzle-Sun.png
new file mode 100644
index 00000000..bc475f41
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Drizzle-Sun.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Drizzle.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Drizzle.png
new file mode 100644
index 00000000..eadc3e3a
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Drizzle.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Fog-Alt.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Fog-Alt.png
new file mode 100644
index 00000000..24e2d6f6
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Fog-Alt.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Fog-Moon-Alt.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Fog-Moon-Alt.png
new file mode 100644
index 00000000..1359eee6
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Fog-Moon-Alt.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Fog-Moon.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Fog-Moon.png
new file mode 100644
index 00000000..bf148f9b
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Fog-Moon.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Fog-Sun-Alt.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Fog-Sun-Alt.png
new file mode 100644
index 00000000..5179981c
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Fog-Sun-Alt.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Fog-Sun.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Fog-Sun.png
new file mode 100644
index 00000000..cbc7e7f7
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Fog-Sun.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Fog.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Fog.png
new file mode 100644
index 00000000..b02b45e6
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Fog.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Hail-Alt.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Hail-Alt.png
new file mode 100644
index 00000000..76cd34e6
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Hail-Alt.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Hail-Moon-Alt.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Hail-Moon-Alt.png
new file mode 100644
index 00000000..5671d7c1
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Hail-Moon-Alt.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Hail-Moon.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Hail-Moon.png
new file mode 100644
index 00000000..23b98d16
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Hail-Moon.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Hail-Sun-Alt.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Hail-Sun-Alt.png
new file mode 100644
index 00000000..4704ebd8
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Hail-Sun-Alt.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Hail-Sun.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Hail-Sun.png
new file mode 100644
index 00000000..66d052be
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Hail-Sun.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Hail.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Hail.png
new file mode 100644
index 00000000..9d033103
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Hail.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Lightning-Moon.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Lightning-Moon.png
new file mode 100644
index 00000000..f02c1826
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Lightning-Moon.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Lightning-Sun.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Lightning-Sun.png
new file mode 100644
index 00000000..9768843c
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Lightning-Sun.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Lightning.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Lightning.png
new file mode 100644
index 00000000..01a3725c
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Lightning.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Moon.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Moon.png
new file mode 100644
index 00000000..78fd6574
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Moon.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Rain-Alt.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Rain-Alt.png
new file mode 100644
index 00000000..e0ae91ea
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Rain-Alt.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Rain-Moon-Alt.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Rain-Moon-Alt.png
new file mode 100644
index 00000000..3dee6960
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Rain-Moon-Alt.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Rain-Moon.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Rain-Moon.png
new file mode 100644
index 00000000..752b3096
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Rain-Moon.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Rain-Sun-Alt.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Rain-Sun-Alt.png
new file mode 100644
index 00000000..3d394c60
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Rain-Sun-Alt.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Rain-Sun.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Rain-Sun.png
new file mode 100644
index 00000000..874b6f27
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Rain-Sun.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Rain.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Rain.png
new file mode 100644
index 00000000..ac81b607
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Rain.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Refresh.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Refresh.png
new file mode 100644
index 00000000..8131b786
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Refresh.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Snow-Alt.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Snow-Alt.png
new file mode 100644
index 00000000..397934cc
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Snow-Alt.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Snow-Moon-Alt.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Snow-Moon-Alt.png
new file mode 100644
index 00000000..0c984677
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Snow-Moon-Alt.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Snow-Moon.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Snow-Moon.png
new file mode 100644
index 00000000..06270393
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Snow-Moon.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Snow-Sun-Alt.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Snow-Sun-Alt.png
new file mode 100644
index 00000000..11468ea9
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Snow-Sun-Alt.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Snow-Sun.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Snow-Sun.png
new file mode 100644
index 00000000..1aad15dd
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Snow-Sun.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Snow.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Snow.png
new file mode 100644
index 00000000..dfc87311
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Snow.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Sun.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Sun.png
new file mode 100644
index 00000000..09e754c8
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Sun.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Upload.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Upload.png
new file mode 100644
index 00000000..8f88ab39
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Upload.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Wind-Moon.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Wind-Moon.png
new file mode 100644
index 00000000..b837e387
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Wind-Moon.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Wind-Sun.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Wind-Sun.png
new file mode 100644
index 00000000..cc0b3e6b
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Wind-Sun.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Wind.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Wind.png
new file mode 100644
index 00000000..929b81a2
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud-Wind.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud.png
new file mode 100644
index 00000000..9419d36c
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Cloud.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Compass-East.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Compass-East.png
new file mode 100644
index 00000000..6468a60a
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Compass-East.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Compass-North.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Compass-North.png
new file mode 100644
index 00000000..417066e4
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Compass-North.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Compass-South.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Compass-South.png
new file mode 100644
index 00000000..f5a7484f
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Compass-South.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Compass-West.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Compass-West.png
new file mode 100644
index 00000000..22d9eac8
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Compass-West.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Compass.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Compass.png
new file mode 100644
index 00000000..12ffc338
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Compass.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Degrees-Celcius.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Degrees-Celcius.png
new file mode 100644
index 00000000..7e8e5932
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Degrees-Celcius.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Degrees-Fahrenheit.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Degrees-Fahrenheit.png
new file mode 100644
index 00000000..cfba4a55
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Degrees-Fahrenheit.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-First-Quarter.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-First-Quarter.png
new file mode 100644
index 00000000..eb5db644
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-First-Quarter.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-Full.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-Full.png
new file mode 100644
index 00000000..d59ab864
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-Full.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-Last-Quarter.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-Last-Quarter.png
new file mode 100644
index 00000000..04823cc8
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-Last-Quarter.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-New.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-New.png
new file mode 100644
index 00000000..1ac14ebc
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-New.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-Waning-Crescent.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-Waning-Crescent.png
new file mode 100644
index 00000000..46b4b4b6
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-Waning-Crescent.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-Waning-Gibbous.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-Waning-Gibbous.png
new file mode 100644
index 00000000..5916506c
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-Waning-Gibbous.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-Waxing-Crescent.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-Waxing-Crescent.png
new file mode 100644
index 00000000..8f029713
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-Waxing-Crescent.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-Waxing-Gibbous.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-Waxing-Gibbous.png
new file mode 100644
index 00000000..67daddb4
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon-Waxing-Gibbous.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon.png
new file mode 100644
index 00000000..8f55b3f2
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Moon.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Shades.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Shades.png
new file mode 100644
index 00000000..bf979e5a
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Shades.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Snowflake.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Snowflake.png
new file mode 100644
index 00000000..380f49dd
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Snowflake.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Sun-Low.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Sun-Low.png
new file mode 100644
index 00000000..2b3cd279
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Sun-Low.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Sun-Lower.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Sun-Lower.png
new file mode 100644
index 00000000..4696a7b6
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Sun-Lower.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Sun.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Sun.png
new file mode 100644
index 00000000..b7fbb7d1
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Sun.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Sunrise.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Sunrise.png
new file mode 100644
index 00000000..bbb7e274
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Sunrise.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Sunset.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Sunset.png
new file mode 100644
index 00000000..4919d595
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Sunset.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Thermometer-100.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Thermometer-100.png
new file mode 100644
index 00000000..4ae95925
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Thermometer-100.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Thermometer-25.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Thermometer-25.png
new file mode 100644
index 00000000..43f16556
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Thermometer-25.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Thermometer-50.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Thermometer-50.png
new file mode 100644
index 00000000..0ab9fadf
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Thermometer-50.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Thermometer-75.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Thermometer-75.png
new file mode 100644
index 00000000..3d81d8a0
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Thermometer-75.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Thermometer-Zero.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Thermometer-Zero.png
new file mode 100644
index 00000000..a0d446bb
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Thermometer-Zero.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Thermometer.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Thermometer.png
new file mode 100644
index 00000000..580a9f3e
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Thermometer.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Tornado.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Tornado.png
new file mode 100644
index 00000000..b0d9a6a2
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Tornado.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Umbrella.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Umbrella.png
new file mode 100644
index 00000000..73d8666f
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Umbrella.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Wind.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Wind.png
new file mode 100644
index 00000000..e7bef73e
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/Wind.png differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/forecast.ico b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/forecast.ico
new file mode 100644
index 00000000..69040d44
Binary files /dev/null and b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/icons/forecast.ico differ
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/info.plist b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/info.plist
new file mode 100644
index 00000000..0813733d
--- /dev/null
+++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/info.plist	
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>bundleid</key>
+	<string>com.kejadlen.forecast</string>
+	<key>category</key>
+	<string>Internet</string>
+	<key>connections</key>
+	<dict>
+		<key>2A5C0A87-204E-49EA-94A7-8E62BB4EFD8A</key>
+		<array>
+			<dict>
+				<key>destinationuid</key>
+				<string>5E2D96BA-31B2-4800-9A2B-B999285680A0</string>
+				<key>modifiers</key>
+				<integer>0</integer>
+				<key>modifiersubtext</key>
+				<string></string>
+			</dict>
+		</array>
+		<key>450E8285-E286-4D33-AADF-1ACF99F41031</key>
+		<array>
+			<dict>
+				<key>destinationuid</key>
+				<string>373F7A50-59E2-4225-B665-E63FBBBAF7E5</string>
+				<key>modifiers</key>
+				<integer>0</integer>
+				<key>modifiersubtext</key>
+				<string></string>
+			</dict>
+		</array>
+	</dict>
+	<key>createdby</key>
+	<string>Alpha Chen</string>
+	<key>description</key>
+	<string></string>
+	<key>disabled</key>
+	<false/>
+	<key>name</key>
+	<string>Forecast</string>
+	<key>objects</key>
+	<array>
+		<dict>
+			<key>config</key>
+			<dict>
+				<key>plusspaces</key>
+				<false/>
+				<key>url</key>
+				<string>http://forecast.io/#/f/{query}</string>
+				<key>utf8</key>
+				<true/>
+			</dict>
+			<key>type</key>
+			<string>alfred.workflow.action.openurl</string>
+			<key>uid</key>
+			<string>5E2D96BA-31B2-4800-9A2B-B999285680A0</string>
+			<key>version</key>
+			<integer>0</integer>
+		</dict>
+		<dict>
+			<key>config</key>
+			<dict>
+				<key>argumenttype</key>
+				<integer>1</integer>
+				<key>escaping</key>
+				<integer>127</integer>
+				<key>keyword</key>
+				<string>forecast</string>
+				<key>runningsubtext</key>
+				<string>Retriving location/weather...</string>
+				<key>script</key>
+				<string>ruby forecast.rb {query}</string>
+				<key>title</key>
+				<string>Forecast</string>
+				<key>type</key>
+				<integer>0</integer>
+				<key>withspace</key>
+				<true/>
+			</dict>
+			<key>type</key>
+			<string>alfred.workflow.input.scriptfilter</string>
+			<key>uid</key>
+			<string>2A5C0A87-204E-49EA-94A7-8E62BB4EFD8A</string>
+			<key>version</key>
+			<integer>0</integer>
+		</dict>
+		<dict>
+			<key>config</key>
+			<dict>
+				<key>escaping</key>
+				<integer>0</integer>
+				<key>script</key>
+				<string>ruby -r./alfred -e "{query}"</string>
+				<key>type</key>
+				<integer>0</integer>
+			</dict>
+			<key>type</key>
+			<string>alfred.workflow.action.script</string>
+			<key>uid</key>
+			<string>373F7A50-59E2-4225-B665-E63FBBBAF7E5</string>
+			<key>version</key>
+			<integer>0</integer>
+		</dict>
+		<dict>
+			<key>config</key>
+			<dict>
+				<key>argumenttype</key>
+				<integer>1</integer>
+				<key>escaping</key>
+				<integer>127</integer>
+				<key>keyword</key>
+				<string>forecast-config</string>
+				<key>script</key>
+				<string>ruby forecast-config.rb {query}</string>
+				<key>title</key>
+				<string>Configure the Forecast workflow</string>
+				<key>type</key>
+				<integer>0</integer>
+				<key>withspace</key>
+				<true/>
+			</dict>
+			<key>type</key>
+			<string>alfred.workflow.input.scriptfilter</string>
+			<key>uid</key>
+			<string>450E8285-E286-4D33-AADF-1ACF99F41031</string>
+			<key>version</key>
+			<integer>0</integer>
+		</dict>
+	</array>
+	<key>readme</key>
+	<string></string>
+	<key>uidata</key>
+	<dict>
+		<key>2A5C0A87-204E-49EA-94A7-8E62BB4EFD8A</key>
+		<dict>
+			<key>ypos</key>
+			<real>10</real>
+		</dict>
+		<key>373F7A50-59E2-4225-B665-E63FBBBAF7E5</key>
+		<dict>
+			<key>ypos</key>
+			<real>130</real>
+		</dict>
+		<key>450E8285-E286-4D33-AADF-1ACF99F41031</key>
+		<dict>
+			<key>ypos</key>
+			<real>130</real>
+		</dict>
+		<key>5E2D96BA-31B2-4800-9A2B-B999285680A0</key>
+		<dict>
+			<key>ypos</key>
+			<real>10</real>
+		</dict>
+	</dict>
+	<key>webaddress</key>
+	<string>http://github.com/kejadlen/forecast.alfredworkflow</string>
+</dict>
+</plist>
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/location.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/location.rb
new file mode 100644
index 00000000..bbe7b2b4
--- /dev/null
+++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/location.rb	
@@ -0,0 +1,16 @@
+require_relative 'geocoder'
+
+class Location
+  attr_accessor :name, :lat, :long, :geocoder
+
+  def initialize(name, lat=nil, long=nil, geocoder=Geocoder)
+    @name, @lat, @long, @geocoder = name, lat, long, geocoder
+
+    geocode! unless lat && long
+  end
+
+  def geocode!
+    self.name, self.lat, self.long = geocoder.geocode(name)
+  end
+end
+
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/spark.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/spark.rb
new file mode 100644
index 00000000..b6bed93d
--- /dev/null
+++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/spark.rb	
@@ -0,0 +1,17 @@
+class Spark
+  # TICKS = %w[▁ ▂ ▃ ▄ ▅ ▆ ▇ █] # Alfred doesn't render the last bar correctly
+                                # for some reason...
+  TICKS = %w[▁ ▂ ▃ ▄ ▅ ▆ ▇]
+
+  attr_reader :data, :min, :max
+
+  def initialize(data, **kwargs)
+    @data = data.map(&:round)
+    @min = kwargs.fetch(:min) { 0 }
+    @max = [(kwargs.fetch(:max) { data.max }).to_f, 1.0].max
+  end
+
+  def to_s
+    data.map {|i| TICKS[(TICKS.size - 1) * (i - min) / max] }.join
+  end
+end
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/test_alfred.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/test_alfred.rb
new file mode 100644
index 00000000..ca519b01
--- /dev/null
+++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/test_alfred.rb	
@@ -0,0 +1,22 @@
+require 'minitest/autorun'
+
+require_relative 'alfred'
+
+class TestConfig < Minitest::Test
+  def setup
+    @config = Alfred::Config.new('com.kejadlen.test')
+  end
+
+  def teardown
+    File.delete(@config.path) if File.exist?(@config.path)
+  end
+
+  def test_config
+    assert_nil @config[:foo]
+
+    @config[:foo] = 123
+    assert_equal 123, @config[:foo]
+    assert File.exist?(@config.path)
+    assert_equal '{:foo=>123}', File.read(@config.path)
+  end
+end
diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/test_spark.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/test_spark.rb
new file mode 100644
index 00000000..9f992908
--- /dev/null
+++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.8694C3FC-8218-4B98-BB1F-F1CEC686477C/test_spark.rb	
@@ -0,0 +1,10 @@
+require 'minitest/autorun'
+
+require_relative 'spark'
+
+class TestSpark < Minitest::Test
+  def test_div_by_zero
+    spark = Spark.new([0, 0, 0])
+    assert_equal '▁▁▁', spark.to_s
+  end
+end