cuki 0.0.8 → 0.0.9
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.rdoc +26 -18
 - data/VERSION +1 -1
 - data/cuki.gemspec +2 -2
 - data/cuki.yaml.sample +3 -2
 - data/features/pull/pull.feature +8 -0
 - data/features/pull/splitting.feature +45 -2
 - data/lib/cuki.rb +18 -4
 - metadata +4 -4
 
    
        data/README.rdoc
    CHANGED
    
    | 
         @@ -2,14 +2,13 @@ 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            Cuki provides an easy way to import acceptance criteria from a Confluence wiki into Cucumber feature files
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
            * Assign tags to a feature based on the wiki page content
         
     | 
| 
      
 5 
     | 
    
         
            +
            - Supports a mapping between Confluence pages and feature files
         
     | 
| 
      
 6 
     | 
    
         
            +
            - Converts Confluence tables to Cucumber tables
         
     | 
| 
      
 7 
     | 
    
         
            +
            - Strips out unnecessary Confluence formatting (headers, etc.)
         
     | 
| 
      
 8 
     | 
    
         
            +
            - Includes a link back to the original Confluence page
         
     | 
| 
      
 9 
     | 
    
         
            +
            - Formats the feature using Cucumber's auto-formatter (optional)
         
     | 
| 
      
 10 
     | 
    
         
            +
            - Support client SSL certificates for use within an organisation's secure intranet
         
     | 
| 
      
 11 
     | 
    
         
            +
            - Assign tags to a feature based on the wiki page content
         
     | 
| 
       13 
12 
     | 
    
         | 
| 
       14 
13 
     | 
    
         
             
            It can be used as part of a CI process or just for ad-hoc imports.
         
     | 
| 
       15 
14 
     | 
    
         | 
| 
         @@ -23,6 +22,15 @@ Require the gem in your Gemfile: 
     | 
|
| 
       23 
22 
     | 
    
         | 
| 
       24 
23 
     | 
    
         
             
            Cuki expects a configuration file in config/cuki.yml. See the sample provided.
         
     | 
| 
       25 
24 
     | 
    
         | 
| 
      
 25 
     | 
    
         
            +
            You can have a one-to-one association between Confluences pages, or you can split a single Confluence
         
     | 
| 
      
 26 
     | 
    
         
            +
            pages into multiple features. The splitter is a little fussy about structure, it must be:
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                h1. Acceptance Criteria
         
     | 
| 
      
 29 
     | 
    
         
            +
              
         
     | 
| 
      
 30 
     | 
    
         
            +
                h2. Feature Name
         
     | 
| 
      
 31 
     | 
    
         
            +
              
         
     | 
| 
      
 32 
     | 
    
         
            +
                h2. Another Feature Name
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
       26 
34 
     | 
    
         
             
            == Usage
         
     | 
| 
       27 
35 
     | 
    
         | 
| 
       28 
36 
     | 
    
         
             
            Run it from the command line:
         
     | 
| 
         @@ -39,21 +47,21 @@ You can also pull a single feature: 
     | 
|
| 
       39 
47 
     | 
    
         | 
| 
       40 
48 
     | 
    
         
             
            == Options
         
     | 
| 
       41 
49 
     | 
    
         | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
      
 50 
     | 
    
         
            +
            - SKIP_AUTOFORMAT to avoid reformatting features (runs over the whole features directory)
         
     | 
| 
      
 51 
     | 
    
         
            +
            - PEM=/path/to/something.pem.cer (for client certificates)
         
     | 
| 
      
 52 
     | 
    
         
            +
            - CER=/path/to/something.pem (for client certificates)
         
     | 
| 
       45 
53 
     | 
    
         | 
| 
       46 
     | 
    
         
            -
            == Known Issues and  
     | 
| 
      
 54 
     | 
    
         
            +
            == Known Issues and Limitations
         
     | 
| 
       47 
55 
     | 
    
         | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
             
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
      
 56 
     | 
    
         
            +
            - Will only work with Confluence setups which have no password, or use client certificates for authentcation
         
     | 
| 
      
 57 
     | 
    
         
            +
            - Only provides one-way sync, i.e. you can't edit a file locally and push it to Confluence
         
     | 
| 
      
 58 
     | 
    
         
            +
            - Fails if the AC block is the last H1 section of the page
         
     | 
| 
      
 59 
     | 
    
         
            +
            - Should fail if no features found in container block
         
     | 
| 
       52 
60 
     | 
    
         | 
| 
       53 
61 
     | 
    
         
             
            == TODO
         
     | 
| 
       54 
62 
     | 
    
         | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
      
 63 
     | 
    
         
            +
            - Handle links
         
     | 
| 
      
 64 
     | 
    
         
            +
            - Support for pushing features to Confluence (roundtrip editing)
         
     | 
| 
       57 
65 
     | 
    
         | 
| 
       58 
66 
     | 
    
         
             
            == Copyright
         
     | 
| 
       59 
67 
     | 
    
         | 
    
        data/VERSION
    CHANGED
    
    | 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            0.0. 
     | 
| 
      
 1 
     | 
    
         
            +
            0.0.9
         
     | 
    
        data/cuki.gemspec
    CHANGED
    
    | 
         @@ -5,11 +5,11 @@ 
     | 
|
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            Gem::Specification.new do |s|
         
     | 
| 
       7 
7 
     | 
    
         
             
              s.name = "cuki"
         
     | 
| 
       8 
     | 
    
         
            -
              s.version = "0.0. 
     | 
| 
      
 8 
     | 
    
         
            +
              s.version = "0.0.9"
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         
     | 
| 
       11 
11 
     | 
    
         
             
              s.authors = ["Andy Waite"]
         
     | 
| 
       12 
     | 
    
         
            -
              s.date = "2011-10- 
     | 
| 
      
 12 
     | 
    
         
            +
              s.date = "2011-10-18"
         
     | 
| 
       13 
13 
     | 
    
         
             
              s.description = ""
         
     | 
| 
       14 
14 
     | 
    
         
             
              s.email = "andy@andywaite.com"
         
     | 
| 
       15 
15 
     | 
    
         
             
              s.executables = ["cuki"]
         
     | 
    
        data/cuki.yaml.sample
    CHANGED
    
    | 
         @@ -6,5 +6,6 @@ tags: 
     | 
|
| 
       6 
6 
     | 
    
         
             
              draft: "{info:title=Draft version}"
         
     | 
| 
       7 
7 
     | 
    
         
             
              signed_off: "{info:title=Signed-off}"
         
     | 
| 
       8 
8 
     | 
    
         
             
            mappings:
         
     | 
| 
       9 
     | 
    
         
            -
              123: features/products/add_product.feature
         
     | 
| 
       10 
     | 
    
         
            -
              124: features/products/remove_product.feature
         
     | 
| 
      
 9 
     | 
    
         
            +
              123: features/products/add_product.feature # single file mapping
         
     | 
| 
      
 10 
     | 
    
         
            +
              124: features/products/remove_product.feature # single file mapping
         
     | 
| 
      
 11 
     | 
    
         
            +
              125: features/admin # folder mapping
         
     | 
    
        data/features/pull/pull.feature
    CHANGED
    
    | 
         @@ -29,6 +29,10 @@ Feature: Pull 
     | 
|
| 
       29 
29 
     | 
    
         
             
                  <input id="content-title" value="Add Product">
         
     | 
| 
       30 
30 
     | 
    
         
             
                  <div id="markupTextarea">
         
     | 
| 
       31 
31 
     | 
    
         
             
                  This feature describes adding a product
         
     | 
| 
      
 32 
     | 
    
         
            +
                  
         
     | 
| 
      
 33 
     | 
    
         
            +
                  # Some comment
         
     | 
| 
      
 34 
     | 
    
         
            +
                  
         
     | 
| 
      
 35 
     | 
    
         
            +
                  Blah
         
     | 
| 
       32 
36 
     | 
    
         
             
                  </div>
         
     | 
| 
       33 
37 
     | 
    
         
             
                  """
         
     | 
| 
       34 
38 
     | 
    
         
             
                And a Confluence page on "example.com" with id 456:
         
     | 
| 
         @@ -47,6 +51,10 @@ Feature: Pull 
     | 
|
| 
       47 
51 
     | 
    
         | 
| 
       48 
52 
     | 
    
         | 
| 
       49 
53 
     | 
    
         
             
                  This feature describes adding a product
         
     | 
| 
      
 54 
     | 
    
         
            +
                  
         
     | 
| 
      
 55 
     | 
    
         
            +
                  - Some comment
         
     | 
| 
      
 56 
     | 
    
         
            +
                  
         
     | 
| 
      
 57 
     | 
    
         
            +
                  Blah
         
     | 
| 
       50 
58 
     | 
    
         | 
| 
       51 
59 
     | 
    
         
             
                  """
         
     | 
| 
       52 
60 
     | 
    
         
             
                And the file "features/products/remove_product.feature" should contain exactly:
         
     | 
| 
         @@ -3,12 +3,11 @@ Feature: Splitting 
     | 
|
| 
       3 
3 
     | 
    
         
             
              Instead of association one wiki page per feature file, you can split a wiki file across multiple feature files.
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
              @announce
         
     | 
| 
       6 
     | 
    
         
            -
              Scenario: Pull all features
         
     | 
| 
      
 6 
     | 
    
         
            +
              Scenario: Pull all features (default container)
         
     | 
| 
       7 
7 
     | 
    
         
             
                Given a file named "config/cuki.yaml" with:
         
     | 
| 
       8 
8 
     | 
    
         
             
                  """
         
     | 
| 
       9 
9 
     | 
    
         
             
                  ---
         
     | 
| 
       10 
10 
     | 
    
         
             
                  host: http://example.com
         
     | 
| 
       11 
     | 
    
         
            -
                  container: !ruby/regexp '/h1\. Acceptance Criteria(.*)h1\./m'
         
     | 
| 
       12 
11 
     | 
    
         
             
                  mappings:
         
     | 
| 
       13 
12 
     | 
    
         
             
                    123: features/products
         
     | 
| 
       14 
13 
     | 
    
         
             
                  """
         
     | 
| 
         @@ -16,6 +15,8 @@ Feature: Splitting 
     | 
|
| 
       16 
15 
     | 
    
         
             
                  """
         
     | 
| 
       17 
16 
     | 
    
         
             
                  <input id="content-title" value="Product Management">
         
     | 
| 
       18 
17 
     | 
    
         
             
                  <div id="markupTextarea">
         
     | 
| 
      
 18 
     | 
    
         
            +
                  Pretext
         
     | 
| 
      
 19 
     | 
    
         
            +
                  
         
     | 
| 
       19 
20 
     | 
    
         
             
                  h1. Acceptance Criteria
         
     | 
| 
       20 
21 
     | 
    
         | 
| 
       21 
22 
     | 
    
         
             
                  Something
         
     | 
| 
         @@ -65,3 +66,45 @@ Feature: Splitting 
     | 
|
| 
       65 
66 
     | 
    
         | 
| 
       66 
67 
     | 
    
         
             
                  """
         
     | 
| 
       67 
68 
     | 
    
         | 
| 
      
 69 
     | 
    
         
            +
            @announce
         
     | 
| 
      
 70 
     | 
    
         
            +
            Scenario: Pull all features (specified container)
         
     | 
| 
      
 71 
     | 
    
         
            +
              Given a file named "config/cuki.yaml" with:
         
     | 
| 
      
 72 
     | 
    
         
            +
                """
         
     | 
| 
      
 73 
     | 
    
         
            +
                ---
         
     | 
| 
      
 74 
     | 
    
         
            +
                host: http://example.com
         
     | 
| 
      
 75 
     | 
    
         
            +
                container: !ruby/regexp '/h1\. \*Acceptance Criteria\*(.*)h1\./m'
         
     | 
| 
      
 76 
     | 
    
         
            +
                mappings:
         
     | 
| 
      
 77 
     | 
    
         
            +
                  123: features/products
         
     | 
| 
      
 78 
     | 
    
         
            +
                """
         
     | 
| 
      
 79 
     | 
    
         
            +
              And a Confluence page on "example.com" with id 123:
         
     | 
| 
      
 80 
     | 
    
         
            +
                """
         
     | 
| 
      
 81 
     | 
    
         
            +
                <input id="content-title" value="Product Management">
         
     | 
| 
      
 82 
     | 
    
         
            +
                <div id="markupTextarea">
         
     | 
| 
      
 83 
     | 
    
         
            +
                h1. *Acceptance Criteria*
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
                Something
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
                h2. Add Product
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
                This feature describes adding a product
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
                h6. Scenario: Scenario A
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
                h1. Next Section
         
     | 
| 
      
 94 
     | 
    
         
            +
                </div>
         
     | 
| 
      
 95 
     | 
    
         
            +
                """
         
     | 
| 
      
 96 
     | 
    
         
            +
              When I run `cuki pull --skip-autoformat --skip-header`
         
     | 
| 
      
 97 
     | 
    
         
            +
              Then the file "features/products/add_product.feature" should contain exactly:
         
     | 
| 
      
 98 
     | 
    
         
            +
                """
         
     | 
| 
      
 99 
     | 
    
         
            +
                Feature: Add Product
         
     | 
| 
      
 100 
     | 
    
         
            +
             
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
                http://example.com/pages/viewpage.action?pageId=123#ProductManagement-AddProduct
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
                This feature describes adding a product
         
     | 
| 
      
 106 
     | 
    
         
            +
             
     | 
| 
      
 107 
     | 
    
         
            +
                Scenario: Scenario A
         
     | 
| 
      
 108 
     | 
    
         
            +
             
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
      
 110 
     | 
    
         
            +
                """
         
     | 
    
        data/lib/cuki.rb
    CHANGED
    
    | 
         @@ -95,8 +95,12 @@ class Cuki 
     | 
|
| 
       95 
95 
     | 
    
         
             
                  puts doc.to_s
         
     | 
| 
       96 
96 
     | 
    
         
             
                  exit(1)
         
     | 
| 
       97 
97 
     | 
    
         
             
                end
         
     | 
| 
       98 
     | 
    
         
            -
             
     | 
| 
       99 
     | 
    
         
            -
                 
     | 
| 
      
 98 
     | 
    
         
            +
                
         
     | 
| 
      
 99 
     | 
    
         
            +
                
         
     | 
| 
      
 100 
     | 
    
         
            +
                unless filepath.include?('.feature')
         
     | 
| 
      
 101 
     | 
    
         
            +
                  
         
     | 
| 
      
 102 
     | 
    
         
            +
                  @config['container'] ||= /h1\. Acceptance Criteria(.*)h1\./m
         
     | 
| 
      
 103 
     | 
    
         
            +
                  
         
     | 
| 
       100 
104 
     | 
    
         
             
                  handle_multi doc, id
         
     | 
| 
       101 
105 
     | 
    
         
             
                else
         
     | 
| 
       102 
106 
     | 
    
         | 
| 
         @@ -108,12 +112,16 @@ class Cuki 
     | 
|
| 
       108 
112 
     | 
    
         | 
| 
       109 
113 
     | 
    
         
             
                  process_tags
         
     | 
| 
       110 
114 
     | 
    
         | 
| 
       111 
     | 
    
         
            -
                  @content =  
     | 
| 
      
 115 
     | 
    
         
            +
                  @content = generated_by + @content unless @skip_header
         
     | 
| 
       112 
116 
     | 
    
         | 
| 
       113 
117 
     | 
    
         
             
                  save_file filepath
         
     | 
| 
       114 
118 
     | 
    
         
             
                end
         
     | 
| 
       115 
119 
     | 
    
         
             
              end
         
     | 
| 
       116 
120 
     | 
    
         | 
| 
      
 121 
     | 
    
         
            +
              def generated_by
         
     | 
| 
      
 122 
     | 
    
         
            +
                "# Generated by Cuki (#{Time.now})\n"
         
     | 
| 
      
 123 
     | 
    
         
            +
              end
         
     | 
| 
      
 124 
     | 
    
         
            +
              
         
     | 
| 
       117 
125 
     | 
    
         
             
              def autoformat
         
     | 
| 
       118 
126 
     | 
    
         
             
                `cucumber -a . --dry-run -P` unless @skip_autoformat
         
     | 
| 
       119 
127 
     | 
    
         
             
              end
         
     | 
| 
         @@ -122,9 +130,12 @@ class Cuki 
     | 
|
| 
       122 
130 
     | 
    
         
             
                feature_title_compressed = doc.at('#content-title')[:value].anchorize
         
     | 
| 
       123 
131 
     | 
    
         | 
| 
       124 
132 
     | 
    
         
             
                @content += get_markup(doc)
         
     | 
| 
      
 133 
     | 
    
         
            +
                
         
     | 
| 
      
 134 
     | 
    
         
            +
                clean
         
     | 
| 
      
 135 
     | 
    
         
            +
                
         
     | 
| 
       125 
136 
     | 
    
         
             
                acceptance_criteria_matches = @content.match(@config['container'])
         
     | 
| 
       126 
137 
     | 
    
         
             
                unless acceptance_criteria_matches
         
     | 
| 
       127 
     | 
    
         
            -
                  puts "Could not match #{config['container']}" 
         
     | 
| 
      
 138 
     | 
    
         
            +
                  puts "Could not match #{@config['container']} in #{id}" 
         
     | 
| 
       128 
139 
     | 
    
         
             
                  exit(1)
         
     | 
| 
       129 
140 
     | 
    
         
             
                end
         
     | 
| 
       130 
141 
     | 
    
         
             
                acceptance_criteria = acceptance_criteria_matches[1]
         
     | 
| 
         @@ -147,6 +158,7 @@ class Cuki 
     | 
|
| 
       147 
158 
     | 
    
         
             
                  fname = "#{dirpath}/#{feature_filename.gsub("\r", '')}.feature"
         
     | 
| 
       148 
159 
     | 
    
         
             
                  File.open(fname, 'w') do |f|
         
     | 
| 
       149 
160 
     | 
    
         
             
                    puts "Writing #{fname}"
         
     | 
| 
      
 161 
     | 
    
         
            +
                    f.write generated_by unless @skip_header
         
     | 
| 
       150 
162 
     | 
    
         
             
                    f.write "Feature: #{title}\n\n"
         
     | 
| 
       151 
163 
     | 
    
         
             
                    link = @config['host'] + "/pages/viewpage.action?pageId=#{id}##{feature_title_compressed}-#{scenario_title_compressed}"
         
     | 
| 
       152 
164 
     | 
    
         
             
                    f.write "\n\n" + link
         
     | 
| 
         @@ -177,6 +189,8 @@ class Cuki 
     | 
|
| 
       177 
189 
     | 
    
         
             
                @content.gsub!('‘', "'")
         
     | 
| 
       178 
190 
     | 
    
         
             
                @content.gsub!('“', '"')
         
     | 
| 
       179 
191 
     | 
    
         
             
                @content.gsub!('”', '"')
         
     | 
| 
      
 192 
     | 
    
         
            +
                
         
     | 
| 
      
 193 
     | 
    
         
            +
                @content.gsub!(/^#(.*)/, '-' + '\1')
         
     | 
| 
       180 
194 
     | 
    
         | 
| 
       181 
195 
     | 
    
         
             
              end
         
     | 
| 
       182 
196 
     | 
    
         | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,13 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification 
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: cuki
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version 
         
     | 
| 
       4 
     | 
    
         
            -
              hash:  
     | 
| 
      
 4 
     | 
    
         
            +
              hash: 13
         
     | 
| 
       5 
5 
     | 
    
         
             
              prerelease: 
         
     | 
| 
       6 
6 
     | 
    
         
             
              segments: 
         
     | 
| 
       7 
7 
     | 
    
         
             
              - 0
         
     | 
| 
       8 
8 
     | 
    
         
             
              - 0
         
     | 
| 
       9 
     | 
    
         
            -
              -  
     | 
| 
       10 
     | 
    
         
            -
              version: 0.0. 
     | 
| 
      
 9 
     | 
    
         
            +
              - 9
         
     | 
| 
      
 10 
     | 
    
         
            +
              version: 0.0.9
         
     | 
| 
       11 
11 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       12 
12 
     | 
    
         
             
            authors: 
         
     | 
| 
       13 
13 
     | 
    
         
             
            - Andy Waite
         
     | 
| 
         @@ -15,7 +15,7 @@ autorequire: 
     | 
|
| 
       15 
15 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       16 
16 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
            date: 2011-10- 
     | 
| 
      
 18 
     | 
    
         
            +
            date: 2011-10-18 00:00:00 Z
         
     | 
| 
       19 
19 
     | 
    
         
             
            dependencies: 
         
     | 
| 
       20 
20 
     | 
    
         
             
            - !ruby/object:Gem::Dependency 
         
     | 
| 
       21 
21 
     | 
    
         
             
              requirement: &id001 !ruby/object:Gem::Requirement 
         
     |