Module: VersionableDatabase::ClassMethods

Defined in:
lib/versionable_database.rb

Instance Method Summary collapse

Instance Method Details

#versionify(options = {}) ⇒ 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
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
# File 'lib/versionable_database.rb', line 7

def versionify(options = {})
  options.reverse_merge!(:version_directory => "#{RAILS_ROOT}/versions")
  send(:include, VersionableDatabase::InstanceMethods)
  after_destroy :version!
  after_save :version!

  self.instance_eval do
    def commit!(message = Time.now.to_s)
      response = `cd #{self.version_dir} && git add . && git commit -am '#{message}'`

      logger.debug("#### START VERSIONING ####")
      logger.debug(response)
      # logger.debug $?
      logger.debug("#### END VERSIONING ####")
    end

    def version
      File.open(self.version_file, 'w+') { |file| file.write(self.all.to_yaml) }
    end

    def version_dir
      @@version_dir
    end

    def version_dir=(directory)
      @@version_dir = directory
    end

    def version_dir_name
      @@version_dir_name
    end

    def version_dir_name=(directory_name)
      @@version_dir_name = directory_name
    end

    def version_file
      File.join(self.version_dir, self.class_name.tableize, self.version_file_name)
    end

    def version_file_name
      "#{self.class_name.tableize}.yml"
    end

    def unversion!
      File.delete(version_file)
      self.all.map(&:unversion!)
      self.commit!("No longer version controlling #{self.class_name}.")
    end

    private
      def create_version_directories!
        Dir.mkdir(self.version_dir) unless File.exists?(self.version_dir)
        Dir.mkdir(File.join(self.version_dir, self.class_name.tableize)) unless File.exists?(File.join(self.version_dir, self.class_name.tableize))
      end

      def initialize_git_repository!
        unless File.exists?(File.join(self.version_dir, '.git'))
          response = `cd #{self.version_dir} && git init`

          logger.debug("#### START INITIALIZING GIT REPOSITORY ####")
          logger.debug(response)
          # logger.debug $?
          logger.debug("#### END INITIALIZING GIT REPOSITORY ####")
        end
      end

      def setup_complete?
        File.exists?(self.version_dir) &&
        File.exists?(File.join(self.version_dir, self.class_name.tableize)) &&
        File.exists?(File.join(self.version_dir, '.git'))
      end

      # Create the necessary directories and files, along with initializing a new git repo when needed
      def setup!(options)
        self.version_dir      = options[:version_directory]
        self.version_dir_name = options[:version_directory].split('/').last
        unless setup_complete?
          create_version_directories!
          initialize_git_repository!
          STDOUT.puts "***************** IMPORTANT *****************"
          STDOUT.puts "Versionable has created a new direcotry in #{self.version_dir} where files will be written to and stored."
          STDOUT.puts "Since you may not want Git tracking the files Versionable creates, you may want to add #{self.version_dir_name}/* to your .gitignore file."
          STDOUT.puts "If you don't already have a .gitignore file in #{RAILS_ROOT} (#{File.exists?(File.join(RAILS_ROOT, '.gitignore')) ? "and you do" : "which you don't"}) you may want to create one now."
        end
      end
  end
  setup!(options)
end