diff options
-rw-r--r-- | dashing.gemspec | 4 | ||||
-rw-r--r-- | lib/dashing.rb | 24 | ||||
-rw-r--r-- | templates/project/Gemfile | 5 | ||||
-rw-r--r-- | templates/project/jobs/twitter.rb | 31 | ||||
-rw-r--r-- | test/app_test.rb | 39 |
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 |