lib/dato/cli.rb in dato-0.3.8 vs lib/dato/cli.rb in dato-0.3.9

- old
+ new

@@ -1,32 +1,76 @@ # frozen_string_literal: true require 'thor' require 'dato/dump/runner' require 'dato/dump/ssg_detector' require 'dato/migrate_slugs/runner' +require 'dato/watch/site_change_watcher' +require 'listen' +require 'thread' module Dato class Cli < Thor package_name 'DatoCMS' desc 'dump', 'dumps DatoCMS content into local files' option :config, default: 'dato.config.rb' option :token, default: ENV['DATO_API_TOKEN'], required: true + option :watch, default: false, type: :boolean def dump config_file = File.expand_path(options[:config]) + watch_mode = options[:watch] client = Dato::Site::Client.new( options[:token], extra_headers: { 'X-Reason' => 'dump', 'X-SSG' => Dump::SsgDetector.new(Dir.pwd).detect } ) - Dump::Runner.new(config_file, client).run + if watch_mode + site_id = client.request(:get, '/site')['data']['id'] + + semaphore = Mutex.new + + thread_safe_dump(semaphore, config_file, client) + + Dato::Watch::SiteChangeWatcher.new(site_id).connect do + thread_safe_dump(semaphore, config_file, client) + end + + watch_config_file(config_file) do + thread_safe_dump(semaphore, config_file, client) + end + + sleep + else + Dump::Runner.new(config_file, client).run + end end + desc 'check', 'checks the presence of a DatoCMS token' + def check + exit 0 if ENV['DATO_API_TOKEN'] + + say 'Site token is not specified!' + token = ask "Please paste your DatoCMS site read-only API token:\n>" + + if !token || token.empty? + puts 'Missing token' + exit 1 + end + + File.open('.env', 'a') do |file| + file.puts "DATO_API_TOKEN=#{token}" + end + + say 'Token added to .env file.' + + exit 0 + end + desc 'migrate-slugs', 'migrates a Site so that it uses slug fields' option :token, default: ENV['DATO_API_TOKEN'], required: true option :skip_id_prefix, type: :boolean def migrate_slugs client = Dato::Site::Client.new( @@ -35,8 +79,24 @@ 'X-Reason' => 'migrate-slugs' } ) MigrateSlugs::Runner.new(client, options[:skip_id_prefix]).run + end + + no_tasks do + def watch_config_file(config_file, &block) + Listen.to( + File.dirname(config_file), + only: /#{Regexp.quote(File.basename(config_file))}/, + &block + ).start + end + + def thread_safe_dump(semaphore, config_file, client) + semaphore.synchronize do + Dump::Runner.new(config_file, client).run + end + end end end end