mobilize-base 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +7 -7
- data/lib/mobilize-base/handlers/gdriver.rb +7 -13
- data/lib/mobilize-base/jobtracker.rb +1 -1
- data/lib/mobilize-base/models/job.rb +17 -4
- data/lib/mobilize-base/models/requestor.rb +17 -5
- data/lib/mobilize-base/version.rb +1 -1
- data/test/mobilize_test.rb +14 -15
- metadata +2 -2
    
        data/README.md
    CHANGED
    
    | @@ -440,19 +440,19 @@ name>)` and enter values under each header: | |
| 440 440 | 
             
            * write_handler	This is where the job writes its data to. For
         | 
| 441 441 | 
             
              mobilize-base, you should enter "gsheet"
         | 
| 442 442 |  | 
| 443 | 
            -
            *  | 
| 444 | 
            -
             | 
| 443 | 
            +
            * param_sheets This is a comma-delimited list of sheets, relayed to the job,
         | 
| 444 | 
            +
            which can be used for parameters.
         | 
| 445 445 | 
             
              The format is `<google docs book>/<google docs sheet>`, so if you
         | 
| 446 | 
            -
            wanted to read from the "output" sheet on the " | 
| 447 | 
            -
            would write in  | 
| 446 | 
            +
            wanted to read from the "output" sheet on the "monthly_results" book you
         | 
| 447 | 
            +
            would write in `monthly_results/output`. For a sheet in the Jobspec
         | 
| 448 448 | 
             
            itself you could write simply `<output>`.
         | 
| 449 449 |  | 
| 450 | 
            -
            * params This is a hash of data, expressed in a JSON | 
| 451 | 
            -
             | 
| 450 | 
            +
            * params This is a hash of data, expressed in a JSON, which can be used
         | 
| 451 | 
            +
            for parameters.
         | 
| 452 452 |  | 
| 453 453 | 
             
            * destination This is the destination for the data, relayed to the job.
         | 
| 454 454 | 
             
              For a gsheet write_handler, this would be the name of the sheet to be
         | 
| 455 | 
            -
            written to, similar to  | 
| 455 | 
            +
            written to, similar to param_sheets.
         | 
| 456 456 |  | 
| 457 457 | 
             
            <a name='section_Start_Run_Test'></a>
         | 
| 458 458 | 
             
            ### Run Test
         | 
| @@ -231,17 +231,11 @@ module Mobilize | |
| 231 231 |  | 
| 232 232 | 
             
                def Gsheeter.read_by_job_id(job_id)
         | 
| 233 233 | 
             
                  j = Job.find(job_id)
         | 
| 234 | 
            -
                  r = j.requestor
         | 
| 235 234 | 
             
                  #reserve email account for read
         | 
| 236 235 | 
             
                  email = Gdriver.get_worker_email_by_mongo_id(job_id)
         | 
| 237 236 | 
             
                  return false unless email
         | 
| 238 | 
            -
                   | 
| 239 | 
            -
                   | 
| 240 | 
            -
                  #assume jobspec source if none given
         | 
| 241 | 
            -
                  source = [r.jobspec_title,source].join("/") if sheet.nil?
         | 
| 242 | 
            -
                  tsv = Gsheeter.find_or_create_by_name(source,email).to_tsv
         | 
| 243 | 
            -
                  book = nil
         | 
| 244 | 
            -
                  return tsv
         | 
| 237 | 
            +
                  #pull tsv from cache
         | 
| 238 | 
            +
                  j.param_sheet_dsts.first.read_cache
         | 
| 245 239 | 
             
                end
         | 
| 246 240 |  | 
| 247 241 | 
             
                def Gsheeter.read_by_dst_id(dst_id,email=nil)
         | 
| @@ -277,32 +271,32 @@ module Mobilize | |
| 277 271 | 
             
                def Gsheeter.write_by_job_id(job_id)
         | 
| 278 272 | 
             
                  j = Job.find(job_id)
         | 
| 279 273 | 
             
                  r = j.requestor
         | 
| 280 | 
            -
                   | 
| 274 | 
            +
                  tgt_name = if j.destination.split("/").length==1
         | 
| 281 275 | 
             
                                "#{r.jobspec_title}#{"/"}#{j.destination}"
         | 
| 282 276 | 
             
                              else
         | 
| 283 277 | 
             
                                j.destination
         | 
| 284 278 | 
             
                              end
         | 
| 285 | 
            -
                  sheet_dst = Dataset.find_or_create_by_handler_and_name('gsheeter', | 
| 279 | 
            +
                  sheet_dst = Dataset.find_or_create_by_handler_and_name('gsheeter',tgt_name)
         | 
| 286 280 | 
             
                  sheet_dst.update_attributes(:requestor_id=>r.id.to_s) if sheet_dst.requestor_id.nil?
         | 
| 287 281 | 
             
                  email = Gdriver.get_worker_email_by_mongo_id(job_id)
         | 
| 288 282 | 
             
                  #return false if there are no emails available
         | 
| 289 283 | 
             
                  return false unless email
         | 
| 290 284 | 
             
                  #create temp tab, write data to it, checksum it against the source
         | 
| 291 | 
            -
                  tempsheet_dst = Dataset.find_or_create_by_handler_and_name('gsheeter',"#{ | 
| 285 | 
            +
                  tempsheet_dst = Dataset.find_or_create_by_handler_and_name('gsheeter',"#{tgt_name}_temp")
         | 
| 292 286 | 
             
                  tempsheet_dst.update_attributes(:requestor_id=>r.id.to_s) if tempsheet_dst.requestor_id.nil?
         | 
| 293 287 | 
             
                  tempsheet = Gsheeter.find_or_create_by_dst_id(tempsheet_dst.id.to_s)
         | 
| 294 288 | 
             
                  #tsv is the second to last stage's output (the last is the write)
         | 
| 295 289 | 
             
                  tsv = Dataset.find(j.tasks[j.prior_task]['output_dst_id']).read
         | 
| 296 290 | 
             
                  tempsheet.write(tsv,true,job_id)
         | 
| 297 291 | 
             
                  #delete current sheet, replace it with temp one
         | 
| 298 | 
            -
                  sheet = Gsheeter.find_or_create_by_name( | 
| 292 | 
            +
                  sheet = Gsheeter.find_or_create_by_name(tgt_name,email)
         | 
| 299 293 | 
             
                  title = sheet.title
         | 
| 300 294 | 
             
                  #http
         | 
| 301 295 | 
             
                  sheet.delete
         | 
| 302 296 | 
             
                  tempsheet.title = title
         | 
| 303 297 | 
             
                  tempsheet.save
         | 
| 304 298 | 
             
                  sheet_dst.update_attributes(:url=>tempsheet.spreadsheet.human_url)
         | 
| 305 | 
            -
                  "Write successful for #{ | 
| 299 | 
            +
                  "Write successful for #{tgt_name}".oputs
         | 
| 306 300 | 
             
                  return true
         | 
| 307 301 | 
             
                end
         | 
| 308 302 | 
             
              end
         | 
| @@ -193,7 +193,7 @@ module Mobilize | |
| 193 193 | 
             
                    requestors = Requestor.all
         | 
| 194 194 | 
             
                    Jobtracker.run_notifications
         | 
| 195 195 | 
             
                    requestors.each do |r|
         | 
| 196 | 
            -
                      Jobtracker.update_status(" | 
| 196 | 
            +
                      Jobtracker.update_status("Checking requestor #{r.name}")
         | 
| 197 197 | 
             
                      if r.is_due?
         | 
| 198 198 | 
             
                        r.enqueue!
         | 
| 199 199 | 
             
                        Jobtracker.update_status("Enqueued requestor #{r.name}")
         | 
| @@ -14,8 +14,8 @@ module Mobilize | |
| 14 14 | 
             
                field :last_completed_at, type: Time
         | 
| 15 15 | 
             
                field :read_handler, type: String
         | 
| 16 16 | 
             
                field :write_handler, type: String
         | 
| 17 | 
            -
                field : | 
| 18 | 
            -
                field : | 
| 17 | 
            +
                field :files, type: String #name of sheet(s) on doc
         | 
| 18 | 
            +
                field :params, type: String #JSON
         | 
| 19 19 | 
             
                field :destination, type: String #output destination - could be file, could be sheet
         | 
| 20 20 |  | 
| 21 21 | 
             
                index({ requestor_id: 1})
         | 
| @@ -28,6 +28,19 @@ module Mobilize | |
| 28 28 | 
             
                  Mobilize::Resque.find_worker_by_mongo_id(j.id.to_s)
         | 
| 29 29 | 
             
                end
         | 
| 30 30 |  | 
| 31 | 
            +
                def param_sheet_dsts
         | 
| 32 | 
            +
                  j = self
         | 
| 33 | 
            +
                  r = j.requestor
         | 
| 34 | 
            +
                  j.param_sheets.split(",").map do |ps|
         | 
| 35 | 
            +
                    #prepend jobspec title if there is no path separator
         | 
| 36 | 
            +
                    full_ps = ps.index("/") ? ps : [r.jobspec_title,ps].join("/")
         | 
| 37 | 
            +
                    #find or create dataset for this sheet
         | 
| 38 | 
            +
                    dst = Dataset.find_or_create_by_handler_and_name("gsheeter",full_ps)
         | 
| 39 | 
            +
                    dst.update_attributes(:requestor_id=>r.id.to_s) unless dst.requestor_id
         | 
| 40 | 
            +
                    dst
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
             | 
| 31 44 | 
             
                def Job.find_by_name(name)
         | 
| 32 45 | 
             
                  Job.where(:name=>name).first
         | 
| 33 46 | 
             
                end
         | 
| @@ -186,11 +199,11 @@ module Mobilize | |
| 186 199 |  | 
| 187 200 | 
             
                def is_due?
         | 
| 188 201 | 
             
                  j = self
         | 
| 189 | 
            -
                  return false if j.is_working? or j.schedule.to_s.starts_with?("after")
         | 
| 202 | 
            +
                  return false if j.is_working? or j.active == false or j.schedule.to_s.starts_with?("after")
         | 
| 190 203 | 
             
                  last_run = j.last_completed_at
         | 
| 191 204 | 
             
                  #check schedule
         | 
| 192 205 | 
             
                  schedule = j.schedule
         | 
| 193 | 
            -
                  return true if schedule == 'once' | 
| 206 | 
            +
                  return true if schedule == 'once'
         | 
| 194 207 | 
             
                  #strip the "every" from the front if present
         | 
| 195 208 | 
             
                  schedule = schedule.gsub("every","").gsub("."," ").strip
         | 
| 196 209 | 
             
                  value,unit,operator,job_utctime = schedule.split(" ")
         | 
| @@ -31,14 +31,17 @@ module Mobilize | |
| 31 31 | 
             
                end
         | 
| 32 32 |  | 
| 33 33 | 
             
                def Requestor.jobs_sheet_headers
         | 
| 34 | 
            -
                  %w{name active schedule status last_error destination_url read_handler write_handler  | 
| 34 | 
            +
                  %w{name active schedule status last_error destination_url read_handler write_handler param_sheets params destination}
         | 
| 35 35 | 
             
                end
         | 
| 36 36 |  | 
| 37 37 | 
             
                def Requestor.perform(id,*args)
         | 
| 38 38 | 
             
                  r = Requestor.find(id.to_s)
         | 
| 39 39 | 
             
                  #reserve email account for read
         | 
| 40 40 | 
             
                  gdrive_email = Gdriver.get_worker_email_by_mongo_id(id)
         | 
| 41 | 
            -
                   | 
| 41 | 
            +
                  unless gdrive_email
         | 
| 42 | 
            +
                    "no gdrive_email available for #{r.name}".oputs
         | 
| 43 | 
            +
                    return false
         | 
| 44 | 
            +
                  end
         | 
| 42 45 | 
             
                  jobs_sheet = r.jobs_sheet(gdrive_email)
         | 
| 43 46 | 
             
                  #write headers to sheet
         | 
| 44 47 | 
             
                  Requestor.jobs_sheet_headers.each_with_index do |h,h_i|
         | 
| @@ -52,7 +55,16 @@ module Mobilize | |
| 52 55 | 
             
                  #queue up the jobs that are due and active
         | 
| 53 56 | 
             
                  r.jobs.each do |j|
         | 
| 54 57 | 
             
                    begin
         | 
| 55 | 
            -
                       | 
| 58 | 
            +
                      if j.active and j.is_due?
         | 
| 59 | 
            +
                        #cache all param_sheets
         | 
| 60 | 
            +
                        j.param_sheet_dsts.each do |psdst|
         | 
| 61 | 
            +
                         #read tsv, write to cache for job to use
         | 
| 62 | 
            +
                          tsv = Gsheeter.find_or_create_by_name(psdst.name,gdrive_email).to_tsv
         | 
| 63 | 
            +
                          r.update_status("caching #{psdst.name}")
         | 
| 64 | 
            +
                          psdst.write_cache(tsv)
         | 
| 65 | 
            +
                        end
         | 
| 66 | 
            +
                        j.enqueue!
         | 
| 67 | 
            +
                      end
         | 
| 56 68 | 
             
                    rescue ScriptError,StandardError => exc
         | 
| 57 69 | 
             
                      #update errors
         | 
| 58 70 | 
             
                      j.update_attributes(:last_error=>exc.to_s,:last_trace=>exc.backtrace.to_s)
         | 
| @@ -85,7 +97,7 @@ module Mobilize | |
| 85 97 | 
             
                                        :schedule => rj['schedule'],
         | 
| 86 98 | 
             
                                        :read_handler => rj['read_handler'],
         | 
| 87 99 | 
             
                                        :write_handler => rj['write_handler'],
         | 
| 88 | 
            -
                                        : | 
| 100 | 
            +
                                        :param_sheets => rj['param_sheets'],
         | 
| 89 101 | 
             
                                        :params => rj['params'],
         | 
| 90 102 | 
             
                                        :destination => rj['destination'])
         | 
| 91 103 | 
             
                    #update laststatus with "Created job for" if job is due
         | 
| @@ -207,7 +219,7 @@ module Mobilize | |
| 207 219 | 
             
                end
         | 
| 208 220 |  | 
| 209 221 | 
             
                def is_due?
         | 
| 210 | 
            -
                  r = self
         | 
| 222 | 
            +
                  r = self.reload
         | 
| 211 223 | 
             
                  return false if r.is_working?
         | 
| 212 224 | 
             
                  last_due_time = Time.now.utc - Jobtracker.requestor_refresh_freq
         | 
| 213 225 | 
             
                  return true if r.last_run.nil? or r.last_run < last_due_time
         | 
    
        data/test/mobilize_test.rb
    CHANGED
    
    | @@ -9,6 +9,13 @@ describe "Mobilize" do | |
| 9 9 |  | 
| 10 10 | 
             
              # enqueues 4 workers on Resque
         | 
| 11 11 | 
             
              it "runs integration test" do
         | 
| 12 | 
            +
                puts "clear out test db"
         | 
| 13 | 
            +
                Mongoid.session(:default).collections.each do |collection| 
         | 
| 14 | 
            +
                  unless collection.name =~ /^system\./
         | 
| 15 | 
            +
                    collection.drop
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 12 19 | 
             
                email = Mobilize::Gdriver.owner_email
         | 
| 13 20 |  | 
| 14 21 | 
             
                #kill all workers
         | 
| @@ -19,9 +26,6 @@ describe "Mobilize" do | |
| 19 26 | 
             
                sleep 20
         | 
| 20 27 | 
             
                assert Mobilize::Jobtracker.workers.length == Mobilize::Resque.config['max_workers'].to_i
         | 
| 21 28 |  | 
| 22 | 
            -
                #make sure old one is deleted
         | 
| 23 | 
            -
                Mobilize::Requestor.find_or_create_by_email(email).delete
         | 
| 24 | 
            -
             | 
| 25 29 | 
             
                puts "create requestor 'mobilize'"
         | 
| 26 30 | 
             
                requestor = Mobilize::Requestor.find_or_create_by_email(email)
         | 
| 27 31 | 
             
                assert requestor.email == email
         | 
| @@ -31,12 +35,10 @@ describe "Mobilize" do | |
| 31 35 | 
             
                jobspec_title = requestor.jobspec_title
         | 
| 32 36 | 
             
                books = Mobilize::Gbooker.find_all_by_title(jobspec_title)
         | 
| 33 37 | 
             
                books.each{|book| book.delete}
         | 
| 34 | 
            -
                #delete old datasets for this specbook
         | 
| 35 | 
            -
                Mobilize::Dataset.all.select{|d| d.name.starts_with?(jobspec_title)}.each{|d| d.delete}
         | 
| 36 38 |  | 
| 37 | 
            -
                puts "enqueue jobtracker, wait  | 
| 39 | 
            +
                puts "enqueue jobtracker, wait 45s"
         | 
| 38 40 | 
             
                Mobilize::Jobtracker.start
         | 
| 39 | 
            -
                sleep  | 
| 41 | 
            +
                sleep 45
         | 
| 40 42 | 
             
                puts "jobtracker status: #{Mobilize::Jobtracker.status}" 
         | 
| 41 43 | 
             
                puts "status:#{Mobilize::Jobtracker.status}" #!= 'stopped'
         | 
| 42 44 |  | 
| @@ -62,10 +64,7 @@ describe "Mobilize" do | |
| 62 64 | 
             
                test_source_tsv = test_source_rows.map{|r| r.join("\t")}.join("\n")
         | 
| 63 65 | 
             
                test_source_sheet.write(test_source_tsv)
         | 
| 64 66 |  | 
| 65 | 
            -
                puts "add row to jobs sheet, wait  | 
| 66 | 
            -
             | 
| 67 | 
            -
                #delete existing Jobs from the db
         | 
| 68 | 
            -
                Mobilize::Job.each{|j| j.delete}
         | 
| 67 | 
            +
                puts "add row to jobs sheet, wait 60s"
         | 
| 69 68 |  | 
| 70 69 | 
             
                jobs_sheet = jobs_sheets.first
         | 
| 71 70 |  | 
| @@ -77,7 +76,7 @@ describe "Mobilize" do | |
| 77 76 | 
             
                          "destination_url" => "",
         | 
| 78 77 | 
             
                             "read_handler" => "gsheeter",
         | 
| 79 78 | 
             
                            "write_handler" => "gsheeter",
         | 
| 80 | 
            -
                             " | 
| 79 | 
            +
                             "param_sheets" => "test_source",
         | 
| 81 80 | 
             
                                   "params" => "",
         | 
| 82 81 | 
             
                              "destination" => "test_destination"},
         | 
| 83 82 | 
             
                              #run after the first
         | 
| @@ -89,7 +88,7 @@ describe "Mobilize" do | |
| 89 88 | 
             
                          "destination_url" => "",
         | 
| 90 89 | 
             
                             "read_handler" => "gsheeter",
         | 
| 91 90 | 
             
                            "write_handler" => "gsheeter",
         | 
| 92 | 
            -
                             " | 
| 91 | 
            +
                             "param_sheets" => "test_source",
         | 
| 93 92 | 
             
                                   "params" => "",
         | 
| 94 93 | 
             
                              "destination" => "test_destination2"}
         | 
| 95 94 | 
             
                ]
         | 
| @@ -105,9 +104,9 @@ describe "Mobilize" do | |
| 105 104 |  | 
| 106 105 | 
             
                puts "job row added, force enqueued requestor"
         | 
| 107 106 | 
             
                requestor.enqueue!
         | 
| 108 | 
            -
                sleep  | 
| 107 | 
            +
                sleep 60
         | 
| 109 108 |  | 
| 110 | 
            -
                puts "jobtracker posted test  | 
| 109 | 
            +
                puts "jobtracker posted test sheet data to test destination, and checksum succeeded?"
         | 
| 111 110 | 
             
                test_destination_sheet = Mobilize::Gsheeter.find_or_create_by_name("#{jobspec_title}/test_destination",email)
         | 
| 112 111 |  | 
| 113 112 | 
             
                assert test_destination_sheet.to_tsv == test_source_sheet.to_tsv
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: mobilize-base
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.0. | 
| 4 | 
            +
              version: 1.0.1
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2012-11- | 
| 12 | 
            +
            date: 2012-11-27 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: rake
         |