Goto in Ruby?

I have a simple web GUI that I would like to read a file and enter data
into

This is my class

class Form
  def initialize
    @filename = "search.txt"
  end

def enter_data
    read_in_test_data.each { |x|
      line = x.chomp
      #need to log testId
      next if line.upcase.include? 'TESTID'
      next if line.upcase == 'ADDRESS:'
      $ie.text_field(:name, 'Address1').set(line)
      $ie.text_field(:name, 'Address2').set(line)
      $ie.text_field(:name, 'Address3').set(line)
      $ie.text_field(:name, 'Address4').set(line)
      $ie.text_field(:name, 'Address5').set(line)
      $ie.text_field(:name, 'Address6').set(line)
      $ie.text_field(:name, 'Address7').set(line)
    }
end

  def read_in_test_data
  #check if file exists and give date of last change
    File.readlines(@filename, "\n" )
  end
  private:read_in_test_data
end

this is an example of the file I am reading

*********************************************** TESTID_10
Address:
30 Choyce Close
Atherstone
Warwickshire
Country:
GB
Search-Results:
20
*********************************************** TESTID_20
Address:
Hamilton Chartered Surveyors
Aidy Street
Bath
Country:
GB
Search-Results:
1
*********************************************** TESTID_30

Sometimes the address can be upto 1..7 lines. What I am looking for is
something like a goto
statement, that when 'Country:' is found a different field can be
filled in e.g.($ie.text_field(:name, 'Ctry1').set(line).

Thanks for the help

Cheers

Aidy

Use a CASE statement for this.

case line.upcase
   when 'ADDRESS:'
        $ie.text_field(:name, 'Address1').set(line)
        $ie.text_field(:name, 'Address2').set(line)
        $ie.text_field(:name, 'Address3').set(line)
        $ie.text_field(:name, 'Address4').set(line)
        $ie.text_field(:name, 'Address5').set(line)
        $ie.text_field(:name, 'Address6').set(line)
        $ie.text_field(:name, 'Address7').set(line)
   when 'TESTID'
    # ...
   else
     # raise or what?
end

You can as well create more complex but flexible mechanisms (e.g. look up a lambda in a Hash) but whether it's worth the effort depends on your needs.

HTH

Kind regards

  robert

···

On 08.08.2006 16:47, aidy wrote:

I have a simple web GUI that I would like to read a file and enter data
into

This is my class

class Form
  def initialize
    @filename = "search.txt"
  end

def enter_data
    read_in_test_data.each { |x|
      line = x.chomp
      #need to log testId
      next if line.upcase.include? 'TESTID'
      next if line.upcase == 'ADDRESS:'
      $ie.text_field(:name, 'Address1').set(line)
      $ie.text_field(:name, 'Address2').set(line)
      $ie.text_field(:name, 'Address3').set(line)
      $ie.text_field(:name, 'Address4').set(line)
      $ie.text_field(:name, 'Address5').set(line)
      $ie.text_field(:name, 'Address6').set(line)
      $ie.text_field(:name, 'Address7').set(line)
    }
end

  def read_in_test_data
  #check if file exists and give date of last change
    File.readlines(@filename, "\n" )
  end
  private:read_in_test_data
end

this is an example of the file I am reading

*********************************************** TESTID_10
Address:
30 Choyce Close
Atherstone
Warwickshire
Country:
GB
Search-Results:
20
*********************************************** TESTID_20
Address:
Hamilton Chartered Surveyors
Aidy Street
Bath
Country:
GB
Search-Results:
1
*********************************************** TESTID_30

Sometimes the address can be upto 1..7 lines. What I am looking for is
something like a goto
statement, that when 'Country:' is found a different field can be
filled in e.g.($ie.text_field(:name, 'Ctry1').set(line).

Thanks for the help

Cheers

Aidy

Robert wrote

Use a CASE statement for this.

case line.upcase
   when 'ADDRESS:'
        $ie.text_field(:name, 'Address1').set(line)
        $ie.text_field(:name, 'Address2').set(line)
        $ie.text_field(:name, 'Address3').set(line)
        $ie.text_field(:name, 'Address4').set(line)
        $ie.text_field(:name, 'Address5').set(line)
        $ie.text_field(:name, 'Address6').set(line)
        $ie.text_field(:name, 'Address7').set(line)

Thanks for the advice, but this will only enter the word 'address' in 7
different boxes, while I need to iterate through the arrray.

Cheers

aidy

You probably should state more clearly what you need. Then we can come up with better suggestions.

  robert

···

On 08.08.2006 18:18, aidy wrote:

Robert wrote

Use a CASE statement for this.

case line.upcase
   when 'ADDRESS:'
        $ie.text_field(:name, 'Address1').set(line)
        $ie.text_field(:name, 'Address2').set(line)
        $ie.text_field(:name, 'Address3').set(line)
        $ie.text_field(:name, 'Address4').set(line)
        $ie.text_field(:name, 'Address5').set(line)
        $ie.text_field(:name, 'Address6').set(line)
        $ie.text_field(:name, 'Address7').set(line)

Thanks for the advice, but this will only enter the word 'address' in 7
different boxes, while I need to iterate through the arrray.

Robert Klemme wrote:

You probably should state more clearly what you need. Then we can come
up with better suggestions.

This is an example of a file I am reading.

********************************************** TESTID_10
Address:
30 Choyce Close
Atherstone
Country:
GB
Search-Results:
20
EXPECTED-RESULT:
*********************************************** TESTID_20
Address:
Hamilton Chartered Surveyors
Aidy Street
Bath
Country:
GB
Search-Results:
1
EXPECTED-RESULT:
*********************************************** TESTID_30

The GUI looks something like this

Address 1 ___________
Address 2 ___________
Address 3 ___________
Address 4 ___________

etc upto 7

However in some cases I will have one or two lines to enter in the
address,
other times 5,6 or 7

There are also two other fields: Country and Serach Results

this is the code

class Form

  def initialize
    @filename = "search.txt"
  end

def enter_data
    y = 11
    read_in_test_data.each { |x|
    line = x.chomp
    p line
    if line.upcase != 'ADDRESS:' and !line.upcase.include? 'TESTID'
      name = 'A' + y.to_s

        next if line.upcase == 'COUNTRY:'
        $ie.text_field(:name, 'C1').set(line)
        next if line.upcase =='SEARCH-RESULTS:'
        $ie.text_field(:name, 'NoResults').set(line)
        break if line.upcase =='EXPECTED-RESULT:'

      $ie.text_field(:name, name).set(line)
      y = y + 1
    end
    }
  end

  def read_in_test_data
  #check if file exists and give date of last change
    File.readlines(@filename, "\n" )
  end
  private:read_in_test_data

end

My 'logic' is when the file is read if we do not see ADDRESS: or TESTID
then we must be at the point to enter the address

y = 11
if line.upcase != 'ADDRESS:' and !line.upcase.include? 'TESTID'
name = 'A' + y.to_s
$ie.text_field(:name, name).set(line)
y = y + 1

the object names for addresses start from A11, hence the iterator.

However if I hit 'COUNTRY:', I need to put the country in the country
field (hence the next if [which in both cases will be GB), then
the search result in the SEARCH-RESULTS: field.

Cheers

Aidy

This may not be the nicest solution, but it is flexible and it might get
help you come up with a better solution. You can have any fields with any
number of values.

Below is the code. If you copy and paste it into a ruby file it should run
with some output.

Cheers

@test_data = <<ETD
*********************************************** TESTID_10
Address:
30 Choyce Close
Atherstone
Warwickshire
Country:
GB
Search-Results:
20
*********************************************** TESTID_20
Address:
Hamilton Chartered Surveyors
Aidy Street
Bath
Country:
GB
Search-Results:
1
*********************************************** TESTID_30
ETD

def enter_data
  results = Array.new
  current_key = nil
  test_index = 0

  read_in_test_data.each do |line|
    line.chomp!
    # skip to the next line and inc the test_index if there is a line of
stars
    if line =~ /^\*+/
      test_index += 1
      results[test_index] = Hash.new { Array.new }
      next
    end

    # If it's in a test, check to see if it's a key
    if line =~ /(.*)\:$/
      current_key = $1
      results[test_index][current_key] = Array.new
      next
    end
    results[test_index][current_key].push line

  end
  # Returns an array of hashes. Each hash value contains an array of values
  results.compact
end

def read_in_test_data
  @test_data.split("\n")
end

enter_data.each_with_index do |result, index|
   puts "Data for test #{index}"
   result.keys.each do |key|
     puts "Key: #{key}"
     result[key].each { |val| puts "Value: = #{val}" }
   end
end

···

On 8/9/06, aidy <aidy.rutter@gmail.com> wrote:

Robert Klemme wrote:

> You probably should state more clearly what you need. Then we can come
> up with better suggestions.

This is an example of a file I am reading.

********************************************** TESTID_10
Address:
30 Choyce Close
Atherstone
Country:
GB
Search-Results:
20
EXPECTED-RESULT:
*********************************************** TESTID_20
Address:
Hamilton Chartered Surveyors
Aidy Street
Bath
Country:
GB
Search-Results:
1
EXPECTED-RESULT:
*********************************************** TESTID_30

The GUI looks something like this

Address 1 ___________
Address 2 ___________
Address 3 ___________
Address 4 ___________

etc upto 7

However in some cases I will have one or two lines to enter in the
address,
other times 5,6 or 7

There are also two other fields: Country and Serach Results

this is the code

class Form

  def initialize
    @filename = "search.txt"
  end

def enter_data
    y = 11
    read_in_test_data.each { |x|
    line = x.chomp
    p line
    if line.upcase != 'ADDRESS:' and !line.upcase.include? 'TESTID'
      name = 'A' + y.to_s

        next if line.upcase == 'COUNTRY:'
        $ie.text_field(:name, 'C1').set(line)
        next if line.upcase =='SEARCH-RESULTS:'
        $ie.text_field(:name, 'NoResults').set(line)
        break if line.upcase =='EXPECTED-RESULT:'

      $ie.text_field(:name, name).set(line)
      y = y + 1
    end
    }
  end

  def read_in_test_data
  #check if file exists and give date of last change
    File.readlines(@filename, "\n" )
  end
  private:read_in_test_data

end

My 'logic' is when the file is read if we do not see ADDRESS: or TESTID
then we must be at the point to enter the address

y = 11
if line.upcase != 'ADDRESS:' and !line.upcase.include? 'TESTID'
name = 'A' + y.to_s
$ie.text_field(:name, name).set(line)
y = y + 1

the object names for addresses start from A11, hence the iterator.

However if I hit 'COUNTRY:', I need to put the country in the country
field (hence the next if [which in both cases will be GB), then
the search result in the SEARCH-RESULTS: field.

Cheers

Aidy

task = nil
count = 0

case line
   when /^\*+ TESTID_\d+$/
     # ignore
   when /^Address:$/
     task = :address
   when /^Country:$/
     task = :country
...
   else
     case task
       when :address
         $ie.text_field(:name, "A#{count}").set(line)
         count += 1
       when :country
         $ie.text_field(:name, "C#{count}").set(line)
         count += 1
...
       else
         # ignore or raise exception
     end
end

  robert

···

On 09.08.2006 13:47, aidy wrote:

Robert Klemme wrote:

You probably should state more clearly what you need. Then we can come
up with better suggestions.

This is an example of a file I am reading.

********************************************** TESTID_10
Address:
30 Choyce Close
Atherstone
Country:
GB
Search-Results:
20
EXPECTED-RESULT:
*********************************************** TESTID_20
Address:
Hamilton Chartered Surveyors
Aidy Street
Bath
Country:
GB
Search-Results:
1
EXPECTED-RESULT:
*********************************************** TESTID_30

The GUI looks something like this

Address 1 ___________
Address 2 ___________
Address 3 ___________
Address 4 ___________

etc upto 7

However in some cases I will have one or two lines to enter in the
address,
other times 5,6 or 7

There are also two other fields: Country and Serach Results

this is the code

class Form

  def initialize
    @filename = "search.txt"
  end

def enter_data
    y = 11
    read_in_test_data.each { |x|
    line = x.chomp
    p line
    if line.upcase != 'ADDRESS:' and !line.upcase.include? 'TESTID'
      name = 'A' + y.to_s

        next if line.upcase == 'COUNTRY:'
        $ie.text_field(:name, 'C1').set(line)
        next if line.upcase =='SEARCH-RESULTS:'
        $ie.text_field(:name, 'NoResults').set(line)
        break if line.upcase =='EXPECTED-RESULT:'

      $ie.text_field(:name, name).set(line)
      y = y + 1
    end
    }
  end

  def read_in_test_data
  #check if file exists and give date of last change
    File.readlines(@filename, "\n" )
  end
  private:read_in_test_data

end

My 'logic' is when the file is read if we do not see ADDRESS: or TESTID
then we must be at the point to enter the address

y = 11
if line.upcase != 'ADDRESS:' and !line.upcase.include? 'TESTID'
name = 'A' + y.to_s
$ie.text_field(:name, name).set(line)
y = y + 1

the object names for addresses start from A11, hence the iterator.

However if I hit 'COUNTRY:', I need to put the country in the country
field (hence the next if [which in both cases will be GB), then
the search result in the SEARCH-RESULTS: field.

Cheers

Aidy

"aidy" <aidy.rutter@gmail.com> writes:

The GUI looks something like this

Address 1 ___________
Address 2 ___________
Address 3 ___________
Address 4 ___________

etc upto 7

However in some cases I will have one or two lines to enter in the
address,
other times 5,6 or 7

Why don't you use a <textarea>?

···

Aidy

--
Christian Neukirchen <chneukirchen@gmail.com> http://chneukirchen.org

Hi Robert

took your advice, and works like a dream. I owe you a couple of beers.

def enter_data
    task = nil
    count = 11

    read_in_test_data.each { |x|
    line = x.chomp

    case line
      when /^\*+ TESTID_\d+$/
        # log
      when /^Address:$/
        task = :address
      when /^Country:$/
        task = :country
      when /^Search-Results:$/
        task = :search
    else
      case task
        when :address
          $ie.text_field(:name, "A#{count}").set(line)
          count += 1
        when :country
         $ie.text_field(:name, 'C1').set(line)
        when :search
          $ie.text_field(:name, 'NoResults').set(line)
          $ie.button(:value, 'Search').click
          #need to now verify
        else
          #whatever
       end
     end
    }

  end

aidy