ruby_marks 0.0.1.dev → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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.dev
5
- prerelease: 6
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
- - !ruby/object:Gem::Dependency
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
- - test/ruby_marks/clock_mark_test.rb
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: 1.3.1
39
+ version: '0'
65
40
  requirements: []
66
- rubyforge_project: ruby_marks
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,4 +0,0 @@
1
- ruby_marks
2
- ==========
3
-
4
- Ruby Marks
@@ -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
@@ -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
@@ -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
@@ -1,3 +0,0 @@
1
- module RubyMarks
2
- VERSION = "0.0.1.dev".freeze
3
- end
@@ -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
-
@@ -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
data/test/test_helper.rb DELETED
@@ -1,6 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler/setup'
3
- require 'test/unit'
4
- require 'ruby_marks'
5
-
6
- $:.unshift File.expand_path("../../assets", __FILE__)