mork 0.9.1 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a9e14458c23c945d7c781c490f6e4420f65a2e23
4
- data.tar.gz: dfb6fb2f60f68e6a08c52dfd1be4df0c87c084e1
3
+ metadata.gz: 1468b498d3b8817fa1535d1764e026c5ecb4db7f
4
+ data.tar.gz: 3ef072301473be4f4101594a27c60485c6ca9fdd
5
5
  SHA512:
6
- metadata.gz: f955f5a1ce67ef4754b2f91c2d8a9e439c8dd48a5ba9cbea3668f9785837ec0328de253811b64130073eef4c19ab0de45a7d6e349d2a5a10ea5c6c79474fba7c
7
- data.tar.gz: eee3d80c2e233fa5d369d6ec0caf620857f17cd9d145b9a246e3d0c1efa0427d0610509ca5663c0d1fea2b82092f5982f6580dd2e4acdbb0061235bfaac655f4
6
+ metadata.gz: 736560a4ffa1e59db099382a99440f11eff492b56fc65f02431e9e4b69d45d2f25793389d748f2cc5609524b269ae0d666ac396756194b215424f64b581a37b3
7
+ data.tar.gz: 810723654fd44aa7eb1acfa57687fb04e2aa368f29933c03597328ca9e14cfd45eb433b1ecd07670fc7bdbed717754a3d0a498d5d95fd304e4554d3efde2c6b6
data/README.md CHANGED
@@ -7,27 +7,34 @@ A ruby [optical mark recognition](http://en.wikipedia.org/wiki/Optical_mark_reco
7
7
 
8
8
  ## Assumptions and limitations
9
9
 
10
- Mork is a low-level library, and very much work in progress. It is not, and will likely never be a complete OMR solution. While suggestions and contributions are more than welcome, for the time being several assumptions and restrictions to what the library is capable of apply.
10
+ Mork is a low-level library, and very much work in progress. It is not, and will likely never be a complete OMR solution. While suggestions and contributions are more than welcome, for the time being several assumptions and restrictions apply.
11
11
 
12
12
  - the PDF files generated by Mork are intended to be printed on regular printer paper
13
13
  - the entire response sheet must fit into a single page
14
14
  - after collecting the responses, a filled-out form should be acquired as a JPEG, PNG, or PDF image by a normal optical scanner or camera (i.e., no specialized equipment is necessary)
15
15
  - independent of how the sheet is printed and the image is acquired, all internal processing is done on a grayscale version of the bitmap
16
- - the response sheet contains the following items:
16
+ - the response sheet always contains the following items:
17
17
  - registration marks at each page corner
18
- - a bar code along the bottom margin to uniquely identify the sheet
19
- - a header area to print arbitrary information
20
18
  - a response area containing a list of numbered items (questions)
21
19
  - each item contains an arbitrary number of choice “cells”, each marked with a capital letter (A, B, C, ...)
22
20
  - the right edge of the response area is reserved for a column of calibration cells that must remain blank
21
+ - in addition, the sheet may contain:
22
+ - a bar code along the bottom margin to uniquely identify the sheet
23
+ - a header area to print arbitrary information
23
24
  - it is entirely up to the user to provide parameters that produce the desired response sheet layout; in particular, making sure that the header elements and choice cells fit in the available space, as Mork does not provide any type of "sanity" check at this time
24
25
 
25
26
  ## Getting started
26
27
 
27
- First, make sure that ImageMagick is installed in your system. In OS X, `brew` is the preferred package manager:
28
+ First, make sure that ImageMagick is installed in your system. Typing `convert in a terminal shell should print out a long help message. If instead you get an error, you will need to install ImageMagick.
29
+
30
+ In OS X, `brew` is an excellent package manager:
28
31
 
29
32
  brew install imagemagick
30
33
 
34
+ In a Debian-based Linux distro (e.g., Ubuntu) you would do:
35
+
36
+ sudo apt-get install imagemagick
37
+
31
38
  To create a small ruby project that uses Mork, `cd` into a directory of choice, then execute the following shell commands:
32
39
 
33
40
  ```
@@ -46,7 +53,7 @@ Edit the file `mork_test.rb` with the code snippets below, then execute the foll
46
53
 
47
54
  ## Generating response sheets with `SheetPDF`
48
55
 
49
- Response sheets are created through the `Mork::SheetPDF` class. Two pieces of information must be provided to the class constructor to produce a meaningful object:
56
+ Response sheets are created through the `Mork::SheetPDF` class. Two pieces of information must be provided to the class constructor to produce a meaningful sheet:
50
57
 
51
58
  - **content**: what to place on the sheet, such as how many response items and choices, what to write in the header, the number to print as a barcode
52
59
  - **layout**: sizes, margins, spacing, fonts, etc., of each of the printed elements
@@ -75,11 +82,11 @@ content = {
75
82
  }
76
83
  ```
77
84
 
78
- These are the key-value pairs that the `content` hash should contain:
85
+ These are the key-value pairs that the `content` hash may contain:
79
86
 
80
- - **barcode**: an integer number, the sheet's unique identifier
81
- - **choices**: an array of integers, specifiying the number of items in the test (the length of the array) and the number of choices available for each item (the array values)
82
- - **header**: a (sub)hash of key-value pairs defining the content of named header elements; in each pair, the key is the name of one header element, while the value is the rendered content; the actually available elements are defined in the `layout` (see below)
87
+ - **choices**: an array of integers, specifiying the number of items in the test (the length of the array) and the number of choices available for each item (the array values); if omitted, the maximum number of items and choices per item are printed
88
+ - **header**: optional; a (sub)hash of key-value pairs defining the content of named header elements; in each pair, the key is the name of one header element, while the value is the rendered content; the actually available elements are defined in the `layout` (see below)
89
+ - **barcode**: optional; an integer number, the sheet's unique identifier to be printed as a binary barcode along the bottom edge of the sheet
83
90
 
84
91
  ### layout
85
92
 
@@ -96,7 +103,7 @@ reg_marks:
96
103
  offset: 2 # distance between the search area and each page border (*)
97
104
  blur: 2 # size of a gaussian blur filter to smooth overly pixelated registration marks (0 to skip) (*)
98
105
  dilate: 5 # size of a “dilate” filter to get rid of stray noise (0 to skip) (*)
99
- contrast: 20 # minimum contrast between registration mark circles and the surrounding white paper
106
+ contrast: 20 # minimum contrast between registration mark circles and the surrounding white paper (*)
100
107
  header:
101
108
  name: # ‘name’ is just a label; you can add arbitrary header elements
102
109
  top: 5 # margin relative to registration frame top side
@@ -124,7 +131,7 @@ header:
124
131
  size: 7
125
132
  box: true # header element will be enclosed in a box
126
133
  items:
127
- threshold: 0.75 # mark detection threshold
134
+ threshold: 0.75 # mark detection threshold (*)
128
135
  top: 55 # response area margin, relative to reg frame
129
136
  left: 11 # response area margin, relative to reg frame
130
137
  rows: 30 # number of items per column
@@ -47,13 +47,14 @@ module Mork
47
47
  # for all sheets
48
48
  line_width 0.3
49
49
  font_size @grip.item_font_size
50
+ ensure_presence_of_choices
50
51
  create_stamps
51
52
  make_repeaters
52
53
  # for each response sheet
53
54
  @content.each_with_index do |content, i|
54
55
  start_new_page if i>0
55
- barcode content[:barcode]
56
- header content[:header]
56
+ barcode(content[:barcode] || 0)
57
+ header(content[:header] || [])
57
58
  unless equal_choice_number?
58
59
  questions_and_choices ch_len[i]
59
60
  end
@@ -165,6 +166,14 @@ module Mork
165
166
  true
166
167
  end
167
168
 
169
+ def ensure_presence_of_choices
170
+ @content.each do |c|
171
+ if c[:choices].nil?
172
+ c[:choices] = [@grip.max_choices_per_question] * @grip.max_questions
173
+ end
174
+ end
175
+ end
176
+
168
177
  def ch_len
169
178
  @all_choice_lengths ||= @content.collect { |c| c[:choices] }
170
179
  end
data/lib/mork/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Mork
2
- VERSION = '0.9.1'
2
+ VERSION = '0.9.2'
3
3
  end
@@ -85,6 +85,17 @@ module Mork
85
85
  s = SheetPDF.new([c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c])
86
86
  s.save('spec/out/pdf/p20.pdf')
87
87
  end
88
+
89
+ it 'creates a pdf with minimal content' do
90
+ s = SheetPDF.new({choices: [4] * 30})
91
+ s.save 'spec/out/pdf/mincont.pdf'
92
+ end
93
+
94
+ it 'creates a PDF with the maximum possible choice cells if none are specified' do
95
+ ct = [{}, {choices: [3]*20}]
96
+ s = SheetPDF.new ct
97
+ s.save 'spec/out/pdf/nocontent.pdf'
98
+ end
88
99
  end
89
100
  end
90
101
 
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.9.1
4
+ version: 0.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Giuseppe Bertini
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-14 00:00:00.000000000 Z
11
+ date: 2016-06-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: narray