Chronic parsing Twitter dates to integer

605 views Asked by At

Once again I am struggling with date formatting in Rails. I am trying to compare a date from ActiveRecord to the date a tweet was created in a cron rake but I am getting errors that I don not understand.

"Wed Feb 02 23:04:18 +0000 2011"
1296687858

2009-08-31 07:00:00 UTC
1251698400
survived

"Wed Feb 02 22:31:33 +0000 2011"
1296685893

2009-08-31 07:00:00 UTC
1251698400
survived

"Wed Feb 02 22:24:00 +0000 2011"
1296685440

2009-08-31 07:00:00 UTC
1251698400
survived

"Wed Feb 02 20:40:57 +0000 2011"
1296679257

2009-08-31 07:00:00 UTC
1251698400
survived

"Fri Jan 28 22:17:23 +0000 2011"
1296253043

2009-08-31 07:00:00 UTC
1251698400
survived

rake aborted!
can't convert String into Integer
/Users/phil/Sites/travlrapp.com/lib/tasks/cron.rake:29:in `[]'
/Users/phil/Sites/travlrapp.com/lib/tasks/cron.rake:29:in `fetch_tweets'
/Users/phil/Sites/travlrapp.com/lib/tasks/cron.rake:27:in `each'
/Users/phil/Sites/travlrapp.com/lib/tasks/cron.rake:27:in `fetch_tweets'
/Users/phil/Sites/travlrapp.com/lib/tasks/cron.rake:12:in `each'
/Users/phil/Sites/travlrapp.com/lib/tasks/cron.rake:12:in `fetch_tweets'
/Users/phil/Sites/travlrapp.com/lib/tasks/cron.rake:160
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `call'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `execute'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `each'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `execute'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:597:in `invoke_with_call_chain'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/monitor.rb:242:in `synchronize'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:590:in `invoke_with_call_chain'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:583:in `invoke'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2051:in `invoke_task'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `each'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2023:in `top_level'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2001:in `run'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:1998:in `run'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/bin/rake:31
/usr/bin/rake:19:in `load'
/usr/bin/rake:19

Here line 29 is puts tweet['created_at'].inspect, but if I remove that it will fatal error on the if statement that comes shortly after it.

desc "Automated Tasks"
task :cron => :environment do

    # TASK FUNCTIONS
    def fetch_tweets
        users = User.find(
            :all,
            :include => [ :authentications, :current_trip ],
            :conditions => 'trips.id > 0'
        )

        users.each do |user|

            auth = user.authentications.find(:first, :conditions => { :provider => 'twitter' })

            # Only bother if they are connected to twitter
            if user.current_trip and auth and auth['token'] and auth['secret'] then

                # Exchange our oauth_token and oauth_token secret for the AccessToken instance.
                access_token = Twitter.connect(auth['token'], auth['secret'])

                # use the access token as an agent to get the home timeline
                response = access_token.request(:get, "http://api.twitter.com/1/statuses/user_timeline.json")

                tweets = ActiveSupport::JSON.decode(response.body)

                tweets.each do |tweet|

                    puts tweet['created_at'].inspect
                    puts Chronic::parse(tweet['created_at']).to_i
                    puts ''

                    puts user.current_trip.start_date
                    puts Chronic::parse( user.current_trip.start_date ).to_i

                    # has coordinates and was tweeted since the start date
                    if tweet['coordinates'] != nil and (Chronic::parse(tweet['created_at']).to_i) >= (Chronic::parse(user.current_trip.start_date).to_i)

                        coords = tweet['coordinates']['coordinates'];

                        entry = Entry.new
                        entry.text = tweet['text']
                        entry.resource = "http://twitter.com/#{tweet['user']['screen_name']}/status/#{tweet['id']}"
                        entry.source = 'twitter'
                        entry.user_id = user.id
                        entry.trip_id = user.current_trip.id
                        entry.latitude = coords[1]
                        entry.longitude = coords[0]
                        entry.published_at = tweet['created_at']
                        entry.unique = 'twitter-' + (tweet['id']).to_s

                        puts entry.inspect if entry.save

                    end

                    puts 'survived'
                    puts ''

                end
            end

        end # users.each
    end

Now what strikes me as weird is thart it seems to convert both dates perfectly, then show the unix time for comparison. So why is it fatal erroring at a certain point?

2

There are 2 answers

0
Phil Sturgeon On BEST ANSWER

Fixed this with:

next unless tweet and tweet.class == Hash
1
stef On

Tweet at that point is malformed. You are expecting an array, but it's not - the entire tweet record from json is represented as a string.

Just put a if tweet.respond_to?(:each) beneath tweets.each do |tweet| (with a matching end).