Module: Zugzwang::Create

Defined in:
lib/zugzwang/create.rb

Class Method Summary collapse

Class Method Details

.[](database_object, database, extension, items) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/zugzwang/create.rb', line 7

def self.[](database_object, database, extension, items)
    database_object.create_table :games do
        primary_key :id
        FIELDS.each do |name, options|
            case options[:type]
            when :string  then String name, size: (options[:size]||255)
            when :integer then Integer name
            when :date    then Date name
            when :time    then Time name, only_time: true
            end
        end
    end

    files = items.map{|item|
        File.file?(item) ? Dir[item] : Dir["#{item}/**/*.pgn"]
    }.flatten

    puts if files.map{|f|File.file? f}.any?{|f|f==true}

    files.each do |f|
        record = {}
        prev = ''
        lines = `sed -n '=' #{f} | wc -l`.to_i
        puts "\e[90mProcessing file:\e[0m \e[1m#{f}\e[0m"
        progress_bar = ProgressBar.create(:title => 'Progress', total: lines, progress_mark: "\e[1;35m#{?#}\e[0m", remainder_mark: ?., format: "%t: %p%% (Line: %c/%C) %B")
        File.open(f,'r').each do |line|
            if prev =~ /\A\[.*\Z/ && line =~ /\A[\n\r].*\Z/
                database_object[:games].insert(**record)
                record = {}
                prev = line
                progress_bar.increment
                next
            end
            if line =~ /\A([\n\r]|[0-9]).*\Z/
                prev = line
                progress_bar.increment
                next
            end
            subbed = line.gsub(%r{[\r\n\[\]\"]},'')
            field, value = subbed.split(' ', 2)
            field = field.to_sym
            if FIELDS[field]
                record[field] = case FIELDS[field][:type]
                when :string  then value
                when :integer then value.to_i
                when :date    then Date.parse(value)
                when :time    then value
                end
            end
            prev = line
            progress_bar.increment
        end
    end

    puts "\n\e[92mComplete\e[0m: Saved #{extension} database at \e[1m#{database}.#{extension}\e[0m."
end