<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -37,7 +37,7 @@ namespace :feeds do
   desc 'Add a feed to the system (URL=http://blog.zerosum.org/)'
   task :add =&gt; :environment do
     raise &quot;ERROR: You must specify a valid feed URL!&quot; unless url = ENV['URL']
-    Feed.create(:url =&gt; url)
+    Feed.create(:url =&gt; url, :approved =&gt; true)
   end
 end
 
@@ -81,7 +81,7 @@ end
 namespace :gems do
   desc 'Install required gems'
   task :install do
-    required_gems = %w{ sinatra sr-sinatra-authorization dm-core dm-aggregates dm-validations dm-timestamps
+    required_gems = %w{ sinatra integrity-sinatra-authorization dm-core dm-aggregates dm-validations dm-timestamps
                         dm-is-searchable shanna-dm-sphinx-adapter dm-is-paginated merb-pagination haml jnunemaker-columbus
                         pauldix-feedzirra thoughtbot-factory_girl rack-test rspec rspec_hpricot_matchers }
     required_gems.each { |required_gem| system &quot;sudo gem install #{required_gem}&quot; }</diff>
      <filename>Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -30,7 +30,8 @@ end
   get action do 
     @pages, @entries = Entry.paginated(:order =&gt; [:published_at.desc], 
                                        :per_page =&gt; SiteConfig.per_page,
-                                       :page =&gt; (params[:page] || 1).to_i)
+                                       :page =&gt; (params[:page] || 1).to_i,
+                                       'feed.approved' =&gt; true)
     haml :main
   end
 end
@@ -39,7 +40,8 @@ end
 get '/feed' do
   content_type 'application/atom+xml', :charset =&gt; 'utf-8'
   @entries = Entry.all(:order =&gt; [:published_at.desc],
-                       :limit =&gt; SiteConfig.per_page)
+                       :limit =&gt; SiteConfig.per_page,
+                       'feed.approved' =&gt; true)
   builder :feed
 end
 
@@ -55,7 +57,8 @@ end
 
 post '/search' do
   @entries = Entry.search(:conditions =&gt; [params[:q].to_s], 
-                          :limit =&gt; SiteConfig.per_page)
+                          :limit =&gt; SiteConfig.per_page,
+                          'feed.approved' =&gt; true)
   haml :search
 end
 
@@ -71,7 +74,7 @@ end
 # admin feed create
 post '/admin/feeds' do
   login_required
-  @feed = Feed.new(:url =&gt; params[:url])
+  @feed = Feed.new(:url =&gt; params[:url], :approved =&gt; true)
   @feed.save
   redirect '/admin'
 end
@@ -91,3 +94,11 @@ post '/admin/feeds/:id/update' do
   @feed.update_from_remote
   redirect '/admin'
 end
+
+# mark the given feed as approved
+post '/admin/feeds/:id/approve' do
+  login_required
+  @feed = Feed.get(params[:id])
+  @feed.approve!
+  redirect '/admin'
+end</diff>
      <filename>application.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ set :environment, :production
 
 FileUtils.mkdir_p 'log' unless File.exists?('log')
 log = File.new(&quot;log/sinatra.log&quot;, &quot;a&quot;)
-STDOUT.reopen(log)
-STDERR.reopen(log)
+$stdout.reopen(log)
+$stderr.reopen(log)
 
 run Sinatra::Application</diff>
      <filename>config.ru</filename>
    </modified>
    <modified>
      <diff>@@ -15,6 +15,7 @@ class Feed
   property :etag,             String
   property :created_at,       Time
   property :updated_at,       Time
+  property :approved,         Boolean, :default =&gt; false
 
   # will set feed attributes to remote feed values or fail validation if not found
   validates_with_method :feed_url, :method =&gt; :check_remote_feed
@@ -35,13 +36,21 @@ class Feed
     save if dirty?
     update_with_remote_entries
   end
+  
+  # Approves the feed - meaning it will be shown in the main listing.
+  def approve!
+    self.approved = true
+    self.save!
+  end
 
   # returns the live remote feed, as provided by Feedzirra
   def remote_feed
     @feed ||= Feedzirra::Feed.fetch_and_parse(self.feed_url || '')
     @feed.is_a?(Fixnum) ? nil : @feed
   end
-
+  
+  # Returns an array of tuples, each being [title, url, [feed-previews]]
+  # for a given url. Used for discovering feeds.
   def self.preview_url(feed_or_blog_url, recurse = true)
     @feed = Feedzirra::Feed.fetch_and_parse(feed_or_blog_url.to_s)
     if @feed</diff>
      <filename>lib/feed.rb</filename>
    </modified>
    <modified>
      <diff>@@ -30,7 +30,8 @@ describe 'Application' do
     specify 'should retrieve second page of results' do
       Entry.should_receive(:paginated).with(:order    =&gt; [:published_at.desc],
                                             :per_page =&gt; SiteConfig.per_page, 
-                                            :page     =&gt; 2).and_return([3, [@entry]])
+                                            :page     =&gt; 2,
+                                            'feed.approved' =&gt; true).and_return([3, [@entry]])
       get '/page/2'
     end
   end
@@ -51,7 +52,7 @@ describe 'Application' do
     end
 
     specify 'should return matching records' do
-      Entry.should_receive(:search).with(:conditions =&gt; ['power ring'], :limit =&gt; SiteConfig.per_page).and_return([@entry])
+      Entry.should_receive(:search).with(:conditions =&gt; ['power ring'], :limit =&gt; SiteConfig.per_page, 'feed.approved' =&gt; true).and_return([@entry])
       post '/search', :q =&gt; 'power ring'
     end
 
@@ -92,6 +93,12 @@ describe 'Application' do
           post '/admin/feeds', :url =&gt; 'http://www.nhruby.org'
         }.should change(Feed, :count).by(1)
       end
+      
+      specify 'should create an approved feed' do
+        authorize SiteConfig.admin_login, SiteConfig.admin_password
+        post '/admin/feeds', :url =&gt; 'http://www.nhruby.org'
+        Feed.first(:order =&gt; [:id.desc]).should be_approved
+      end
 
       specify 'should redirect to the main admin page' do
         authorize SiteConfig.admin_login, SiteConfig.admin_password
@@ -147,5 +154,27 @@ describe 'Application' do
         last_response.status.should == 401
       end
     end
+    
+    context 'approving a feed' do
+      specify 'should run update for the specified feed' do
+        authorize SiteConfig.admin_login, SiteConfig.admin_password
+        Feed.should_receive(:get).with('1').and_return(@feed)
+        @feed.should_receive(:approve!).and_return(true)
+        post &quot;/admin/feeds/#{@feed.id}/approve&quot;
+      end
+
+      specify 'should redirect to the main admin page' do
+        authorize SiteConfig.admin_login, SiteConfig.admin_password
+        post &quot;/admin/feeds/#{@feed.id}/approve&quot;
+        follow_redirect!
+        last_request.url.should match(/.*\/admin$/)
+      end
+
+      specify 'should require login' do
+        post '/admin/feeds/1/approve'
+        last_response.status.should == 401
+      end
+    end
+    
   end
 end</diff>
      <filename>spec/application_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -6,6 +6,7 @@ Factory.define :feed do |f|
   f.feed_url  'http://feeds2.feedburner.com/ZerosumDirtnap'
   f.created_at Time.now
   f.updated_at Time.now
+  f.approved   true
 end
 
 Factory.define :entry do |f|</diff>
      <filename>spec/factories.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,7 @@ describe 'Feed' do
   before(:each) do
     Feed.all.destroy!
     Entry.all.destroy!
-    @feed = Factory.build(:feed)
+    @feed = Factory.build(:feed, :approved =&gt; false)
   end
 
   specify 'should be valid' do
@@ -12,6 +12,16 @@ describe 'Feed' do
     @feed.should be_valid
   end
 
+  specify 'should default to not approved' do
+    @feed.should_not be_approved
+  end
+  
+  specify 'should let you approve it' do
+    @feed.stub!(:check_remote_feed).and_return(true)
+    @feed.approve!
+    @feed.should be_approved
+  end
+
   context 'validations' do
     before(:each) do
       @feed.stub!(:check_remote_feed).and_return(true)</diff>
      <filename>spec/feed_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -8,7 +8,14 @@
       %form{:action =&gt; &quot;/admin/feeds/#{feed.id}/update&quot;, :method =&gt; 'post', :class =&gt; 'action'}
         %input{:type =&gt; 'submit', :value =&gt; 'Update'}
       %a{:href =&gt; feed.url, :target =&gt; '_blank'}= feed.title
-      = &quot;- #{feed.entries.length} entries&quot;
+      == - #{feed.entries.length} entries
+      - if feed.approved?
+        (this feed is approved)
+      - else
+        (not yet approved,
+        %form{:action =&gt; &quot;/admin/feeds/#{feed.id}/approve&quot;, :method =&gt; 'post', :class =&gt; 'action'}
+          %input{:type =&gt; 'submit', :value =&gt; 'approve now'}
+        )
 %form{:action =&gt; '/admin/feeds', :method =&gt; 'post'}
   %input{:type =&gt; 'text', :name =&gt; 'url'}
   %input{:type =&gt; 'submit', :value =&gt; 'Add New Feed'}</diff>
      <filename>views/admin.haml</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>b496ffe1ce090e7d9656684f041d52353e974d36</id>
    </parent>
  </parents>
  <author>
    <name>Darcy Laycock</name>
    <email>sutto@sutto.net</email>
  </author>
  <url>http://github.com/zapnap/mogo/commit/c81b7e6cb58baabf1b1a7041fc3d8deaa462e0a2</url>
  <id>c81b7e6cb58baabf1b1a7041fc3d8deaa462e0a2</id>
  <committed-date>2009-04-02T12:30:46-07:00</committed-date>
  <authored-date>2009-04-02T12:30:46-07:00</authored-date>
  <message>More refactoring for approved feeds</message>
  <tree>69a8d620fb4a47d2f5f4c377edd54edeeba6cfe8</tree>
  <committer>
    <name>Darcy Laycock</name>
    <email>sutto@sutto.net</email>
  </committer>
</commit>
