ruby_marks 0.0.1.dev → 0.0.1
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/lib/ruby_marks.rb +1 -17
- metadata +9 -38
- data/README.md +0 -4
- data/lib/ruby_marks/clock_mark.rb +0 -82
- data/lib/ruby_marks/document.rb +0 -145
- data/lib/ruby_marks/rgb.rb +0 -21
- data/lib/ruby_marks/version.rb +0 -3
- data/test/ruby_marks/clock_mark_test.rb +0 -38
- data/test/ruby_marks/document_test.rb +0 -88
- data/test/ruby_marks/rgb_test.rb +0 -15
- data/test/test_helper.rb +0 -6
data/lib/ruby_marks.rb
CHANGED
@@ -1,17 +1 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'RMagick'
|
3
|
-
require 'ruby_marks/document'
|
4
|
-
require 'ruby_marks/clock_mark'
|
5
|
-
require 'ruby_marks/rgb'
|
6
|
-
require 'ruby_marks/version'
|
7
|
-
|
8
|
-
|
9
|
-
magick_version = `convert -version`
|
10
|
-
|
11
|
-
if magick_version =~ /Q16/
|
12
|
-
puts %{
|
13
|
-
*** IMPORTANT: You are running the ImageMagick under 16bits quantum depth. This configuration is used
|
14
|
-
in very specific cases and can cause RMagick work a bit slow. See more details in this forum post
|
15
|
-
http://rubyforge.org/forum/forum.php?thread_id=10975&forum_id=1618 ***
|
16
|
-
}
|
17
|
-
end
|
1
|
+
require 'rubygems'
|
metadata
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_marks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.1
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- André Rodrigues
|
@@ -11,40 +11,15 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
date: 2012-09-17 00:00:00.000000000 Z
|
14
|
-
dependencies:
|
15
|
-
|
16
|
-
name: rmagick
|
17
|
-
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
|
-
requirements:
|
20
|
-
- - ! '>='
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: '0'
|
23
|
-
type: :runtime
|
24
|
-
prerelease: false
|
25
|
-
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
|
-
requirements:
|
28
|
-
- - ! '>='
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
version: '0'
|
31
|
-
description: A simple ORM tool
|
14
|
+
dependencies: []
|
15
|
+
description: A simple orm tool
|
32
16
|
email: andrerpbts@gmail.com
|
33
17
|
executables: []
|
34
18
|
extensions: []
|
35
19
|
extra_rdoc_files: []
|
36
20
|
files:
|
37
|
-
- README.md
|
38
|
-
- lib/ruby_marks/clock_mark.rb
|
39
|
-
- lib/ruby_marks/document.rb
|
40
|
-
- lib/ruby_marks/rgb.rb
|
41
|
-
- lib/ruby_marks/version.rb
|
42
21
|
- lib/ruby_marks.rb
|
43
|
-
|
44
|
-
- test/ruby_marks/document_test.rb
|
45
|
-
- test/ruby_marks/rgb_test.rb
|
46
|
-
- test/test_helper.rb
|
47
|
-
homepage: https://github.com/andrerpbts/ruby_marks.git
|
22
|
+
homepage: http://rubygems.org/gems/ruby_marks
|
48
23
|
licenses: []
|
49
24
|
post_install_message:
|
50
25
|
rdoc_options: []
|
@@ -59,17 +34,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
59
34
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
35
|
none: false
|
61
36
|
requirements:
|
62
|
-
- - ! '
|
37
|
+
- - ! '>='
|
63
38
|
- !ruby/object:Gem::Version
|
64
|
-
version:
|
39
|
+
version: '0'
|
65
40
|
requirements: []
|
66
|
-
rubyforge_project:
|
41
|
+
rubyforge_project:
|
67
42
|
rubygems_version: 1.8.24
|
68
43
|
signing_key:
|
69
44
|
specification_version: 3
|
70
45
|
summary: Ruby Marks ORM
|
71
|
-
test_files:
|
72
|
-
- test/ruby_marks/clock_mark_test.rb
|
73
|
-
- test/ruby_marks/document_test.rb
|
74
|
-
- test/ruby_marks/rgb_test.rb
|
75
|
-
- test/test_helper.rb
|
46
|
+
test_files: []
|
data/README.md
DELETED
@@ -1,82 +0,0 @@
|
|
1
|
-
#encoding: utf-8
|
2
|
-
module RubyMarks
|
3
|
-
|
4
|
-
class ClockMark
|
5
|
-
|
6
|
-
attr_accessor :document, :position, :coordinates
|
7
|
-
|
8
|
-
def initialize(params={})
|
9
|
-
params.each do |k, v|
|
10
|
-
self.send("#{k}=", v) if self.respond_to?("#{k}=")
|
11
|
-
end
|
12
|
-
@coordinates = {x1: 0, x2: 0, y1: 0, y2: 0}
|
13
|
-
self.calc_coordinates
|
14
|
-
end
|
15
|
-
|
16
|
-
def calc_coordinates
|
17
|
-
@coordinates.tap do |coordinates|
|
18
|
-
if self.document
|
19
|
-
x = position[:x]
|
20
|
-
y = position[:y]
|
21
|
-
|
22
|
-
coordinates[:x1] = x
|
23
|
-
loop do
|
24
|
-
coordinates[:x1] -= 1
|
25
|
-
color = self.document.file.pixel_color(coordinates[:x1], y)
|
26
|
-
color = RubyMarks::RGB.to_hex(color.red, color.green, color.blue)
|
27
|
-
|
28
|
-
break if color != "#000000" || coordinates[:x1] <= 0
|
29
|
-
end
|
30
|
-
|
31
|
-
coordinates[:x2] = x
|
32
|
-
loop do
|
33
|
-
coordinates[:x2] += 1
|
34
|
-
color = self.document.file.pixel_color(coordinates[:x2], y)
|
35
|
-
color = RubyMarks::RGB.to_hex(color.red, color.green, color.blue)
|
36
|
-
|
37
|
-
break if color != "#000000" || coordinates[:x2] >= self.document.file.page.width
|
38
|
-
end
|
39
|
-
|
40
|
-
coordinates[:y1] = y
|
41
|
-
loop do
|
42
|
-
coordinates[:y1] -= 1
|
43
|
-
color = self.document.file.pixel_color(x, coordinates[:y1])
|
44
|
-
color = RubyMarks::RGB.to_hex(color.red, color.green, color.blue)
|
45
|
-
|
46
|
-
break if color != "#000000" || coordinates[:y1] <= 0
|
47
|
-
end
|
48
|
-
|
49
|
-
coordinates[:y2] = y
|
50
|
-
loop do
|
51
|
-
coordinates[:y2] += 1
|
52
|
-
color = self.document.file.pixel_color(x, coordinates[:y2])
|
53
|
-
color = RubyMarks::RGB.to_hex(color.red, color.green, color.blue)
|
54
|
-
|
55
|
-
break if color != "#000000" || coordinates[:y2] >= self.document.file.page.height
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def width
|
62
|
-
coordinates[:x2] - coordinates[:x1]
|
63
|
-
end
|
64
|
-
|
65
|
-
def height
|
66
|
-
coordinates[:y2] - coordinates[:y1]
|
67
|
-
end
|
68
|
-
|
69
|
-
def horizontal_middle_position
|
70
|
-
coordinates[:x1] + self.width / 2
|
71
|
-
end
|
72
|
-
|
73
|
-
def vertical_middle_position
|
74
|
-
coordinates[:y1] + self.height / 2
|
75
|
-
end
|
76
|
-
|
77
|
-
def to_s
|
78
|
-
self.coordinates
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
end
|
data/lib/ruby_marks/document.rb
DELETED
@@ -1,145 +0,0 @@
|
|
1
|
-
#encoding: utf-8
|
2
|
-
module RubyMarks
|
3
|
-
|
4
|
-
# Represents a scanned document
|
5
|
-
class Document
|
6
|
-
|
7
|
-
attr_reader :file
|
8
|
-
|
9
|
-
attr_accessor :current_position, :clock_marks
|
10
|
-
|
11
|
-
def initialize(file)
|
12
|
-
@file = Magick::Image.read(file).first
|
13
|
-
@current_position = {x: 0, y: 0}
|
14
|
-
@clock_marks = []
|
15
|
-
end
|
16
|
-
|
17
|
-
def filename
|
18
|
-
@file.filename
|
19
|
-
end
|
20
|
-
|
21
|
-
def move_to(x, y)
|
22
|
-
@current_position = {x: @current_position[:x] + x, y: @current_position[:y] + y}
|
23
|
-
end
|
24
|
-
|
25
|
-
def marked?
|
26
|
-
if self.current_position
|
27
|
-
area_x = 8
|
28
|
-
area_y = 8
|
29
|
-
|
30
|
-
x_pos = current_position[:x]-area_x..current_position[:x]+area_x
|
31
|
-
y_pos = current_position[:y]-area_y..current_position[:y]+area_y
|
32
|
-
|
33
|
-
colors = []
|
34
|
-
|
35
|
-
y_pos.each do |y|
|
36
|
-
x_pos.each do |x|
|
37
|
-
color = @file.pixel_color(x, y)
|
38
|
-
color = RubyMarks::RGB.to_hex(color.red, color.green, color.blue)
|
39
|
-
color = (color == "#000000") ? "." : " "
|
40
|
-
colors << color
|
41
|
-
end
|
42
|
-
end
|
43
|
-
black_intensity = colors.count(".") * 100 / colors.size
|
44
|
-
return black_intensity >= 40 ? true : false
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def unmarked?
|
49
|
-
!marked?
|
50
|
-
end
|
51
|
-
|
52
|
-
def scan
|
53
|
-
result = {}
|
54
|
-
result.tap do |result|
|
55
|
-
position_before = @current_position
|
56
|
-
|
57
|
-
scan_clock_marks unless clock_marks.any?
|
58
|
-
groups = [87, 310, 535, 760, 985]
|
59
|
-
marks = %w{A B C D E}
|
60
|
-
clock_marks.each_with_index do |clock_mark, index|
|
61
|
-
group_hash = {}
|
62
|
-
groups.each_with_index do |group, index|
|
63
|
-
@current_position = {x: clock_mark.coordinates[:x2], y: clock_mark.vertical_middle_position}
|
64
|
-
move_to(group, 0)
|
65
|
-
markeds = []
|
66
|
-
marks.each do |mark|
|
67
|
-
markeds << mark if marked?
|
68
|
-
move_to(25, 0)
|
69
|
-
end
|
70
|
-
group_hash["group_#{index+1}".to_sym] = markeds if markeds.any?
|
71
|
-
end
|
72
|
-
result["clock_#{index+1}".to_sym] = group_hash if group_hash.any?
|
73
|
-
end
|
74
|
-
@current_position = position_before
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def flag_position
|
79
|
-
file = @file.dup
|
80
|
-
|
81
|
-
file.tap do |file|
|
82
|
-
if current_position
|
83
|
-
add_mark file
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
def flag_all_marks
|
89
|
-
file = @file.dup
|
90
|
-
|
91
|
-
file.tap do |file|
|
92
|
-
position_before = @current_position
|
93
|
-
|
94
|
-
scan_clock_marks unless clock_marks.any?
|
95
|
-
groups = [87, 310, 535, 760, 985]
|
96
|
-
marks = %w{A B C D E}
|
97
|
-
clock_marks.each do |clock_mark|
|
98
|
-
groups.each do |group|
|
99
|
-
@current_position = {x: clock_mark.coordinates[:x2], y: clock_mark.vertical_middle_position}
|
100
|
-
move_to(group, 0)
|
101
|
-
marks.each do |mark|
|
102
|
-
add_mark file
|
103
|
-
move_to(25, 0)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
@current_position = position_before
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
def scan_clock_marks
|
113
|
-
@clock_marks = []
|
114
|
-
x = 62
|
115
|
-
in_clock = false
|
116
|
-
total_height = @file && @file.page.height || 0
|
117
|
-
@clock_marks.tap do |clock_marks|
|
118
|
-
total_height.times do |y|
|
119
|
-
clock = {}
|
120
|
-
color = @file.pixel_color(x, y)
|
121
|
-
color = RubyMarks::RGB.to_hex(color.red, color.green, color.blue)
|
122
|
-
if !in_clock && color == "#000000"
|
123
|
-
in_clock = true
|
124
|
-
clock_marks << RubyMarks::ClockMark.new(document: self, position: {x: x, y: y+3})
|
125
|
-
elsif in_clock && color != "#000000"
|
126
|
-
in_clock = false
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
private
|
133
|
-
def add_mark(file)
|
134
|
-
flag = Magick::Draw.new
|
135
|
-
file.annotate(flag, 0, 0, current_position[:x] - 12, current_position[:y] + 15, "+") do
|
136
|
-
self.pointsize = 41
|
137
|
-
self.stroke = '#000000'
|
138
|
-
self.fill = '#C00000'
|
139
|
-
self.font_weight = Magick::BoldWeight
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
end
|
144
|
-
|
145
|
-
end
|
data/lib/ruby_marks/rgb.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
#encoding: utf-8
|
2
|
-
module RubyMarks
|
3
|
-
|
4
|
-
class RGB
|
5
|
-
|
6
|
-
def self.to_hex(red, green, blue)
|
7
|
-
red = get_hex_from_color(red)
|
8
|
-
green = get_hex_from_color(green)
|
9
|
-
blue = get_hex_from_color(blue)
|
10
|
-
"##{red}#{green}#{blue}".upcase
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
def self.get_hex_from_color(color)
|
15
|
-
color = color.to_s(16)[0..1]
|
16
|
-
color.size < 2 ? "0#{color}" : color
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
data/lib/ruby_marks/version.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
require "test_helper"
|
2
|
-
|
3
|
-
class RubyMarks::ClockMarkTest < Test::Unit::TestCase
|
4
|
-
|
5
|
-
def setup
|
6
|
-
@file = 'assets/sheet_demo1.png'
|
7
|
-
@document = RubyMarks::Document.new(@file)
|
8
|
-
@positions = {}
|
9
|
-
@positions[:first_clock_position] = {x: 62, y: 794}
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_should_get_clock_coordinates_by_a_given_position
|
13
|
-
clock = RubyMarks::ClockMark.new(document: @document, position: @positions[:first_clock_position])
|
14
|
-
expected_coordinates = {:x1=>48, :x2=>75, :y1=>790, :y2=>802}
|
15
|
-
assert_equal expected_coordinates, clock.calc_coordinates
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_should_obtain_the_clock_mark_width
|
19
|
-
clock = RubyMarks::ClockMark.new(document: @document, position: @positions[:first_clock_position])
|
20
|
-
assert_equal 27, clock.width
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_should_obtain_the_clock_mark_height
|
24
|
-
clock = RubyMarks::ClockMark.new(document: @document, position: @positions[:first_clock_position])
|
25
|
-
assert_equal 12, clock.height
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_should_obtain_the_horizontal_middle_position
|
29
|
-
clock = RubyMarks::ClockMark.new(document: @document, position: @positions[:first_clock_position])
|
30
|
-
assert_equal 61, clock.horizontal_middle_position
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_should_obtain_the_vertical_middle_position
|
34
|
-
clock = RubyMarks::ClockMark.new(document: @document, position: @positions[:first_clock_position])
|
35
|
-
assert_equal 796, clock.vertical_middle_position
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
@@ -1,88 +0,0 @@
|
|
1
|
-
require "test_helper"
|
2
|
-
|
3
|
-
class RubyMarks::DocumentTest < Test::Unit::TestCase
|
4
|
-
|
5
|
-
def setup
|
6
|
-
@file = 'assets/sheet_demo1.png'
|
7
|
-
@document = RubyMarks::Document.new(@file)
|
8
|
-
@positions = {}
|
9
|
-
@positions[:marked_position] = {x: 161, y: 794}
|
10
|
-
@positions[:unmarked_position] = {x: 161, y: 994}
|
11
|
-
@positions[:first_clock_position] = {x: 62, y: 794}
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_should_initialize_a_document_with_a_valid_file
|
15
|
-
assert_equal @file, @document.filename
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_should_return_a_file_with_a_position_flagged
|
19
|
-
@document.current_position = @positions[:first_clock_position]
|
20
|
-
flagged_document = @document.flag_position
|
21
|
-
assert_equal Magick::Image, flagged_document.class
|
22
|
-
|
23
|
-
# temp_filename = "temp_sheet_demo1.png"
|
24
|
-
# File.delete(temp_filename) if File.exist?(temp_filename)
|
25
|
-
# flagged_document.write(temp_filename)
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_should_recognize_marked_position
|
29
|
-
@document.current_position = @positions[:marked_position]
|
30
|
-
assert @document.marked?, "The position wasn't recognized as marked"
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_should_recognize_not_marked_position
|
34
|
-
@document.current_position = @positions[:unmarked_position]
|
35
|
-
assert @document.unmarked?, "The position wasn't recognized as unmarked"
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_should_recognize_the_document_clock_marks
|
39
|
-
@document.scan_clock_marks
|
40
|
-
assert_equal 20, @document.clock_marks.count
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_should_return_the_document_with_all_marks_flagged
|
44
|
-
flagged_document = @document.flag_all_marks
|
45
|
-
assert_equal Magick::Image, flagged_document.class
|
46
|
-
|
47
|
-
# temp_filename = "temp_sheet_demo2.png"
|
48
|
-
# File.delete(temp_filename) if File.exist?(temp_filename)
|
49
|
-
# flagged_document.write(temp_filename)
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_should_move_the_current_position_in_10_and_20_pixels
|
53
|
-
@document.current_position = @positions[:marked_position]
|
54
|
-
expected_position = {x: 171, y: 814}
|
55
|
-
|
56
|
-
assert_equal expected_position, @document.move_to(10, 20)
|
57
|
-
end
|
58
|
-
|
59
|
-
def test_should_scan_the_document_and_get_a_hash_of_marked_marks
|
60
|
-
expected_hash = {
|
61
|
-
clock_1: {
|
62
|
-
group_1: ['A'],
|
63
|
-
group_2: ['A']
|
64
|
-
},
|
65
|
-
clock_2: {
|
66
|
-
group_1: ['B'],
|
67
|
-
group_2: ['B']
|
68
|
-
},
|
69
|
-
clock_3: {
|
70
|
-
group_1: ['C'],
|
71
|
-
group_2: ['C'],
|
72
|
-
group_3: ['D']
|
73
|
-
},
|
74
|
-
clock_4: {
|
75
|
-
group_1: ['D'],
|
76
|
-
group_2: ['D'],
|
77
|
-
group_3: ['D']
|
78
|
-
},
|
79
|
-
clock_5: {
|
80
|
-
group_1: ['E'],
|
81
|
-
group_2: ['E']
|
82
|
-
}
|
83
|
-
}
|
84
|
-
p @document.scan
|
85
|
-
assert_equal expected_hash, @document.scan
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
data/test/ruby_marks/rgb_test.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
require "test_helper"
|
2
|
-
|
3
|
-
class RubyMarks::RGBTest < Test::Unit::TestCase
|
4
|
-
|
5
|
-
def test_should_return_the_white_color_in_hexa_receiving_8bits
|
6
|
-
color = RubyMarks::RGB.to_hex(255, 255, 255)
|
7
|
-
assert_equal "#FFFFFF", color
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_should_return_the_white_color_in_hexa_receiving_16bits
|
11
|
-
color = RubyMarks::RGB.to_hex(65535, 65535, 65535)
|
12
|
-
assert_equal "#FFFFFF", color
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|