spreewald 1.6.0 → 1.7.0
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.
- checksums.yaml +4 -4
- data/README.md +122 -174
- data/Rakefile +5 -1
- data/lib/spreewald/development_steps.rb +7 -0
- data/lib/spreewald/email_steps.rb +14 -14
- data/lib/spreewald/file_attachment_steps.rb +0 -1
- data/lib/spreewald/timecop_steps.rb +5 -5
- data/lib/spreewald/web_steps.rb +20 -26
- data/lib/spreewald_support/version.rb +1 -1
- data/support/parser.rb +3 -1
- data/support/step_definition.rb +4 -4
- data/support/step_definition_file.rb +4 -4
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: fa355b8ab659c4c92bf9bbb82d330c78d3dae334
         | 
| 4 | 
            +
              data.tar.gz: 6bdae7b5482fa1db3ff3c1180cd4e21afa976fdf
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 8b5b1e7ce0e2c433af02ff362df920076bbfa5e11ea7ff6b28d7bc43a0cc5e5df159638d09fc66daed6506af64cda3665e2aad124e81ec7479dc8b27877a2f8d
         | 
| 7 | 
            +
              data.tar.gz: b39e03bad642047b2afd5adb30f805b383675b076306bc99f50233ac0c3944dfda14208094540ac51df04f00dca3918df18b4fa2199d967a7d2527b7f204c721
         | 
    
        data/README.md
    CHANGED
    
    | @@ -18,28 +18,36 @@ Or install it yourself as: | |
| 18 18 |  | 
| 19 19 | 
             
                $ gem install spreewald
         | 
| 20 20 |  | 
| 21 | 
            +
             | 
| 21 22 | 
             
            ## Usage
         | 
| 22 23 |  | 
| 23 | 
            -
             | 
| 24 | 
            +
            Require all Spreewald steps by putting
         | 
| 24 25 |  | 
| 25 | 
            -
                require 'spreewald/ | 
| 26 | 
            +
                require 'spreewald/all_steps'
         | 
| 26 27 |  | 
| 27 28 | 
             
            into either your `support/env.rb` or `step_definitions/spreewald_steps.rb`.
         | 
| 28 29 |  | 
| 29 | 
            -
             | 
| 30 | 
            +
            Steps are grouped into a number of categories. If you only want to use a subset
         | 
| 31 | 
            +
            of Spreewald's steps, you can pick and choose single categories by requiring
         | 
| 32 | 
            +
            single files like this:
         | 
| 30 33 |  | 
| 31 | 
            -
                require 'spreewald/ | 
| 34 | 
            +
                require 'spreewald/email_steps'
         | 
| 35 | 
            +
                require 'spreewald/web_steps'
         | 
| 32 36 |  | 
| 33 37 |  | 
| 34 38 | 
             
            ## Spreewald binary
         | 
| 35 39 |  | 
| 36 | 
            -
            Spreewald comes with a binary that prints a list of all  | 
| 40 | 
            +
            Spreewald comes with a binary that prints a list of all Cucumber steps from
         | 
| 41 | 
            +
            Spreewald _and your project_. It will filter the list by any string you
         | 
| 42 | 
            +
            pass it. Example usage:
         | 
| 37 43 |  | 
| 38 44 | 
             
            ```bash
         | 
| 39 45 | 
             
            spreewald # lists all steps
         | 
| 40 46 | 
             
            spreewald mail # lists all steps that contain "mail"
         | 
| 41 47 | 
             
            ```
         | 
| 42 48 |  | 
| 49 | 
            +
            The binary also prints paths and selectors; run `spreewald --help` to learn more.
         | 
| 50 | 
            +
             | 
| 43 51 |  | 
| 44 52 | 
             
            ## Waiting for page load
         | 
| 45 53 |  | 
| @@ -92,59 +100,59 @@ If you would like to contribute: | |
| 92 100 |  | 
| 93 101 | 
             
            ## This README
         | 
| 94 102 |  | 
| 95 | 
            -
            The "Steps" section is autogenerated by `rake update_readme` from comments in | 
| 103 | 
            +
            The "Steps" section is autogenerated by `rake update_readme` from comments in
         | 
| 104 | 
            +
            the step definitions.
         | 
| 96 105 |  | 
| 97 106 |  | 
| 98 107 | 
             
            ## Steps
         | 
| 99 108 |  | 
| 100 | 
            -
            ### development_steps.rb
         | 
| 101 | 
            -
             | 
| 102 | 
            -
             | 
| 109 | 
            +
            ### development_steps.rb 
         | 
| 103 110 |  | 
| 104 111 | 
             
            * **Then it should work**
         | 
| 105 112 |  | 
| 106 | 
            -
             | 
| 113 | 
            +
              Marks scenario as pending
         | 
| 107 114 |  | 
| 108 115 |  | 
| 109 116 | 
             
            * **Then debugger**
         | 
| 110 117 |  | 
| 111 | 
            -
             | 
| 118 | 
            +
              Starts debugger, or Pry if installed
         | 
| 112 119 |  | 
| 113 120 |  | 
| 114 | 
            -
            * ** | 
| 121 | 
            +
            * **Then pause**
         | 
| 115 122 |  | 
| 116 | 
            -
             | 
| 123 | 
            +
              Pauses Cucumber, but not the application (unlike "Then debugger"). From the
         | 
| 124 | 
            +
              test browser, you can interact with your application as you like.
         | 
| 117 125 |  | 
| 118 126 |  | 
| 119 | 
            -
            * **AfterStep @ | 
| 127 | 
            +
            * **AfterStep @slow**
         | 
| 120 128 |  | 
| 121 | 
            -
             | 
| 129 | 
            +
              Waits 2 seconds after each step
         | 
| 122 130 |  | 
| 123 131 |  | 
| 132 | 
            +
            * **AfterStep @single**
         | 
| 124 133 |  | 
| 125 | 
            -
             | 
| 134 | 
            +
              Waits for keypress after each step
         | 
| 126 135 |  | 
| 127 136 |  | 
| 137 | 
            +
            ### email_steps.rb 
         | 
| 128 138 |  | 
| 129 139 | 
             
            * **When I clear my e?mails**
         | 
| 130 140 |  | 
| 131 | 
            -
                
         | 
| 132 | 
            -
             | 
| 133 141 |  | 
| 134 142 | 
             
            * **Then (an|no) e?mail should have been sent with:**
         | 
| 135 143 |  | 
| 136 | 
            -
             | 
| 144 | 
            +
              Example:
         | 
| 137 145 |  | 
| 138 | 
            -
             | 
| 139 | 
            -
             | 
| 140 | 
            -
             | 
| 141 | 
            -
             | 
| 142 | 
            -
             | 
| 143 | 
            -
             | 
| 144 | 
            -
             | 
| 146 | 
            +
                  Then an email should have been sent with:
         | 
| 147 | 
            +
                    """
         | 
| 148 | 
            +
                    From: max.mustermann@example.com
         | 
| 149 | 
            +
                    Reply-To: mmuster@gmail.com
         | 
| 150 | 
            +
                    To: john.doe@example.com
         | 
| 151 | 
            +
                    Subject: The subject may contain "quotes"
         | 
| 152 | 
            +
                    Attachments: ...
         | 
| 145 153 |  | 
| 146 | 
            -
             | 
| 147 | 
            -
             | 
| 154 | 
            +
                    Message body goes here.
         | 
| 155 | 
            +
                    """
         | 
| 148 156 |  | 
| 149 157 | 
             
              You can skip lines, of course. Note that the mail body is only checked for
         | 
| 150 158 | 
             
              _inclusion_.
         | 
| @@ -152,51 +160,46 @@ The "Steps" section is autogenerated by `rake update_readme` from comments in th | |
| 152 160 |  | 
| 153 161 | 
             
            * **When I follow the (first|second|third)? link in the e?mail**
         | 
| 154 162 |  | 
| 155 | 
            -
             | 
| 163 | 
            +
              Only works after you have retrieved the mail using "Then an email should have been sent with:"
         | 
| 156 164 |  | 
| 157 165 |  | 
| 158 166 | 
             
            * **Then no e?mail should have been sent**
         | 
| 159 167 |  | 
| 160 | 
            -
                
         | 
| 161 | 
            -
             | 
| 162 168 |  | 
| 163 169 | 
             
            * **Then I should see "..." in the e?mail**
         | 
| 164 170 |  | 
| 165 | 
            -
             | 
| 171 | 
            +
              Checks that the last sent email includes some text
         | 
| 166 172 |  | 
| 167 173 |  | 
| 168 174 | 
             
            * **Then show me the e?mails**
         | 
| 169 175 |  | 
| 170 | 
            -
             | 
| 176 | 
            +
              Print all sent emails to STDOUT.
         | 
| 171 177 |  | 
| 172 178 |  | 
| 173 179 | 
             
            * **Then that e?mail should( not)? have the following lines in the body:**
         | 
| 174 180 |  | 
| 175 | 
            -
             | 
| 181 | 
            +
              Only works after you've retrieved the email using "Then an email should have been sent with:"
         | 
| 176 182 |  | 
| 177 183 | 
             
              Example:
         | 
| 178 184 |  | 
| 179 | 
            -
             | 
| 180 | 
            -
             | 
| 181 | 
            -
             | 
| 182 | 
            -
             | 
| 183 | 
            -
             | 
| 185 | 
            +
                  And that mail should have the following lines in the body:
         | 
| 186 | 
            +
                    """
         | 
| 187 | 
            +
                    All of these lines
         | 
| 188 | 
            +
                    need to be present
         | 
| 189 | 
            +
                    """
         | 
| 184 190 |  | 
| 185 191 |  | 
| 186 192 | 
             
            * **Then that e?mail should have the following body:**
         | 
| 187 193 |  | 
| 188 | 
            -
             | 
| 194 | 
            +
              Only works after you've retrieved the email using "Then an email should have been sent with:"
         | 
| 189 195 | 
             
              Checks that the text should be included in the retrieved email
         | 
| 190 196 |  | 
| 191 197 |  | 
| 192 | 
            -
             | 
| 193 | 
            -
            ### file_attachment_steps.rb
         | 
| 194 | 
            -
             | 
| 195 | 
            -
             | 
| 198 | 
            +
            ### file_attachment_steps.rb 
         | 
| 196 199 |  | 
| 197 200 | 
             
            * **Given the file "..." was attached( as (.../)?...)? to the ... above( at "...")?**
         | 
| 198 201 |  | 
| 199 | 
            -
             | 
| 202 | 
            +
              Attach a file to the given model's last record.
         | 
| 200 203 |  | 
| 201 204 | 
             
              Example (Company has a `file` attribute):
         | 
| 202 205 |  | 
| @@ -219,21 +222,16 @@ The "Steps" section is autogenerated by `rake update_readme` from comments in th | |
| 219 222 | 
             
                  Given the file "some_file" was attached to the profile above at "2011-11-11 11:11"
         | 
| 220 223 |  | 
| 221 224 |  | 
| 222 | 
            -
             | 
| 223 | 
            -
             | 
| 224 | 
            -
            ### table_steps.rb
         | 
| 225 | 
            -
             | 
| 226 | 
            -
             | 
| 225 | 
            +
            ### table_steps.rb 
         | 
| 227 226 |  | 
| 228 227 | 
             
            * **Then I should( not)? see a table with (exactly )?the following rows( in any order)?:?**
         | 
| 229 228 |  | 
| 230 | 
            -
             | 
| 229 | 
            +
              Check the content of tables in your HTML.
         | 
| 231 230 |  | 
| 232 231 | 
             
              See [this article](https://makandracards.com/makandra/763-cucumber-step-to-match-table-rows-with-capybara) for details.
         | 
| 233 232 |  | 
| 234 233 |  | 
| 235 | 
            -
             | 
| 236 | 
            -
            ### timecop_steps.rb
         | 
| 234 | 
            +
            ### timecop_steps.rb 
         | 
| 237 235 |  | 
| 238 236 | 
             
            Steps to travel through time using [Timecop](https://github.com/jtrupiano/timecop).
         | 
| 239 237 |  | 
| @@ -242,29 +240,28 @@ See [this article](https://makandracards.com/makandra/1222-useful-cucumber-steps | |
| 242 240 |  | 
| 243 241 | 
             
            * **When the (date|time) is "?(\d{4}-\d{2}-\d{2}( \d{1,2}:\d{2})?)"?**
         | 
| 244 242 |  | 
| 245 | 
            -
             | 
| 243 | 
            +
              Example:
         | 
| 246 244 |  | 
| 247 | 
            -
             | 
| 248 | 
            -
             | 
| 245 | 
            +
                  Given the date is 2012-02-10
         | 
| 246 | 
            +
                  Given the time is 2012-02-10 13:40
         | 
| 249 247 |  | 
| 250 248 |  | 
| 251 249 | 
             
            * **When the time is "?(\d{1,2}:\d{2})"?**
         | 
| 252 250 |  | 
| 253 | 
            -
             | 
| 251 | 
            +
              Example:
         | 
| 254 252 |  | 
| 255 | 
            -
             | 
| 253 | 
            +
                  Given the time is 13:40
         | 
| 256 254 |  | 
| 257 255 |  | 
| 258 256 | 
             
            * **When it is (\d+|a|some|a few) (seconds?|minutes?|hours?|days?|weeks?|months?|years?) (later|earlier)**
         | 
| 259 257 |  | 
| 260 | 
            -
             | 
| 258 | 
            +
              Example:
         | 
| 261 259 |  | 
| 262 | 
            -
             | 
| 263 | 
            -
             | 
| 264 | 
            -
             | 
| 260 | 
            +
                  When it is 10 minutes later
         | 
| 261 | 
            +
                  When it is a few hours earlier
         | 
| 265 262 |  | 
| 266 263 |  | 
| 267 | 
            -
            ### web_steps.rb
         | 
| 264 | 
            +
            ### web_steps.rb 
         | 
| 268 265 |  | 
| 269 266 | 
             
            Most of cucumber-rails' original web steps plus a few of our own.
         | 
| 270 267 |  | 
| @@ -292,183 +289,160 @@ deprecation notice. Decide for yourself whether you want to use them: | |
| 292 289 |  | 
| 293 290 | 
             
            * **When ... within ...**
         | 
| 294 291 |  | 
| 295 | 
            -
             | 
| 292 | 
            +
              You can append `within [selector]` to any other web step.
         | 
| 296 293 |  | 
| 297 294 | 
             
              Example:
         | 
| 298 295 |  | 
| 299 | 
            -
             | 
| 296 | 
            +
                  Then I should see "some text" within ".page_body"
         | 
| 300 297 |  | 
| 301 298 |  | 
| 302 299 | 
             
            * **Given I am on ...**
         | 
| 303 300 |  | 
| 304 | 
            -
                
         | 
| 305 | 
            -
             | 
| 306 301 |  | 
| 307 302 | 
             
            * **When I go to ...**
         | 
| 308 303 |  | 
| 309 | 
            -
                
         | 
| 310 | 
            -
             | 
| 311 304 |  | 
| 312 305 | 
             
            * **Then I should be on ...**
         | 
| 313 306 |  | 
| 314 | 
            -
                
         | 
| 315 | 
            -
             | 
| 316 307 |  | 
| 317 308 | 
             
            * **When I press "..."**
         | 
| 318 309 |  | 
| 319 | 
            -
                
         | 
| 320 | 
            -
             | 
| 321 310 |  | 
| 322 311 | 
             
            * **When I follow "..."**
         | 
| 323 312 |  | 
| 324 | 
            -
                
         | 
| 325 | 
            -
             | 
| 326 313 |  | 
| 327 314 | 
             
            * **When I fill in "..." (with|for) "..."**
         | 
| 328 315 |  | 
| 329 | 
            -
             | 
| 316 | 
            +
              Fill in text field
         | 
| 330 317 |  | 
| 331 318 |  | 
| 332 319 | 
             
            * **When I fill in "..." (with|for):**
         | 
| 333 320 |  | 
| 334 | 
            -
             | 
| 321 | 
            +
              Fill in text field with multi-line block
         | 
| 335 322 | 
             
              You can use a doc string to supply multi-line text
         | 
| 336 323 |  | 
| 337 324 | 
             
              Example:
         | 
| 338 325 |  | 
| 339 | 
            -
             | 
| 340 | 
            -
             | 
| 341 | 
            -
             | 
| 342 | 
            -
             | 
| 343 | 
            -
             | 
| 344 | 
            -
             | 
| 326 | 
            +
                  When I fill in "some field" with:
         | 
| 327 | 
            +
                  """
         | 
| 328 | 
            +
                  Apple
         | 
| 329 | 
            +
                  Banana
         | 
| 330 | 
            +
                  Pear
         | 
| 331 | 
            +
                  """
         | 
| 345 332 |  | 
| 346 333 |  | 
| 347 334 | 
             
            * **When I fill in "..." (with|for) '...'**
         | 
| 348 335 |  | 
| 349 | 
            -
             | 
| 336 | 
            +
              Fill in text field
         | 
| 350 337 |  | 
| 351 338 |  | 
| 352 339 | 
             
            * **When I select "..." from "..."**
         | 
| 353 340 |  | 
| 354 | 
            -
             | 
| 341 | 
            +
              Select from select box
         | 
| 355 342 |  | 
| 356 343 |  | 
| 357 344 | 
             
            * **When I check "..."**
         | 
| 358 345 |  | 
| 359 | 
            -
             | 
| 346 | 
            +
              Check a checkbox
         | 
| 360 347 |  | 
| 361 348 |  | 
| 362 349 | 
             
            * **When I uncheck "..."**
         | 
| 363 350 |  | 
| 364 | 
            -
             | 
| 351 | 
            +
              Uncheck a checkbox
         | 
| 365 352 |  | 
| 366 353 |  | 
| 367 354 | 
             
            * **When I choose "..."**
         | 
| 368 355 |  | 
| 369 | 
            -
             | 
| 356 | 
            +
              Select a radio button
         | 
| 370 357 |  | 
| 371 358 |  | 
| 372 359 | 
             
            * **When I attach the file "..." to "..."**
         | 
| 373 360 |  | 
| 374 | 
            -
             | 
| 361 | 
            +
              Attach a file to a file upload form field
         | 
| 375 362 |  | 
| 376 363 |  | 
| 377 364 | 
             
            * **Then I should see "..."**
         | 
| 378 365 |  | 
| 379 | 
            -
             | 
| 366 | 
            +
              Checks that some text appears on the page
         | 
| 380 367 |  | 
| 381 368 | 
             
              Note that this does not detect if the text might be hidden via CSS
         | 
| 382 369 |  | 
| 383 370 |  | 
| 384 371 | 
             
            * **Then I should see /.../**
         | 
| 385 372 |  | 
| 386 | 
            -
             | 
| 373 | 
            +
              Checks that a regexp appears on the page
         | 
| 387 374 |  | 
| 388 375 | 
             
              Note that this does not detect if the text might be hidden via CSS
         | 
| 389 376 |  | 
| 390 377 |  | 
| 391 378 | 
             
            * **Then I should not see "..."**
         | 
| 392 379 |  | 
| 393 | 
            -
                
         | 
| 394 | 
            -
             | 
| 395 380 |  | 
| 396 381 | 
             
            * **Then I should not see /.../**
         | 
| 397 382 |  | 
| 398 | 
            -
                
         | 
| 399 | 
            -
             | 
| 400 383 |  | 
| 401 384 | 
             
            * **Then the "..." field should (not )?contain "..."**
         | 
| 402 385 |  | 
| 403 | 
            -
             | 
| 386 | 
            +
              Checks that an input field contains some value (allowing * as wildcard character)
         | 
| 404 387 |  | 
| 405 388 |  | 
| 406 389 | 
             
            * **Then the "..." field should (not )?contain:**
         | 
| 407 390 |  | 
| 408 | 
            -
             | 
| 391 | 
            +
              Checks that a multiline textarea contains some value (allowing * as wildcard character)
         | 
| 409 392 |  | 
| 410 393 |  | 
| 411 394 | 
             
            * **Then I should see a form with the following values:**
         | 
| 412 395 |  | 
| 413 | 
            -
             | 
| 396 | 
            +
              Checks that a list of label/value pairs are visible as control inputs.
         | 
| 414 397 |  | 
| 415 398 | 
             
              Example:
         | 
| 416 399 |  | 
| 417 | 
            -
             | 
| 418 | 
            -
             | 
| 419 | 
            -
             | 
| 420 | 
            -
             | 
| 400 | 
            +
                  Then I should see a form with the following values:
         | 
| 401 | 
            +
                    | E-mail | foo@bar.com   |
         | 
| 402 | 
            +
                    | Role   | Administrator |
         | 
| 421 403 |  | 
| 422 404 |  | 
| 423 405 | 
             
            * **Then the "..." field should have the error "..."**
         | 
| 424 406 |  | 
| 425 | 
            -
             | 
| 407 | 
            +
              Checks that an input field was wrapped with a validation error
         | 
| 426 408 |  | 
| 427 409 |  | 
| 428 410 | 
             
            * **Then the "..." field should( not)? have an error**
         | 
| 429 411 |  | 
| 430 | 
            -
                
         | 
| 431 | 
            -
             | 
| 432 412 |  | 
| 433 413 | 
             
            * **Then the "..." field should have no error**
         | 
| 434 414 |  | 
| 435 | 
            -
                
         | 
| 436 | 
            -
             | 
| 437 415 |  | 
| 438 416 | 
             
            * **Then the "..." checkbox should( not)? be checked**
         | 
| 439 417 |  | 
| 440 | 
            -
                
         | 
| 441 | 
            -
             | 
| 442 418 |  | 
| 443 419 | 
             
            * **Then the radio button "..." should( not)? be (checked|selected)**
         | 
| 444 420 |  | 
| 445 | 
            -
                
         | 
| 446 | 
            -
             | 
| 447 421 |  | 
| 448 422 | 
             
            * **Then I should have the following query string:**
         | 
| 449 423 |  | 
| 450 | 
            -
             | 
| 424 | 
            +
              Example:
         | 
| 451 425 |  | 
| 452 | 
            -
             | 
| 453 | 
            -
             | 
| 454 | 
            -
             | 
| 426 | 
            +
                  I should have the following query string:
         | 
| 427 | 
            +
                    | locale        | de  |
         | 
| 428 | 
            +
                    | currency_code | EUR |
         | 
| 455 429 |  | 
| 456 430 | 
             
              Succeeds when the URL contains the given `locale` and `currency_code` params
         | 
| 457 431 |  | 
| 458 432 |  | 
| 459 433 | 
             
            * **Then show me the page**
         | 
| 460 434 |  | 
| 461 | 
            -
             | 
| 435 | 
            +
              Open the current Capybara page using the `launchy` gem
         | 
| 462 436 |  | 
| 463 437 |  | 
| 464 438 | 
             
            * **Then I should( not)? see a field "..."**
         | 
| 465 439 |  | 
| 466 | 
            -
             | 
| 440 | 
            +
              Checks for the existance of an input field (given its id or label)
         | 
| 467 441 |  | 
| 468 442 |  | 
| 469 443 | 
             
            * **Then I should( not)? see the (number|amount) ([\-\d,\.]+)( ...)?**
         | 
| 470 444 |  | 
| 471 | 
            -
             | 
| 445 | 
            +
              Use this step to test for a number or money amount instead of a simple `Then I should see`
         | 
| 472 446 |  | 
| 473 447 | 
             
              Checks for an unexpected minus sign, correct decimal places etc.
         | 
| 474 448 |  | 
| @@ -477,65 +451,57 @@ deprecation notice. Decide for yourself whether you want to use them: | |
| 477 451 |  | 
| 478 452 | 
             
            * **Then I should get a response with content-type "..."**
         | 
| 479 453 |  | 
| 480 | 
            -
             | 
| 454 | 
            +
              Checks `Content-Type` HTTP header
         | 
| 481 455 |  | 
| 482 456 |  | 
| 483 457 | 
             
            * **Then I should get a download with filename "..."**
         | 
| 484 458 |  | 
| 485 | 
            -
             | 
| 459 | 
            +
              Checks `Content-Disposition` HTTP header
         | 
| 486 460 |  | 
| 487 461 | 
             
              Attention: Doesn't work with Selenium, see https://github.com/jnicklas/capybara#gotchas
         | 
| 488 462 |  | 
| 489 463 |  | 
| 490 464 | 
             
            * **Then "..." should be selected for "..."**
         | 
| 491 465 |  | 
| 492 | 
            -
             | 
| 466 | 
            +
              Checks that a certain option is selected for a text field
         | 
| 493 467 |  | 
| 494 468 |  | 
| 495 469 | 
             
            * **Then nothing should be selected for "..."**
         | 
| 496 470 |  | 
| 497 | 
            -
                
         | 
| 498 | 
            -
             | 
| 499 471 |  | 
| 500 472 | 
             
            * **Then "..." should( not)? be an option for "..."**
         | 
| 501 473 |  | 
| 502 | 
            -
             | 
| 474 | 
            +
              Checks for the presence of an option in a select
         | 
| 503 475 |  | 
| 504 476 |  | 
| 505 477 | 
             
            * **Then I should see '...'**
         | 
| 506 478 |  | 
| 507 | 
            -
             | 
| 479 | 
            +
              Like `Then I should see`, but with single instead of double quotes. In case
         | 
| 508 480 | 
             
              the expected string contains quotes as well.
         | 
| 509 481 |  | 
| 510 482 |  | 
| 511 483 | 
             
            * **Then I should see "..." in the HTML**
         | 
| 512 484 |  | 
| 513 | 
            -
             | 
| 485 | 
            +
              Check that the raw HTML contains a string
         | 
| 514 486 |  | 
| 515 487 |  | 
| 516 488 | 
             
            * **Then I should not see "..." in the HTML**
         | 
| 517 489 |  | 
| 518 | 
            -
                
         | 
| 519 | 
            -
             | 
| 520 490 |  | 
| 521 491 | 
             
            * **Then I should see an error**
         | 
| 522 492 |  | 
| 523 | 
            -
             | 
| 493 | 
            +
              Checks that status code is 400..599
         | 
| 524 494 |  | 
| 525 495 |  | 
| 526 496 | 
             
            * **Then the window should be titled "..."**
         | 
| 527 497 |  | 
| 528 | 
            -
                
         | 
| 529 | 
            -
             | 
| 530 498 |  | 
| 531 499 | 
             
            * **When I reload the page**
         | 
| 532 500 |  | 
| 533 | 
            -
                
         | 
| 534 | 
            -
             | 
| 535 501 |  | 
| 536 502 | 
             
            * **Then (the tag )?"..." should( not)? be visible**
         | 
| 537 503 |  | 
| 538 | 
            -
             | 
| 504 | 
            +
              Checks that an element is actually present and visible, also considering styles.
         | 
| 539 505 | 
             
              Within a selenium test, the browser is asked whether the element is really visible
         | 
| 540 506 | 
             
              In a non-selenium test, we only check for `.hidden`, `.invisible` or `style: display:none`
         | 
| 541 507 |  | 
| @@ -546,14 +512,14 @@ deprecation notice. Decide for yourself whether you want to use them: | |
| 546 512 |  | 
| 547 513 | 
             
            * **Then (the tag )?"..." should be hidden**
         | 
| 548 514 |  | 
| 549 | 
            -
             | 
| 515 | 
            +
              Checks that an element is actually present and hidden, also considering styles.
         | 
| 550 516 | 
             
              Within a selenium test, the browser is asked whether the element is really hidden.
         | 
| 551 517 | 
             
              In a non-selenium test, we only check for `.hidden`, `.invisible` or `style: display:none`
         | 
| 552 518 |  | 
| 553 519 |  | 
| 554 520 | 
             
            * **When I click on "..."**
         | 
| 555 521 |  | 
| 556 | 
            -
             | 
| 522 | 
            +
              Click on some text that might not be a link.
         | 
| 557 523 |  | 
| 558 524 | 
             
              Example:
         | 
| 559 525 |  | 
| @@ -563,7 +529,7 @@ deprecation notice. Decide for yourself whether you want to use them: | |
| 563 529 |  | 
| 564 530 | 
             
            * **When I click on the element "..."**
         | 
| 565 531 |  | 
| 566 | 
            -
             | 
| 532 | 
            +
              Click on an element with the given selector.
         | 
| 567 533 |  | 
| 568 534 | 
             
              Example:
         | 
| 569 535 |  | 
| @@ -573,7 +539,7 @@ deprecation notice. Decide for yourself whether you want to use them: | |
| 573 539 |  | 
| 574 540 | 
             
            * **When I click on the element for ...**
         | 
| 575 541 |  | 
| 576 | 
            -
             | 
| 542 | 
            +
              Click on the element with the given [selector alias](https://github.com/makandra/spreewald/blob/master/examples/selectors.rb).
         | 
| 577 543 |  | 
| 578 544 | 
             
              Example:
         | 
| 579 545 |  | 
| @@ -582,7 +548,7 @@ deprecation notice. Decide for yourself whether you want to use them: | |
| 582 548 |  | 
| 583 549 | 
             
            * **Then "..." should link to "..."**
         | 
| 584 550 |  | 
| 585 | 
            -
             | 
| 551 | 
            +
              Use this step to check external links.
         | 
| 586 552 |  | 
| 587 553 | 
             
              Example:
         | 
| 588 554 |  | 
| @@ -593,10 +559,9 @@ deprecation notice. Decide for yourself whether you want to use them: | |
| 593 559 | 
             
                     got: "http://makandra.com/" (using =~)
         | 
| 594 560 |  | 
| 595 561 |  | 
| 596 | 
            -
             | 
| 597 562 | 
             
            * **Then I should (not )?see (an|the) element "..."**
         | 
| 598 563 |  | 
| 599 | 
            -
             | 
| 564 | 
            +
              Check that an element with the given selector is present on the page.
         | 
| 600 565 |  | 
| 601 566 | 
             
              Example:
         | 
| 602 567 |  | 
| @@ -606,10 +571,9 @@ deprecation notice. Decide for yourself whether you want to use them: | |
| 606 571 | 
             
                  Then I should not see the element ".sidebar"
         | 
| 607 572 |  | 
| 608 573 |  | 
| 609 | 
            -
             | 
| 610 574 | 
             
            * **Then I should (not )?see (an|the) element for ...**
         | 
| 611 575 |  | 
| 612 | 
            -
             | 
| 576 | 
            +
              Check that an element with the given [selector alias](https://github.com/makandra/spreewald/blob/master/examples/selectors.rb) is present on the page.
         | 
| 613 577 |  | 
| 614 578 | 
             
              Example:
         | 
| 615 579 |  | 
| @@ -619,98 +583,82 @@ deprecation notice. Decide for yourself whether you want to use them: | |
| 619 583 | 
             
                  Then I should not see the element for the sidebar
         | 
| 620 584 |  | 
| 621 585 |  | 
| 622 | 
            -
             | 
| 623 586 | 
             
            * **Then I should get a text response**
         | 
| 624 587 |  | 
| 625 | 
            -
             | 
| 588 | 
            +
              Checks that the result has content type `text/plain`
         | 
| 626 589 |  | 
| 627 590 |  | 
| 628 591 | 
             
            * **When I follow "..." inside any "..."**
         | 
| 629 592 |  | 
| 630 | 
            -
             | 
| 593 | 
            +
              Click a link within an element matching the given selector. Will try to be clever
         | 
| 631 594 | 
             
              and disregard elements that don't contain a matching link.
         | 
| 632 595 |  | 
| 633 596 | 
             
              Example:
         | 
| 634 597 |  | 
| 635 | 
            -
             | 
| 636 | 
            -
             | 
| 598 | 
            +
                  When I follow "Read more" inside any ".text_snippet"
         | 
| 637 599 |  | 
| 638 600 |  | 
| 639 601 | 
             
            * **Then I should( not)? see "..." inside any "..."**
         | 
| 640 602 |  | 
| 641 | 
            -
                
         | 
| 642 | 
            -
             | 
| 643 603 |  | 
| 644 604 | 
             
            * **When I fill in "..." with "..." inside any "..."**
         | 
| 645 605 |  | 
| 646 | 
            -
                
         | 
| 647 | 
            -
             | 
| 648 606 |  | 
| 649 607 | 
             
            * **When I confirm the browser dialog**
         | 
| 650 608 |  | 
| 651 | 
            -
                
         | 
| 652 | 
            -
             | 
| 653 609 |  | 
| 654 610 | 
             
            * **When I cancel the browser dialog**
         | 
| 655 611 |  | 
| 656 | 
            -
                
         | 
| 657 | 
            -
             | 
| 658 612 |  | 
| 659 613 | 
             
            * **When I enter "..." into the browser dialog**
         | 
| 660 614 |  | 
| 661 | 
            -
                
         | 
| 662 | 
            -
             | 
| 663 615 |  | 
| 664 616 | 
             
            * **When I switch to the new tab**
         | 
| 665 617 |  | 
| 666 | 
            -
                
         | 
| 667 | 
            -
             | 
| 668 618 |  | 
| 669 619 | 
             
            * **Then I should see in this order:?**
         | 
| 670 620 |  | 
| 671 | 
            -
             | 
| 621 | 
            +
              Checks that these strings are rendered in the given order in a single line or in multiple lines
         | 
| 672 622 |  | 
| 673 623 | 
             
              Example:
         | 
| 674 624 |  | 
| 675 | 
            -
             | 
| 676 | 
            -
             | 
| 677 | 
            -
             | 
| 678 | 
            -
             | 
| 679 | 
            -
             | 
| 680 | 
            -
             | 
| 625 | 
            +
                  Then I should see in this order:
         | 
| 626 | 
            +
                    | Alpha Group |
         | 
| 627 | 
            +
                    | Augsburg    |
         | 
| 628 | 
            +
                    | Berlin      |
         | 
| 629 | 
            +
                    | Beta Group  |
         | 
| 681 630 |  | 
| 682 631 |  | 
| 683 632 | 
             
            * **Then the "..." (field|button) should( not)? be disabled**
         | 
| 684 633 |  | 
| 685 | 
            -
             | 
| 634 | 
            +
              Tests that an input or button with the given label is disabled.
         | 
| 686 635 |  | 
| 687 636 |  | 
| 688 637 | 
             
            * **Then the "..." field should( not)? be visible**
         | 
| 689 638 |  | 
| 690 | 
            -
             | 
| 639 | 
            +
              Tests that a field with the given label is visible.
         | 
| 691 640 |  | 
| 692 641 |  | 
| 693 642 | 
             
            * **When I wait for the page to load**
         | 
| 694 643 |  | 
| 695 | 
            -
             | 
| 644 | 
            +
              Waits for the page to finish loading and AJAX requests to finish.
         | 
| 696 645 |  | 
| 697 646 | 
             
              More details [here](https://makandracards.com/makandra/12139-waiting-for-page-loads-and-ajax-requests-to-finish-with-capybara).
         | 
| 698 647 |  | 
| 699 648 |  | 
| 700 649 | 
             
            * **When I perform basic authentication as ".../..." and go to ...**
         | 
| 701 650 |  | 
| 702 | 
            -
             | 
| 651 | 
            +
              Performs HTTP basic authentication with the given credentials and visits the given path.
         | 
| 703 652 |  | 
| 704 653 | 
             
              More details [here](https://makandracards.com/makandra/971-perform-http-basic-authentication-in-cucumber).
         | 
| 705 654 |  | 
| 706 655 |  | 
| 707 656 | 
             
            * **When I go back**
         | 
| 708 657 |  | 
| 709 | 
            -
             | 
| 658 | 
            +
              Goes to the previously viewed page.
         | 
| 710 659 |  | 
| 711 660 |  | 
| 712 661 | 
             
            * **Then the "..." select should( not)? be sorted**
         | 
| 713 662 |  | 
| 714 | 
            -
             | 
| 663 | 
            +
              Tests whether a select field is sorted. Uses Array#natural_sort, if defined;
         | 
| 715 664 | 
             
              Array#sort else.
         | 
| 716 | 
            -
             | 
    
        data/Rakefile
    CHANGED
    
    | @@ -6,6 +6,7 @@ task :default => 'all:rubies' | |
| 6 6 |  | 
| 7 7 | 
             
            desc 'Update the "Steps" section of the README'
         | 
| 8 8 | 
             
            task :update_readme do
         | 
| 9 | 
            +
              readme_path = 'README.md'
         | 
| 9 10 | 
             
              if Kernel.respond_to? :require_relative
         | 
| 10 11 | 
             
                require_relative './support/step_manager'
         | 
| 11 12 | 
             
              else
         | 
| @@ -16,7 +17,10 @@ task :update_readme do | |
| 16 17 | 
             
              start_of_steps_section = readme =~ /^## Steps/
         | 
| 17 18 | 
             
              length_of_steps_section = (readme[(start_of_steps_section+1)..-1] =~ /^##[^#]/) || readme.size - start_of_steps_section
         | 
| 18 19 | 
             
              readme[start_of_steps_section, length_of_steps_section] = "## Steps\n\n" + StepManager.new('lib/spreewald').to_markdown
         | 
| 19 | 
            -
              File.open( | 
| 20 | 
            +
              File.open(readme_path, 'w') { |f| f.write(readme) }
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              system "git diff #{readme_path}"
         | 
| 23 | 
            +
              puts '', '> Done (see diff above).'
         | 
| 20 24 | 
             
            end
         | 
| 21 25 |  | 
| 22 26 | 
             
            namespace :all do
         | 
| @@ -16,6 +16,13 @@ Then /^debugger$/ do | |
| 16 16 | 
             
              true # Ruby will halt in this line
         | 
| 17 17 | 
             
            end.overridable
         | 
| 18 18 |  | 
| 19 | 
            +
            # Pauses Cucumber, but not the application (unlike "Then debugger"). From the
         | 
| 20 | 
            +
            # test browser, you can interact with your application as you like.
         | 
| 21 | 
            +
            Then /^pause$/ do
         | 
| 22 | 
            +
              print 'Paused. Continue?'
         | 
| 23 | 
            +
              STDIN.getc
         | 
| 24 | 
            +
            end.overridable
         | 
| 25 | 
            +
             | 
| 19 26 | 
             
            # Waits 2 seconds after each step
         | 
| 20 27 | 
             
            AfterStep('@slow-motion') do
         | 
| 21 28 | 
             
              sleep 2
         | 
| @@ -12,16 +12,16 @@ end.overridable | |
| 12 12 |  | 
| 13 13 | 
             
            # Example:
         | 
| 14 14 | 
             
            #
         | 
| 15 | 
            -
            # | 
| 16 | 
            -
            # | 
| 17 | 
            -
            # | 
| 18 | 
            -
            # | 
| 19 | 
            -
            # | 
| 20 | 
            -
            # | 
| 21 | 
            -
            # | 
| 15 | 
            +
            #     Then an email should have been sent with:
         | 
| 16 | 
            +
            #       """
         | 
| 17 | 
            +
            #       From: max.mustermann@example.com
         | 
| 18 | 
            +
            #       Reply-To: mmuster@gmail.com
         | 
| 19 | 
            +
            #       To: john.doe@example.com
         | 
| 20 | 
            +
            #       Subject: The subject may contain "quotes"
         | 
| 21 | 
            +
            #       Attachments: ...
         | 
| 22 22 | 
             
            #
         | 
| 23 | 
            -
            # | 
| 24 | 
            -
            # | 
| 23 | 
            +
            #       Message body goes here.
         | 
| 24 | 
            +
            #       """
         | 
| 25 25 | 
             
            #
         | 
| 26 26 | 
             
            # You can skip lines, of course. Note that the mail body is only checked for
         | 
| 27 27 | 
             
            # _inclusion_.
         | 
| @@ -97,11 +97,11 @@ end.overridable | |
| 97 97 | 
             
            #
         | 
| 98 98 | 
             
            # Example:
         | 
| 99 99 | 
             
            #
         | 
| 100 | 
            -
            # | 
| 101 | 
            -
            # | 
| 102 | 
            -
            # | 
| 103 | 
            -
            # | 
| 104 | 
            -
            # | 
| 100 | 
            +
            #     And that mail should have the following lines in the body:
         | 
| 101 | 
            +
            #       """
         | 
| 102 | 
            +
            #       All of these lines
         | 
| 103 | 
            +
            #       need to be present
         | 
| 104 | 
            +
            #       """
         | 
| 105 105 | 
             
            Then /^that e?mail should( not)? have the following lines in the body:$/ do |negate, body|
         | 
| 106 106 | 
             
              expectation = negate ? 'should_not' : 'should'
         | 
| 107 107 | 
             
              email_text_body = MailFinder.email_text_body(@mail)
         | 
| @@ -19,7 +19,6 @@ | |
| 19 19 | 
             
            # To simultaneously set the `updated_at` timestamp:
         | 
| 20 20 | 
             
            #
         | 
| 21 21 | 
             
            #     Given the file "some_file" was attached to the profile above at "2011-11-11 11:11"
         | 
| 22 | 
            -
            #
         | 
| 23 22 | 
             
            Given /^the file "([^"]*)" was attached(?: as (?:([^"]*)\/)?([^"]*))? to the ([^"]*) above(?: at "([^"]*)")?$/ do
         | 
| 24 23 | 
             
              |path_to_file, container_name, relation_name, model_name, time_string|
         | 
| 25 24 |  | 
| @@ -42,23 +42,23 @@ if defined?(Timecop) | |
| 42 42 |  | 
| 43 43 | 
             
              # Example:
         | 
| 44 44 | 
             
              #
         | 
| 45 | 
            -
              # | 
| 46 | 
            -
              # | 
| 45 | 
            +
              #     Given the date is 2012-02-10
         | 
| 46 | 
            +
              #     Given the time is 2012-02-10 13:40
         | 
| 47 47 | 
             
              When /^the (?:date|time) is "?(\d{4}-\d{2}-\d{2}(?: \d{1,2}:\d{2})?)"?$/ do |time|
         | 
| 48 48 | 
             
                Timecop.travel(parse_time(time))
         | 
| 49 49 | 
             
              end.overridable
         | 
| 50 50 |  | 
| 51 51 | 
             
              # Example:
         | 
| 52 52 | 
             
              #
         | 
| 53 | 
            -
              # | 
| 53 | 
            +
              #     Given the time is 13:40
         | 
| 54 54 | 
             
              When /^the time is "?(\d{1,2}:\d{2})"?$/ do |time_without_date|
         | 
| 55 55 | 
             
                Timecop.travel(parse_time(time_without_date)) # date will be today
         | 
| 56 56 | 
             
              end.overridable
         | 
| 57 57 |  | 
| 58 58 | 
             
              # Example:
         | 
| 59 59 | 
             
              #
         | 
| 60 | 
            -
              # | 
| 61 | 
            -
              # | 
| 60 | 
            +
              #     When it is 10 minutes later
         | 
| 61 | 
            +
              #     When it is a few hours earlier
         | 
| 62 62 | 
             
              When /^it is (\d+|a|some|a few) (seconds?|minutes?|hours?|days?|weeks?|months?|years?) (later|earlier)$/ do |amount, unit, direction|
         | 
| 63 63 | 
             
                amount = case amount
         | 
| 64 64 | 
             
                  when 'a'
         | 
    
        data/lib/spreewald/web_steps.rb
    CHANGED
    
    | @@ -33,11 +33,11 @@ require 'uri' | |
| 33 33 | 
             
            require 'cgi'
         | 
| 34 34 |  | 
| 35 35 |  | 
| 36 | 
            -
            # You can append `within [selector]` to any other web step
         | 
| 36 | 
            +
            # You can append `within [selector]` to any other web step.
         | 
| 37 37 | 
             
            #
         | 
| 38 38 | 
             
            # Example:
         | 
| 39 39 | 
             
            #
         | 
| 40 | 
            -
            # | 
| 40 | 
            +
            #     Then I should see "some text" within ".page_body"
         | 
| 41 41 | 
             
            When /^(.*) within (.*[^:])$/ do |nested_step, parent|
         | 
| 42 42 | 
             
              patiently do
         | 
| 43 43 | 
             
                with_scope(parent) { step(nested_step) }
         | 
| @@ -99,12 +99,12 @@ end.overridable | |
| 99 99 | 
             
            #
         | 
| 100 100 | 
             
            # Example:
         | 
| 101 101 | 
             
            #
         | 
| 102 | 
            -
            # | 
| 103 | 
            -
            # | 
| 104 | 
            -
            # | 
| 105 | 
            -
            # | 
| 106 | 
            -
            # | 
| 107 | 
            -
            # | 
| 102 | 
            +
            #     When I fill in "some field" with:
         | 
| 103 | 
            +
            #     """
         | 
| 104 | 
            +
            #     Apple
         | 
| 105 | 
            +
            #     Banana
         | 
| 106 | 
            +
            #     Pear
         | 
| 107 | 
            +
            #     """
         | 
| 108 108 | 
             
            When /^(?:|I )fill in "([^"]*)" (?:with|for):$/ do |field, value|
         | 
| 109 109 | 
             
              patiently do
         | 
| 110 110 | 
             
                fill_in(field, :with => value)
         | 
| @@ -218,10 +218,9 @@ end.overridable | |
| 218 218 | 
             
            #
         | 
| 219 219 | 
             
            # Example:
         | 
| 220 220 | 
             
            #
         | 
| 221 | 
            -
            # | 
| 222 | 
            -
            # | 
| 223 | 
            -
            # | 
| 224 | 
            -
            #
         | 
| 221 | 
            +
            #     Then I should see a form with the following values:
         | 
| 222 | 
            +
            #       | E-mail | foo@bar.com   |
         | 
| 223 | 
            +
            #       | Role   | Administrator |
         | 
| 225 224 | 
             
            Then /^I should see a form with the following values:$/ do |table|
         | 
| 226 225 | 
             
              expectations = table.raw
         | 
| 227 226 | 
             
              expectations.each do |label, expected_value|
         | 
| @@ -285,9 +284,9 @@ end.overridable | |
| 285 284 |  | 
| 286 285 | 
             
            # Example:
         | 
| 287 286 | 
             
            #
         | 
| 288 | 
            -
            # | 
| 289 | 
            -
            # | 
| 290 | 
            -
            # | 
| 287 | 
            +
            #     I should have the following query string:
         | 
| 288 | 
            +
            #       | locale        | de  |
         | 
| 289 | 
            +
            #       | currency_code | EUR |
         | 
| 291 290 | 
             
            #
         | 
| 292 291 | 
             
            # Succeeds when the URL contains the given `locale` and `currency_code` params
         | 
| 293 292 | 
             
            Then /^(?:|I )should have the following query string:$/ do |expected_pairs|
         | 
| @@ -496,7 +495,6 @@ end.overridable | |
| 496 495 | 
             
            # Don't forget the trailing slash. Otherwise you'll get the error 
         | 
| 497 496 | 
             
            #   expected: /http:\/\/makandra.com(\?[^\/]*)?$/
         | 
| 498 497 | 
             
            #        got: "http://makandra.com/" (using =~)
         | 
| 499 | 
            -
            #
         | 
| 500 498 | 
             
            Then /^"([^"]*)" should link to "([^"]*)"$/ do |link_label, target|
         | 
| 501 499 | 
             
              patiently do
         | 
| 502 500 | 
             
                link = find_link(link_label)
         | 
| @@ -512,7 +510,6 @@ end.overridable | |
| 512 510 | 
             
            #     Then I should see the element ".panel"
         | 
| 513 511 | 
             
            #     Then I should not see an element ".sidebar"
         | 
| 514 512 | 
             
            #     Then I should not see the element ".sidebar"
         | 
| 515 | 
            -
            #
         | 
| 516 513 | 
             
            Then /^I should (not )?see (?:an|the) element "([^"]+)"$/ do |negate, selector|
         | 
| 517 514 | 
             
              expectation = negate ? :should_not : :should
         | 
| 518 515 | 
             
              patiently do
         | 
| @@ -528,7 +525,6 @@ end.overridable | |
| 528 525 | 
             
            #     Then I should see the element for the panel
         | 
| 529 526 | 
             
            #     Then I should not see an element for the sidebar
         | 
| 530 527 | 
             
            #     Then I should not see the element for the sidebar
         | 
| 531 | 
            -
            #
         | 
| 532 528 | 
             
            Then /^I should (not )?see (?:an|the) element for (.*?)$/ do |negate, locator|
         | 
| 533 529 | 
             
              expectation = negate ? :should_not : :should
         | 
| 534 530 | 
             
              selector = _selector_for(locator)
         | 
| @@ -548,8 +544,7 @@ end.overridable | |
| 548 544 | 
             
            #
         | 
| 549 545 | 
             
            # Example:
         | 
| 550 546 | 
             
            #
         | 
| 551 | 
            -
            # | 
| 552 | 
            -
            #
         | 
| 547 | 
            +
            #     When I follow "Read more" inside any ".text_snippet"
         | 
| 553 548 | 
             
            When /^I follow "([^"]*)" inside any "([^"]*)"$/ do |label, selector|
         | 
| 554 549 | 
             
              node = find("#{selector} a", :text => label)
         | 
| 555 550 | 
             
              node.click
         | 
| @@ -602,12 +597,11 @@ end.overridable | |
| 602 597 | 
             
            #
         | 
| 603 598 | 
             
            # Example:
         | 
| 604 599 | 
             
            #
         | 
| 605 | 
            -
            # | 
| 606 | 
            -
            # | 
| 607 | 
            -
            # | 
| 608 | 
            -
            # | 
| 609 | 
            -
            # | 
| 610 | 
            -
            #
         | 
| 600 | 
            +
            #     Then I should see in this order:
         | 
| 601 | 
            +
            #       | Alpha Group |
         | 
| 602 | 
            +
            #       | Augsburg    |
         | 
| 603 | 
            +
            #       | Berlin      |
         | 
| 604 | 
            +
            #       | Beta Group  |
         | 
| 611 605 | 
             
            Then /^I should see in this order:?$/ do |text|
         | 
| 612 606 | 
             
              if text.is_a?(String)
         | 
| 613 607 | 
             
                lines = text.split(/\n/)
         | 
    
        data/support/parser.rb
    CHANGED
    
    | @@ -19,7 +19,9 @@ class Parser | |
| 19 19 | 
             
                comment.gsub! /.*coding:.*UTF-8.*/, ''
         | 
| 20 20 | 
             
                comment.strip!
         | 
| 21 21 | 
             
                comment_lines = comment.split("\n").take_while { |line| line =~ /^\s*#/ }
         | 
| 22 | 
            -
                comment_lines && comment_lines.join("\n").gsub(/^\s*# ?/, '')
         | 
| 22 | 
            +
                formatted = comment_lines && comment_lines.join("\n").gsub(/^\s*# ?/, '')
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                formatted if formatted and not formatted.empty?
         | 
| 23 25 | 
             
              end
         | 
| 24 26 |  | 
| 25 27 | 
             
            end
         | 
    
        data/support/step_definition.rb
    CHANGED
    
    | @@ -22,11 +22,11 @@ class StepDefinition | |
| 22 22 | 
             
              end
         | 
| 23 23 |  | 
| 24 24 | 
             
              def to_markdown
         | 
| 25 | 
            -
                 | 
| 26 | 
            -
             | 
| 25 | 
            +
                spaced_comment = if comment
         | 
| 26 | 
            +
                  "\n\n" + comment.gsub(/^/, '  ')
         | 
| 27 | 
            +
                end
         | 
| 27 28 |  | 
| 28 | 
            -
             | 
| 29 | 
            -
                TEXT
         | 
| 29 | 
            +
                %(* **#{kind} #{pretty_step}**#{spaced_comment})
         | 
| 30 30 | 
             
              end
         | 
| 31 31 |  | 
| 32 32 | 
             
              def to_s
         | 
| @@ -16,12 +16,12 @@ class StepDefinitionFile | |
| 16 16 | 
             
              end
         | 
| 17 17 |  | 
| 18 18 | 
             
              def to_markdown
         | 
| 19 | 
            -
                 | 
| 20 | 
            -
            ### #{ @filename.split('/').last }
         | 
| 19 | 
            +
                spaced_comment = "\n\n" + @comment if @comment
         | 
| 21 20 |  | 
| 22 | 
            -
             | 
| 21 | 
            +
                <<-TEXT
         | 
| 22 | 
            +
            ### #{ @filename.split('/').last } #{spaced_comment}
         | 
| 23 23 |  | 
| 24 | 
            -
            #{ steps.collect(&:to_markdown).join("\n\n") }
         | 
| 24 | 
            +
            #{ steps.collect(&:to_markdown).join("\n\n\n") }
         | 
| 25 25 | 
             
                TEXT
         | 
| 26 26 | 
             
              end
         | 
| 27 27 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: spreewald
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.7.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Tobias Kraze
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2016-12- | 
| 11 | 
            +
            date: 2016-12-13 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: cucumber
         |