Browse Source

Log entries/types/files diff in docs:generate command

Thibaut 10 years ago
parent
commit
5c4c1ce2b6
3 changed files with 55 additions and 3 deletions
  1. 11 2
      lib/docs/core/doc.rb
  2. 43 0
      lib/docs/subscribers/doc_subscriber.rb
  3. 1 1
      lib/tasks/docs.thor

+ 11 - 2
lib/docs/core/doc.rb

@@ -4,6 +4,8 @@ module Docs
     DB_FILENAME = 'db.json'
 
     class << self
+      include Instrumentable
+
       attr_accessor :name, :slug, :type, :version, :abstract, :links
 
       def inherited(subclass)
@@ -63,8 +65,8 @@ module Docs
           end
 
           if index.present?
-            store.write INDEX_FILENAME, index.to_json
-            store.write DB_FILENAME, pages.to_json
+            store_index(store, INDEX_FILENAME, index)
+            store_index(store, DB_FILENAME, pages)
             true
           else
             false
@@ -77,6 +79,13 @@ module Docs
       def store_page?(page)
         page[:entries].present?
       end
+
+      def store_index(store, filename, index)
+        old_json = store.read(filename) || '{}'
+        new_json = index.to_json
+        instrument "#{filename.remove('.json')}.doc", before: old_json, after: new_json
+        store.write(filename, new_json)
+      end
     end
 
     def initialize

+ 43 - 0
lib/docs/subscribers/doc_subscriber.rb

@@ -0,0 +1,43 @@
+module Docs
+  class DocSubscriber < Subscriber
+    self.namespace = 'doc'
+
+    def index(event)
+      before, after = parse_payload(event)
+      log "Entries:"
+      log_diff before['entries'], after['entries'], 'name'
+      log "Types:"
+      log_diff before['types'],   after['types'],   'name'
+    end
+
+    def db(event)
+      before, after = parse_payload(event)
+      log "Files:"
+      log_diff before.keys, after.keys
+    end
+
+    private
+
+    def parse_payload(event)
+      [JSON.parse(event.payload[:before]), JSON.parse(event.payload[:after])]
+    end
+
+    def log_diff(before, after, prop = nil)
+      before ||= []
+      after  ||= []
+
+      if prop
+        before = before.map { |obj| obj[prop] }
+        after  = after.map  { |obj| obj[prop] }
+      end
+
+      created, updated, deleted = (after - before), (before & after), (before - after)
+
+      log "  Updated: #{updated.length}"
+      log "  Created: #{created.length}"
+      created.each { |str| log "    + #{str}" }
+      log "  Deleted: #{deleted.length}"
+      deleted.each { |str| log "    - #{str}" }
+    end
+  end
+end

+ 1 - 1
lib/tasks/docs.thor

@@ -50,7 +50,7 @@ class DocsCLI < Thor
   def generate(name)
     Docs.install_report :store if options[:verbose]
     Docs.install_report :scraper if options[:debug]
-    Docs.install_report :progress_bar if $stdout.tty?
+    Docs.install_report :progress_bar, :doc if $stdout.tty?
 
     unless options[:force]
       puts <<-TEXT.strip_heredoc