Class: Dumbo::RakeTask

Inherits:
Rake::TaskLib
  • Object
show all
Defined in:
lib/dumbo/rake_task.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name = 'dumbo') ⇒ RakeTask

Returns a new instance of RakeTask.



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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/dumbo/rake_task.rb', line 16

def initialize(name = 'dumbo')
  @name = name

  namespace name do
    Dumbo::DbTask.new(:db)

    desc 'creates and installs extension'
    task all: [:src, Extension.file_name, :install]

    desc 'installs the extension'
    task :install do
      cmd = if ENV['DUMBO_USE_SUDO']
        'make clean && make && sudo make install'
      else
        'make clean && make && make install'
      end
      system(cmd)
    end

    desc 'concatenates files'
    file Extension.file_name => file_list do |t|
      sql = t.prerequisites.map do |file|
        ["--source file #{file}"] + get_sql(file) + [' ']
      end.flatten
      concatenate sql, t.name
    end

    desc 'prepare source files'
    task :src do
      Dir.glob('src/**/*.erb').each do |file|
        src = convert_template(file)
        out = Pathname.new(file).sub_ext('')
        File.open(out.to_s, 'w') do |f|
          f.puts src.join("\n")
        end
      end
    end

    desc 'creates migration files for the last two versions'
    task :migrations do
      old_version, new_version = Extension.versions.last(2).map(&:to_s)

      if new_version
        ExtensionMigrator.new(Extension.name, old_version, new_version)
        .create
      end
    end

    desc 'upgrate .control file to a new version'
    task :new_version, :level do |t, args|
      args.with_defaults(level: 'patch')

      v = new_version(args[:level])
      Extension.version!(v)

      Rake::Task["#{name}:all"].invoke
    end

    namespace :test do
      desc 'creates regression tests from specs and runs them'
      task regression: ['all', 'db:test:prepare'] do
        ENV['DUMBO_REGRESSION'] = 'true'

        FileUtils.mkdir_p('test/sql/')
        FileUtils.mkdir_p('test/expected/')

        RSpec::Core::RakeTask.new(:spec).run_task(false)

        if $?.success?
          test_files = Rake::FileList.new("test/sql/**/*.sql")
          out_files  = test_files.pathmap("%{^test/sql/,test/expected/}X.out")
          out_files.each{|f| FileUtils.touch(f)}
          system('make installcheck &> /dev/null')

          out_files.pathmap("%{^test/expected/,results/}p").each do |f|
            FileUtils.cp(f,'test/expected/')
            File.delete(f)
          end

          system('make installcheck')
        else
          Dir.glob('test/*').each{|f| File.delete(f)}
        end
      end
    end
  end
end

Instance Attribute Details

#nameObject

Returns the value of attribute name.



14
15
16
# File 'lib/dumbo/rake_task.rb', line 14

def name
  @name
end

Instance Method Details

#concatenate(lines, target) ⇒ Object



113
114
115
116
117
118
119
# File 'lib/dumbo/rake_task.rb', line 113

def concatenate(lines, target)
  File.open(target, 'w') do |f|
    lines.each do |line|
      f.puts line unless line =~ DependencyResolver.depends_pattern
    end
  end
end

#convert_template(file) ⇒ Object



130
131
132
133
134
# File 'lib/dumbo/rake_task.rb', line 130

def convert_template(file)
  eruby = Erubis::Eruby.new(File.read(file))
  bindigs = get_bindings(file)
  eruby.result(bindigs).split("\n")
end

#file_listObject

source sql file list



109
110
111
# File 'lib/dumbo/rake_task.rb', line 109

def file_list
  DependencyResolver.new(Dir.glob('sql/**/*.{sql,erb}')).resolve
end

#get_bindings(file) ⇒ Object



136
137
138
# File 'lib/dumbo/rake_task.rb', line 136

def get_bindings(file)
  BindingLoader.new(file).load
end

#get_sql(file) ⇒ Object



121
122
123
124
125
126
127
128
# File 'lib/dumbo/rake_task.rb', line 121

def get_sql(file)
  ext = Pathname.new(file).extname
  if  ext == '.erb'
    convert_template(file)
  else
    File.readlines(file)
  end
end

#new_version(level = :patch) ⇒ Object



104
105
106
# File 'lib/dumbo/rake_task.rb', line 104

def new_version(level = :patch)
  ExtensionVersion.new_from_string(Extension.version).bump(level).to_s
end