Sha256: b62e175a121ac37d14317c784b3091769e20fc22e9ca3a8a42606c493d68fc9e

Contents?: true

Size: 1.86 KB

Versions: 96

Compression:

Stored size: 1.86 KB

Contents

require "active_support/concern"
require "fileutils"

module EasyML
  module Support
    module GitIgnorable
      extend ActiveSupport::Concern

      included do
        class_attribute :gitignore_attributes, default: {}

        def self.set_gitignore_callbacks(attribute, &block)
          gitignore_attributes[attribute] = block

          prepend GitignoreInitializer
        end
      end

      module GitignoreInitializer
        def initialize(options)
          super
          update_gitignore
        end
      end

      class_methods do
        def gitignore(attribute, &block)
          set_gitignore_callbacks(attribute, &block)
        end
      end

      def update_gitignore
        self.class.gitignore_attributes.each do |attribute, block|
          attribute_value = send(attribute)
          next if attribute_value.blank?

          patterns = block ? block.call(attribute_value) : attribute_value
          next if patterns.nil? || (patterns.respond_to?(:empty?) && patterns.empty?)

          patterns = [patterns] unless patterns.is_a?(Array)
          patterns = relativize(patterns)
          gitignore_path = File.join(Dir.pwd, ".gitignore")

          FileUtils.mkdir_p(File.dirname(gitignore_path))
          FileUtils.touch(gitignore_path) unless File.exist?(gitignore_path)

          existing_content = File.read(gitignore_path).split("\n")
          new_patterns = patterns.reject { |pattern| existing_content.include?(pattern) }
          next if new_patterns.empty?

          new_content = (existing_content + new_patterns).join("\n").strip
          File.write(gitignore_path, new_content)
        end
      end

      private

      # Turn patterns like /Users/xyz/path/to/rails/x/**/* into: x/**/*
      def relativize(patterns)
        patterns.map do |pattern|
          pattern.sub(%r{^#{Regexp.escape(Dir.pwd)}/}, "")
        end
      end
    end
  end
end

Version data entries

96 entries across 96 versions & 1 rubygems

Version Path
easy_ml-0.2.0.pre.rc105 lib/easy_ml/support/git_ignorable.rb
easy_ml-0.2.0.pre.rc104 lib/easy_ml/support/git_ignorable.rb
easy_ml-0.2.0.pre.rc103 lib/easy_ml/support/git_ignorable.rb
easy_ml-0.2.0.pre.rc102 lib/easy_ml/support/git_ignorable.rb
easy_ml-0.2.0.pre.rc101 lib/easy_ml/support/git_ignorable.rb
easy_ml-0.2.0.pre.rc100 lib/easy_ml/support/git_ignorable.rb
easy_ml-0.2.0.pre.rc99 lib/easy_ml/support/git_ignorable.rb
easy_ml-0.2.0.pre.rc98 lib/easy_ml/support/git_ignorable.rb
easy_ml-0.2.0.pre.rc97 lib/easy_ml/support/git_ignorable.rb
easy_ml-0.2.0.pre.rc96 lib/easy_ml/support/git_ignorable.rb
easy_ml-0.2.0.pre.rc95 lib/easy_ml/support/git_ignorable.rb
easy_ml-0.2.0.pre.rc94 lib/easy_ml/support/git_ignorable.rb
easy_ml-0.2.0.pre.rc93 lib/easy_ml/support/git_ignorable.rb
easy_ml-0.2.0.pre.rc92 lib/easy_ml/support/git_ignorable.rb
easy_ml-0.2.0.pre.rc91 lib/easy_ml/support/git_ignorable.rb
easy_ml-0.2.0.pre.rc90 lib/easy_ml/support/git_ignorable.rb
easy_ml-0.2.0.pre.rc89 lib/easy_ml/support/git_ignorable.rb
easy_ml-0.2.0.pre.rc88 lib/easy_ml/support/git_ignorable.rb
easy_ml-0.2.0.pre.rc85 lib/easy_ml/support/git_ignorable.rb
easy_ml-0.2.0.pre.rc84 lib/easy_ml/support/git_ignorable.rb