mork 0.2.1 → 0.3.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/lib/mork/grid_omr.rb +5 -0
- data/lib/mork/mimage.rb +46 -27
- data/lib/mork/sheet_omr.rb +25 -2
- data/lib/mork/version.rb +1 -1
- data/mork.gemspec +1 -1
- data/spec/mork/sheet_omr_spec.rb +19 -1
- metadata +4 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 8f86f0bbe05ae9f4eb62d0d61598a76fcd595e08
         | 
| 4 | 
            +
              data.tar.gz: 547f41d90cc045f797ca98254638723c650fd2f1
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: cdfe684595e84ccc61c03f07e30c0a171fa438be0b9a7e46d0cf563e77f17b15772f0b80f8d7e7a69eb3079fab46d971eef3337f6e97661785a515efc864dc45
         | 
| 7 | 
            +
              data.tar.gz: 37b009ebc52a62517ee8c03a55e3163747f49632f721fa585d8561bb4a304eefda61dc208430b5b99e298d40905111cc580305f57051abc11ecc19608beee4af
         | 
    
        data/lib/mork/grid_omr.rb
    CHANGED
    
    
    
        data/lib/mork/mimage.rb
    CHANGED
    
    | @@ -9,6 +9,8 @@ module Mork | |
| 9 9 | 
             
                  @path = path
         | 
| 10 10 | 
             
                  @grom = grom
         | 
| 11 11 | 
             
                  @grom.set_page_size width, height
         | 
| 12 | 
            +
                  @rm   = {} # registration mark centers
         | 
| 13 | 
            +
                  @rmsa = {} # registration mark search area
         | 
| 12 14 | 
             
                  @status = register
         | 
| 13 15 | 
             
                  @cmd = []
         | 
| 14 16 | 
             
                end
         | 
| @@ -54,7 +56,7 @@ module Mork | |
| 54 56 | 
             
                  @cmd << [:stroke, 'green']
         | 
| 55 57 | 
             
                  @cmd << [:strokewidth, '4']
         | 
| 56 58 | 
             
                  @cmd << [:fill, 'none']
         | 
| 57 | 
            -
                   | 
| 59 | 
            +
                  coordinates_of(cells).each do |c|
         | 
| 58 60 | 
             
                    roundedness ||= [c[:h], c[:w]].min / 2
         | 
| 59 61 | 
             
                    pts = [c[:x], c[:y], c[:x]+c[:w], c[:y]+c[:h], roundedness, roundedness].join ' '
         | 
| 60 62 | 
             
                    @cmd << [:draw, "roundrectangle #{pts}"]
         | 
| @@ -73,7 +75,7 @@ module Mork | |
| 73 75 | 
             
                  return if cells.empty?
         | 
| 74 76 | 
             
                  @cmd << [:stroke, 'none']
         | 
| 75 77 | 
             
                  @cmd << [:fill, 'rgba(255, 255, 0, 0.3)']
         | 
| 76 | 
            -
                   | 
| 78 | 
            +
                  coordinates_of(cells).each do |c|
         | 
| 77 79 | 
             
                    roundedness ||= [c[:h], c[:w]].min / 2
         | 
| 78 80 | 
             
                    pts = [c[:x], c[:y], c[:x]+c[:w], c[:y]+c[:h], roundedness, roundedness].join ' '
         | 
| 79 81 | 
             
                    @cmd << [:draw, "roundrectangle #{pts}"]
         | 
| @@ -101,32 +103,51 @@ module Mork | |
| 101 103 | 
             
                  end
         | 
| 102 104 | 
             
                end
         | 
| 103 105 |  | 
| 104 | 
            -
                def  | 
| 106 | 
            +
                def cross(cells)
         | 
| 107 | 
            +
                  return if cells.empty?
         | 
| 105 108 | 
             
                  cells = [cells] if cells.is_a? Hash
         | 
| 106 | 
            -
                   | 
| 107 | 
            -
             | 
| 108 | 
            -
             | 
| 109 | 
            -
                     | 
| 110 | 
            -
             | 
| 109 | 
            +
                  @cmd << [:stroke, 'red']
         | 
| 110 | 
            +
                  @cmd << [:strokewidth, '3']
         | 
| 111 | 
            +
                  coordinates_of(cells).each do |c|
         | 
| 112 | 
            +
                    pts = [
         | 
| 113 | 
            +
                      c[:x]+corner,
         | 
| 114 | 
            +
                      c[:y]+corner,
         | 
| 115 | 
            +
                      c[:x]+c[:w]-corner,
         | 
| 116 | 
            +
                      c[:y]+c[:h]-corner
         | 
| 117 | 
            +
                    ].join ' '
         | 
| 118 | 
            +
                    @cmd << [:draw, "line #{pts}"]
         | 
| 119 | 
            +
                    pts = [
         | 
| 120 | 
            +
                      c[:x]+corner,
         | 
| 121 | 
            +
                      c[:y]+c[:h]-corner,
         | 
| 122 | 
            +
                      c[:x]+c[:w]-corner,
         | 
| 123 | 
            +
                      c[:y]+corner
         | 
| 124 | 
            +
                    ].join ' '
         | 
| 125 | 
            +
                    @cmd << [:draw, "line #{pts}"]
         | 
| 111 126 | 
             
                  end
         | 
| 112 127 | 
             
                end
         | 
| 113 128 |  | 
| 114 129 | 
             
                # write the underlying MiniMagick::Image to disk;
         | 
| 130 | 
            +
                # if no file name is given, image is processed in-place;
         | 
| 115 131 | 
             
                # if the 2nd arg is false, then stretching is not applied
         | 
| 116 | 
            -
                def write(fname, reg=true)
         | 
| 117 | 
            -
                   | 
| 118 | 
            -
             | 
| 119 | 
            -
                     | 
| 120 | 
            -
                     | 
| 121 | 
            -
             | 
| 122 | 
            -
                     | 
| 132 | 
            +
                def write(fname=nil, reg=true)
         | 
| 133 | 
            +
                  if fname
         | 
| 134 | 
            +
                    img = MiniMagick::Image.open @path
         | 
| 135 | 
            +
                    img.combine_options {|c| exec_mm_cmd c, reg }
         | 
| 136 | 
            +
                    img.write fname
         | 
| 137 | 
            +
                  else
         | 
| 138 | 
            +
                    MiniMagick::Image.new(@path) { |c| exec_mm_cmd c, reg }
         | 
| 123 139 | 
             
                  end
         | 
| 124 | 
            -
                  img.write fname
         | 
| 125 140 | 
             
                end
         | 
| 126 141 |  | 
| 127 142 | 
             
                # ============================================================#
         | 
| 128 143 | 
             
                private                                                       #
         | 
| 129 144 | 
             
                # ============================================================#
         | 
| 145 | 
            +
                def exec_mm_cmd(c, reg)
         | 
| 146 | 
            +
                  c.distort(:perspective, perspective_points) if reg
         | 
| 147 | 
            +
                  @cmd.each do |cmd|
         | 
| 148 | 
            +
                    c.send *cmd
         | 
| 149 | 
            +
                  end
         | 
| 150 | 
            +
                end
         | 
| 130 151 |  | 
| 131 152 | 
             
                def img_size
         | 
| 132 153 | 
             
                  @img_size ||= IO.read("|identify -format '%w,%h' #{@path}").split ','
         | 
| @@ -163,20 +184,18 @@ module Mork | |
| 163 184 | 
             
                  @cmd << [:draw, "polygon #{pts}"]
         | 
| 164 185 | 
             
                end
         | 
| 165 186 |  | 
| 166 | 
            -
                def  | 
| 167 | 
            -
                   | 
| 168 | 
            -
             | 
| 169 | 
            -
             | 
| 170 | 
            -
             | 
| 171 | 
            -
             | 
| 172 | 
            -
             | 
| 173 | 
            -
                   | 
| 187 | 
            +
                def coordinates_of(cells)
         | 
| 188 | 
            +
                  cells.collect.each_with_index do |q, i|
         | 
| 189 | 
            +
                    q.collect { |c| @grom.choice_cell_area(i, c) }
         | 
| 190 | 
            +
                  end.flatten
         | 
| 191 | 
            +
                end
         | 
| 192 | 
            +
                
         | 
| 193 | 
            +
                def corner
         | 
| 194 | 
            +
                  @corner_size ||= @grom.cell_corner_size
         | 
| 174 195 | 
             
                end
         | 
| 175 196 |  | 
| 176 197 | 
             
                def register
         | 
| 177 198 | 
             
                  # find the XY coordinates of the 4 registration marks
         | 
| 178 | 
            -
                  @rm   = {} # registration mark centers
         | 
| 179 | 
            -
                  @rmsa = {} # registration mark search area
         | 
| 180 199 | 
             
                  @rm[:tl] = reg_centroid_on(:tl)
         | 
| 181 200 | 
             
                  @rm[:tr] = reg_centroid_on(:tr)
         | 
| 182 201 | 
             
                  @rm[:br] = reg_centroid_on(:br)
         | 
| @@ -192,7 +211,7 @@ module Mork | |
| 192 211 | 
             
                    @rmsa[corner] = @grom.rm_search_area(corner, i)
         | 
| 193 212 | 
             
                    cx, cy = raw_pixels.dark_centroid @rmsa[corner]
         | 
| 194 213 | 
             
                    if cx.nil?
         | 
| 195 | 
            -
                      status = : | 
| 214 | 
            +
                      status = :no_contrast  
         | 
| 196 215 | 
             
                    elsif (cx < @grom.rm_edgy_x) or
         | 
| 197 216 | 
             
                          (cy < @grom.rm_edgy_y) or
         | 
| 198 217 | 
             
                          (cy > @rmsa[corner][:h] - @grom.rm_edgy_y) or
         | 
    
        data/lib/mork/sheet_omr.rb
    CHANGED
    
    | @@ -77,6 +77,17 @@ module Mork | |
| 77 77 | 
             
                  @mim.outline cells
         | 
| 78 78 | 
             
                end
         | 
| 79 79 |  | 
| 80 | 
            +
                def cross(cells)
         | 
| 81 | 
            +
                  return if not_registered
         | 
| 82 | 
            +
                  raise "Invalid ‘cells’ argument" unless cells.kind_of? Array
         | 
| 83 | 
            +
                  @mim.cross cells
         | 
| 84 | 
            +
                end
         | 
| 85 | 
            +
                
         | 
| 86 | 
            +
                def cross_marked
         | 
| 87 | 
            +
                  return if not_registered
         | 
| 88 | 
            +
                  @mim.cross mark_array
         | 
| 89 | 
            +
                end
         | 
| 90 | 
            +
                
         | 
| 80 91 | 
             
                def highlight_marked
         | 
| 81 92 | 
             
                  return if not_registered
         | 
| 82 93 | 
             
                  @mim.highlight_cells mark_array
         | 
| @@ -96,12 +107,24 @@ module Mork | |
| 96 107 | 
             
                  @mim.highlight_reg_area
         | 
| 97 108 | 
             
                end
         | 
| 98 109 |  | 
| 99 | 
            -
                 | 
| 110 | 
            +
                # write(output_path_file_name)
         | 
| 111 | 
            +
                #
         | 
| 112 | 
            +
                # writes out a copy of the source image after registration;
         | 
| 113 | 
            +
                # the output image will also contain any previously applied overlays;
         | 
| 114 | 
            +
                # if the argument is omitted, the image is created in-place,
         | 
| 115 | 
            +
                # i.e. the original source image is overwritten.
         | 
| 116 | 
            +
                def write(fname=nil)
         | 
| 100 117 | 
             
                  return if not_registered
         | 
| 101 118 | 
             
                  @mim.write(fname)
         | 
| 102 119 | 
             
                end
         | 
| 103 120 |  | 
| 104 | 
            -
                 | 
| 121 | 
            +
                # write_raw(output_path_file_name)
         | 
| 122 | 
            +
                #
         | 
| 123 | 
            +
                # writes out a copy of the source image before registration;
         | 
| 124 | 
            +
                # the output image will also contain any previously applied overlays
         | 
| 125 | 
            +
                # if the argument is omitted, the image is created in-place,
         | 
| 126 | 
            +
                # i.e. the original source image is overwritten.
         | 
| 127 | 
            +
                def write_raw(fname=nil)
         | 
| 105 128 | 
             
                  @mim.write(fname, false)
         | 
| 106 129 | 
             
                end
         | 
| 107 130 |  | 
    
        data/lib/mork/version.rb
    CHANGED
    
    
    
        data/mork.gemspec
    CHANGED
    
    | @@ -19,7 +19,7 @@ Gem::Specification.new do |s| | |
| 19 19 |  | 
| 20 20 | 
             
              # dependencies:
         | 
| 21 21 | 
             
              s.add_dependency 'narray',      '~> 0.6'
         | 
| 22 | 
            -
              s.add_dependency 'mini_magick', '~>  | 
| 22 | 
            +
              s.add_dependency 'mini_magick', '~> 4.0'
         | 
| 23 23 | 
             
              s.add_dependency 'prawn',       '~> 1.3'
         | 
| 24 24 | 
             
              s.add_development_dependency 'rake',          '~> 10.3'
         | 
| 25 25 | 
             
              s.add_development_dependency 'rspec',         '~>  3.1'
         | 
    
        data/spec/mork/sheet_omr_spec.rb
    CHANGED
    
    | @@ -1,4 +1,5 @@ | |
| 1 1 | 
             
            require 'spec_helper'
         | 
| 2 | 
            +
            require 'fileutils'
         | 
| 2 3 |  | 
| 3 4 | 
             
            module Mork
         | 
| 4 5 | 
             
              describe SheetOMR do
         | 
| @@ -24,12 +25,29 @@ module Mork | |
| 24 25 | 
             
                    sheet.write 'spec/out/marked_highlights.jpg'
         | 
| 25 26 | 
             
                  end
         | 
| 26 27 |  | 
| 28 | 
            +
                  it 'crossed marked cells' do
         | 
| 29 | 
            +
                    sheet.cross_marked
         | 
| 30 | 
            +
                    sheet.write 'spec/out/marked_crosses.jpg'
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
             | 
| 27 33 | 
             
                  it 'outlines some responses' do
         | 
| 28 34 | 
             
                    sheet.outline [[1],[1],[2],[2],[3,4],[],[0,1,2,3,4], [],[1],[2],[2],[3,4],[],[0,1,2,3,4]]
         | 
| 29 35 | 
             
                    sheet.write 'spec/out/outlines.jpg'
         | 
| 30 36 | 
             
                  end
         | 
| 31 37 |  | 
| 32 | 
            -
                  it ' | 
| 38 | 
            +
                  it 'cross some responses' do
         | 
| 39 | 
            +
                    sheet.cross [[1],[1],[2],[2],[3,4],[],[0,1,2,3,4], [],[1],[2],[2],[3,4],[],[0,1,2,3,4]]
         | 
| 40 | 
            +
                    sheet.write 'spec/out/crosses.jpg'
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  it 'outlines some responses in-place (rewriting the source image)' do
         | 
| 44 | 
            +
                    FileUtils.cp shinfo.filename, 'spec/out/inplace.jpg'
         | 
| 45 | 
            +
                    tsheet = SheetOMR.new 'spec/out/inplace.jpg', shinfo.grid_file
         | 
| 46 | 
            +
                    tsheet.outline [[1],[1],[2],[2],[3,4],[],[0,1,2,3,4], [],[1],[2],[2],[3,4],[],[0,1,2,3,4]]
         | 
| 47 | 
            +
                    tsheet.write
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  it 'highlights marked cells and outline correct responses' do
         | 
| 33 51 | 
             
                    sheet.highlight_marked
         | 
| 34 52 | 
             
                    sheet.outline [[1],[1],[2],[2],[3,4],[],[0,1,2,3,4], [],[1],[2],[2],[3,4],[],[0,1,2,3,4]]
         | 
| 35 53 | 
             
                    sheet.write 'spec/out/marks_and_outs.jpg'
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: mork
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.3.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Giuseppe Bertini
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2014- | 
| 11 | 
            +
            date: 2014-12-28 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: narray
         | 
| @@ -30,14 +30,14 @@ dependencies: | |
| 30 30 | 
             
                requirements:
         | 
| 31 31 | 
             
                - - "~>"
         | 
| 32 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            -
                    version: ' | 
| 33 | 
            +
                    version: '4.0'
         | 
| 34 34 | 
             
              type: :runtime
         | 
| 35 35 | 
             
              prerelease: false
         | 
| 36 36 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 37 | 
             
                requirements:
         | 
| 38 38 | 
             
                - - "~>"
         | 
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            -
                    version: ' | 
| 40 | 
            +
                    version: '4.0'
         | 
| 41 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 42 | 
             
              name: prawn
         | 
| 43 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         |