summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dashing.gemspec4
-rw-r--r--lib/dashing.rb24
-rw-r--r--templates/project/Gemfile5
-rw-r--r--templates/project/jobs/twitter.rb31
-rw-r--r--test/app_test.rb39
5 files changed, 81 insertions, 22 deletions
diff --git a/dashing.gemspec b/dashing.gemspec
index 49d89da..56de14f 100644
--- a/dashing.gemspec
+++ b/dashing.gemspec
@@ -2,8 +2,8 @@
Gem::Specification.new do |s|
s.name = 'dashing'
- s.version = '1.0.5'
- s.date = '2013-05-09'
+ s.version = '1.0.7'
+ s.date = '2013-06-21'
s.executables << 'dashing'
diff --git a/lib/dashing.rb b/lib/dashing.rb
index 63fdc37..24b191c 100644
--- a/lib/dashing.rb
+++ b/lib/dashing.rb
@@ -65,17 +65,20 @@ end
get '/:dashboard' do
protected!
- if File.exist? File.join(settings.views, "#{params[:dashboard]}.erb")
- erb params[:dashboard].to_sym
- else
- halt 404
+ tilt_html_engines.each do |suffix, _|
+ file = File.join(settings.views, "#{params[:dashboard]}.#{suffix}")
+ return render(suffix.to_sym, params[:dashboard].to_sym) if File.exist? file
end
+
+ halt 404
end
get '/views/:widget?.html' do
protected!
- widget = params[:widget]
- send_file File.join(settings.root, 'widgets', widget, "#{widget}.html")
+ tilt_html_engines.each do |suffix, engines|
+ file = File.join(settings.root, "widgets", params[:widget], "#{params[:widget]}.#{suffix}")
+ return engines.first.new(file).render if File.exist? file
+ end
end
post '/widgets/:id' do
@@ -122,11 +125,18 @@ def latest_events
end
def first_dashboard
- files = Dir[File.join(settings.views, '*.erb')].collect { |f| f.match(/(\w*).erb/)[1] }
+ files = Dir[File.join(settings.views, '*')].collect { |f| File.basename(f, '.*') }
files -= ['layout']
files.first
end
+def tilt_html_engines
+ Tilt.mappings.select do |_, engines|
+ default_mime_type = engines.first.default_mime_type
+ default_mime_type.nil? || default_mime_type == 'text/html'
+ end
+end
+
Dir[File.join(settings.root, 'lib', '**', '*.rb')].each {|file| require file }
{}.to_json # Forces your json codec to initialize (in the event that it is lazily loaded). Does this before job threads start.
diff --git a/templates/project/Gemfile b/templates/project/Gemfile
index 8f1b17a..e6ccd84 100644
--- a/templates/project/Gemfile
+++ b/templates/project/Gemfile
@@ -1,3 +1,6 @@
source 'https://rubygems.org'
-gem 'dashing' \ No newline at end of file
+gem 'dashing'
+
+## Remove this if you don't need a twitter widget.
+gem 'twitter' \ No newline at end of file
diff --git a/templates/project/jobs/twitter.rb b/templates/project/jobs/twitter.rb
index 9359a89..5e70f30 100644
--- a/templates/project/jobs/twitter.rb
+++ b/templates/project/jobs/twitter.rb
@@ -1,17 +1,28 @@
-require 'net/http'
-require 'json'
+require 'twitter'
+
+
+#### Get your twitter keys & secrets:
+#### https://dev.twitter.com/docs/auth/tokens-devtwittercom
+Twitter.configure do |config|
+ config.consumer_key = 'YOUR_CONSUMER_KEY'
+ config.consumer_secret = 'YOUR_CONSUMER_SECRET'
+ config.oauth_token = 'YOUR_OAUTH_TOKEN'
+ config.oauth_token_secret = 'YOUR_OAUTH_SECRET'
+end
search_term = URI::encode('#todayilearned')
SCHEDULER.every '10m', :first_in => 0 do |job|
- http = Net::HTTP.new('search.twitter.com')
- response = http.request(Net::HTTP::Get.new("/search.json?q=#{search_term}"))
- tweets = JSON.parse(response.body)["results"]
- if tweets
- tweets.map! do |tweet|
- { name: tweet['from_user'], body: tweet['text'], avatar: tweet['profile_image_url_https'] }
+ begin
+ tweets = Twitter.search("#{search_term}").results
+
+ if tweets
+ tweets.map! do |tweet|
+ { name: tweet.user.name, body: tweet.text, avatar: tweet.user.profile_image_url_https }
+ end
+ send_event('twitter_mentions', comments: tweets)
end
-
- send_event('twitter_mentions', comments: tweets)
+ rescue Twitter::Error
+ puts "\e[33mFor the twitter widget to work, you need to put in your twitter API keys in the jobs/twitter.rb file.\e[0m"
end
end \ No newline at end of file
diff --git a/test/app_test.rb b/test/app_test.rb
index f6fa537..97aad3a 100644
--- a/test/app_test.rb
+++ b/test/app_test.rb
@@ -58,14 +58,49 @@ class AppTest < Dashing::Test
end
end
+ def test_redirect_to_first_dashboard_without_erb
+ with_generated_project do |dir|
+ FileUtils.touch(File.join(dir, "dashboards/htmltest.html"))
+ get '/'
+ assert_equal 302, last_response.status
+ assert_equal 'http://example.org/htmltest', last_response.location
+ end
+ end
+
def test_get_dashboard
with_generated_project do
get '/sampletv'
assert_equal 200, last_response.status
assert_include last_response.body, 'class="gridster"'
+ assert_include last_response.body, "DOCTYPE"
end
end
-
+
+ begin
+ require 'haml'
+
+ def test_get_haml_dashboard
+ with_generated_project do |dir|
+ File.write(File.join(dir, 'dashboards/hamltest.haml'), '.gridster')
+ get '/hamltest'
+ assert_equal 200, last_response.status
+ assert_include last_response.body, "class='gridster'"
+ end
+ end
+
+ def test_get_haml_widget
+ with_generated_project do |dir|
+ File.write(File.join(dir, 'widgets/clock/clock.haml'), '%h1 haml')
+ File.unlink(File.join(dir, 'widgets/clock/clock.html'))
+ get '/views/clock.html'
+ assert_equal 200, last_response.status
+ assert_include last_response.body, '<h1>haml</h1>'
+ end
+ end
+ rescue LoadError
+ puts "[skipping haml tests because haml isn't installed]"
+ end
+
def test_get_nonexistent_dashboard
with_generated_project do
get '/nodashboard'
@@ -88,7 +123,7 @@ class AppTest < Dashing::Test
Sinatra::Application.settings.views = File.join(dir, 'new_project/dashboards')
Sinatra::Application.settings.root = File.join(dir, 'new_project')
- yield
+ yield Sinatra::Application.settings.root
end
end