M Manifest.txt +0 -12
@@ 1,13 1,6 @@ 
-.assembly/commit/on_commit-00_quality_check
-.assembly/commit/on_commit-01_test
-.assembly/tag/on_tag-00_check_signature
-.assembly/tag/on_tag-01_test
-.assembly/tag/on_tag-02_release
-.assembly/tag/on_tag-03_publish_docs
 .document
 .rdoc_options
 .simplecov
-ChangeLog
 Cookbook.md
 History.md
 LICENSE.txt

          
@@ 27,10 20,8 @@ lib/assemblage/cli.rb
 lib/assemblage/client.rb
 lib/assemblage/command/client.rb
 lib/assemblage/command/publisher.rb
-lib/assemblage/command/repo.rb
 lib/assemblage/command/server.rb
 lib/assemblage/command/worker.rb
-lib/assemblage/commit.rb
 lib/assemblage/connection.rb
 lib/assemblage/db_object.rb
 lib/assemblage/event.rb

          
@@ 40,13 31,10 @@ lib/assemblage/publisher.rb
 lib/assemblage/refinements.rb
 lib/assemblage/repository.rb
 lib/assemblage/server.rb
-lib/assemblage/user.rb
 lib/assemblage/vcs_strategy.rb
 lib/assemblage/vcs_strategy/mercurial.rb
 lib/assemblage/worker.rb
 lib/cztop/monkeypatches.rb
-local.db
-spec/.status
 spec/assemblage/auth_spec.rb
 spec/assemblage/client_spec.rb
 spec/assemblage/mixins_spec.rb

          
M README.md +10 -6
@@ 6,7 6,7 @@ home
 : https://assembla.ge/
 
 code
-: https://bitbucket.org/sascrotch/assemblage
+: https://hg.sr.ht/~ged/assemblage
 
 github
 : https://github.com/ged/assemblage

          
@@ 112,20 112,24 @@ Now when commits arrive at our repo, it 
 ## Contributing
 
 You can check out the current development source with Mercurial via
-[Bitbucket](http://bitbucket.org/sascrotch/assemblage). Or if you prefer Git,
+[Sourcehut](https://hg.sr.ht/~ged/assemblage). Or if you prefer Git,
 via [its Github mirror](https://github.com/ged/assemblage).
 
 After checking out the source, run:
 
-    $ rake newb
+    $ rake setup
+
+This task will install any missing dependencies and do any developer setup.
 
-This task will install any missing dependencies, run the tests/specs,
-and generate the API documentation.
+
+## Authors
+
+- Michael Granger <ged@faeriemud.org>
 
 
 ## License
 
-Copyright (c) 2018, Michael Granger
+Copyright (c) 2018-2019, Michael Granger
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without

          
M Rakefile +5 -110
@@ 1,113 1,8 @@ 
-#!/usr/bin/env rake
+#!/usr/bin/env ruby -S rake
 
-begin
-	require 'hoe'
-rescue LoadError
-	abort "This Rakefile requires hoe (gem install hoe)"
+require 'rake/deveiate'
+
+Rake::DevEiate.setup( 'assemblage' ) do |project|
+	project.publish_to = 'deveiate:/usr/local/www/public/code'
 end
 
-GEMSPEC = 'assemblage.gemspec'
-
-
-Hoe.plugin :mercurial
-Hoe.plugin :signing
-Hoe.plugin :deveiate
-
-Hoe.plugins.delete :rubyforge
-
-hoespec = Hoe.spec 'assemblage' do |spec|
-	spec.urls = {
-		home: 'https://assembla.ge/',
-		code: 'https://bitbucket.org/sascrotch/assemblage',
-		github: 'https://github.com/ged/assemblage',
-		docs: 'http://assembla.ge/docs/assemblage'
-	}
-
-	spec.readme_file = 'README.md'
-	spec.history_file = 'History.md'
-
-	spec.extra_rdoc_files = FileList[ '*.rdoc', '*.md' ]
-	spec.license 'BSD-3-Clause'
-
-	spec.developer 'Michael Granger', 'ged@FaerieMUD.org'
-
-	spec.dependency 'loggability', '~> 0.11'
-	spec.dependency 'configurability', '~> 3.2'
-	spec.dependency 'hglib', '~> 0.2'
-	spec.dependency 'git', '~> 1.3'
-	spec.dependency 'gli', '~> 2.18'
-	spec.dependency 'tty-prompt', '~> 0.18'
-	spec.dependency 'tty-table', '~> 0.10'
-	spec.dependency 'sequel', '~> 5.6'
-	spec.dependency 'msgpack', '~> 1.2'
-	spec.dependency 'rb-readline', '~> 0.5'
-	spec.dependency 'rbnacl', '~> 5.0'
-	spec.dependency 'state_machines', '~> 0.5'
-	spec.dependency 'cztop-reactor', '~> 0.7'
-	spec.dependency 'pluggability', '~> 0.6'
-
-	spec.dependency 'hoe-deveiate', '~> 0.3', :developer
-	spec.dependency 'simplecov', '~> 0.7', :developer
-	spec.dependency 'rdoc-generator-fivefish', '~> 0.4', :developer
-	spec.dependency 'rdoc', '~> 6.0', :developer
-	spec.dependency 'sqlite3', '~> 1.3', :developer
-	spec.dependency 'rspec-wait', '~> 0.0', :developer
-
-	spec.require_ruby_version( '>=2.3.4' )
-	spec.hg_sign_tags = true if spec.respond_to?( :hg_sign_tags= )
-	spec.check_history_on_release = true if spec.respond_to?( :check_history_on_release= )
-
-	self.rdoc_locations << "deveiate:/usr/local/assemblage/docs/#{remote_rdoc_dir}"
-end
-
-
-ENV['VERSION'] ||= hoespec.spec.version.to_s
-
-# Run the tests before checking in
-task 'hg:precheckin' => [ :check_history, :check_manifest, :gemspec, :spec ]
-
-task :test => :spec
-
-# Rebuild the ChangeLog immediately before release
-task :prerelease => 'ChangeLog'
-CLOBBER.include( 'ChangeLog' )
-
-desc "Build a coverage report"
-task :coverage do
-	ENV["COVERAGE"] = 'yes'
-	Rake::Task[:spec].invoke
-end
-CLOBBER.include( 'coverage' )
-
-
-# Use the fivefish formatter for docs generated from development checkout
-if File.directory?( '.hg' )
-	require 'rdoc/task'
-
-	Rake::Task[ 'docs' ].clear
-	RDoc::Task.new( 'docs' ) do |rdoc|
-	    rdoc.main = "README.md"
-		rdoc.markup = 'markdown'
-	    rdoc.rdoc_files.include( "*.md", "*.rdoc", "ChangeLog", "lib/**/*.rb" )
-	    rdoc.generator = :fivefish
-		rdoc.title = 'Assemblage'
-	    rdoc.rdoc_dir = 'doc'
-	end
-end
-
-task :gemspec => GEMSPEC
-file GEMSPEC => __FILE__
-task GEMSPEC do |task|
-	spec = $hoespec.spec
-	spec.files.delete( '.gemtest' )
-	spec.signing_key = nil
-	spec.cert_chain = ['certs/ged.pem']
-	spec.version = "#{spec.version.bump}.0.pre#{Time.now.strftime("%Y%m%d%H%M%S")}"
-	File.open( task.name, 'w' ) do |fh|
-		fh.write( spec.to_ruby )
-	end
-end
-CLOBBER.include( GEMSPEC.to_s )
-
-task :default => :gemspec
-

          
M assemblage.gemspec +14 -34
@@ 1,26 1,21 @@ 
 # -*- encoding: utf-8 -*-
-# stub: assemblage 0.1.0.pre20190722141336 ruby lib
+# stub: assemblage 0.1.0.pre.20191113155733 ruby lib
 
 Gem::Specification.new do |s|
   s.name = "assemblage".freeze
-  s.version = "0.1.0.pre20190722141336"
+  s.version = "0.1.0.pre.20191113155733"
 
   s.required_rubygems_version = Gem::Requirement.new("> 1.3.1".freeze) if s.respond_to? :required_rubygems_version=
   s.require_paths = ["lib".freeze]
   s.authors = ["Michael Granger".freeze]
-  s.cert_chain = ["certs/ged.pem".freeze]
-  s.date = "2019-07-22"
-  s.description = "`assemblage`, **noun**:\n\n1. a collection of parts, as of machinery, put together to form a whole.\n2. the process of joining persons or things to form a whole.\n\nAssemblage is a continuous integration library. It's intended to provide you\nwith a minimal toolkit for distributing and performing automated tasks when\n**commits** arrive at one or more version control **repositories**. It makes as\nfew assumptions as possible as to what those tasks might be.\n\nThe product or output from such a task in Assemblage is called an Assembly.\nAssemblage has three primary parts for manipulating Assemblies: the **Assembly\nServer**, **Assembly Workers**, and **Publishers**. **Assembly Workers** listen for events set to an **Assembly Server** by a **Publisher**, and run one or more **Assembly Scripts** to assemble their products.\n\n<dl>\n  <dt>Assembly Server</dt>\n  <dd>Aggregates and distributes events from <em>repositories</em> to\n  <em>workers</em> to make one or more \"assemblies\".</dd>\n\n  <dt>Assembly Workers</dt>\n  <dd>Listens for <em>events</em> published by the <em>assembly server</em>,\n  checks out a <em>repository</em>, and runs one or more assembly scripts in\n  that repository.</dd>\n\n  <dt>Publisher</dt>\n  <dd>A client that sends events to the server from distributed version control\n  repositories. Assemblage currently supports Mercurial and Git.</dd>\n\n  <dt>Event</dt>\n  <dd>Notification of some change in a repository, e.g., a\n    <code>commit</code>.</dd>\n\n  <dt>Assembly</dt>\n  <dd>A product or collection of products built as a reaction to one or more\n    <em>events</em>.</dd>\n\n  <dt>Assembly Script</dt>\n  <dd>A script that is executed when an <em>event</em> occurs in a repository,\n  checked into the repository source in the `.assembly` directory (by\n  default).</dd>\n</dl>".freeze
-  s.email = ["ged@FaerieMUD.org".freeze]
-  s.executables = ["assemblage".freeze]
-  s.extra_rdoc_files = ["Cookbook.md".freeze, "History.md".freeze, "LICENSE.txt".freeze, "Manifest.txt".freeze, "Protocol.md".freeze, "README.md".freeze, "To-Do.md".freeze, "Cookbook.md".freeze, "History.md".freeze, "Protocol.md".freeze, "README.md".freeze, "To-Do.md".freeze]
-  s.files = [".assembly/commit/on_commit-00_quality_check".freeze, ".assembly/commit/on_commit-01_test".freeze, ".assembly/tag/on_tag-00_check_signature".freeze, ".assembly/tag/on_tag-01_test".freeze, ".assembly/tag/on_tag-02_release".freeze, ".assembly/tag/on_tag-03_publish_docs".freeze, ".document".freeze, ".rdoc_options".freeze, ".simplecov".freeze, "ChangeLog".freeze, "Cookbook.md".freeze, "History.md".freeze, "LICENSE.txt".freeze, "Manifest.txt".freeze, "Protocol.md".freeze, "README.md".freeze, "Rakefile".freeze, "To-Do.md".freeze, "bin/assemblage".freeze, "data/assemblage/hooks/mercurial-hook.rb".freeze, "data/assemblage/migrations/20180314_initial.rb".freeze, "lib/assemblage.rb".freeze, "lib/assemblage/assembly_builder.rb".freeze, "lib/assemblage/assembly_result.rb".freeze, "lib/assemblage/auth.rb".freeze, "lib/assemblage/cli.rb".freeze, "lib/assemblage/client.rb".freeze, "lib/assemblage/command/client.rb".freeze, "lib/assemblage/command/publisher.rb".freeze, "lib/assemblage/command/repo.rb".freeze, "lib/assemblage/command/server.rb".freeze, "lib/assemblage/command/worker.rb".freeze, "lib/assemblage/commit.rb".freeze, "lib/assemblage/connection.rb".freeze, "lib/assemblage/db_object.rb".freeze, "lib/assemblage/event.rb".freeze, "lib/assemblage/mixins.rb".freeze, "lib/assemblage/protocol.rb".freeze, "lib/assemblage/publisher.rb".freeze, "lib/assemblage/refinements.rb".freeze, "lib/assemblage/repository.rb".freeze, "lib/assemblage/server.rb".freeze, "lib/assemblage/user.rb".freeze, "lib/assemblage/vcs_strategy.rb".freeze, "lib/assemblage/vcs_strategy/mercurial.rb".freeze, "lib/assemblage/worker.rb".freeze, "lib/cztop/monkeypatches.rb".freeze, "local.db".freeze, "spec/.status".freeze, "spec/assemblage/auth_spec.rb".freeze, "spec/assemblage/client_spec.rb".freeze, "spec/assemblage/mixins_spec.rb".freeze, "spec/assemblage/server_spec.rb".freeze, "spec/assemblage/vcs_strategy_spec.rb".freeze, "spec/assemblage/worker_spec.rb".freeze, "spec/assemblage_spec.rb".freeze, "spec/spec_helper.rb".freeze]
+  s.date = "2019-11-13"
+  s.description = "A continuous integration toolkit.".freeze
+  s.email = ["ged@faeriemud.org".freeze]
+  s.files = [".document".freeze, ".rdoc_options".freeze, ".simplecov".freeze, "Cookbook.md".freeze, "History.md".freeze, "LICENSE.txt".freeze, "Manifest.txt".freeze, "Protocol.md".freeze, "README.md".freeze, "Rakefile".freeze, "To-Do.md".freeze, "bin/assemblage".freeze, "data/assemblage/hooks/mercurial-hook.rb".freeze, "data/assemblage/migrations/20180314_initial.rb".freeze, "lib/assemblage.rb".freeze, "lib/assemblage/assembly_builder.rb".freeze, "lib/assemblage/assembly_result.rb".freeze, "lib/assemblage/auth.rb".freeze, "lib/assemblage/cli.rb".freeze, "lib/assemblage/client.rb".freeze, "lib/assemblage/command/client.rb".freeze, "lib/assemblage/command/publisher.rb".freeze, "lib/assemblage/command/server.rb".freeze, "lib/assemblage/command/worker.rb".freeze, "lib/assemblage/connection.rb".freeze, "lib/assemblage/db_object.rb".freeze, "lib/assemblage/event.rb".freeze, "lib/assemblage/mixins.rb".freeze, "lib/assemblage/protocol.rb".freeze, "lib/assemblage/publisher.rb".freeze, "lib/assemblage/refinements.rb".freeze, "lib/assemblage/repository.rb".freeze, "lib/assemblage/server.rb".freeze, "lib/assemblage/vcs_strategy.rb".freeze, "lib/assemblage/vcs_strategy/mercurial.rb".freeze, "lib/assemblage/worker.rb".freeze, "lib/cztop/monkeypatches.rb".freeze, "spec/assemblage/auth_spec.rb".freeze, "spec/assemblage/client_spec.rb".freeze, "spec/assemblage/mixins_spec.rb".freeze, "spec/assemblage/server_spec.rb".freeze, "spec/assemblage/vcs_strategy_spec.rb".freeze, "spec/assemblage/worker_spec.rb".freeze, "spec/assemblage_spec.rb".freeze, "spec/spec_helper.rb".freeze]
   s.homepage = "https://assembla.ge/".freeze
   s.licenses = ["BSD-3-Clause".freeze]
-  s.rdoc_options = ["--main".freeze, "README.md".freeze]
-  s.required_ruby_version = Gem::Requirement.new(">= 2.3.4".freeze)
-  s.rubygems_version = "3.0.3".freeze
-  s.summary = "`assemblage`, **noun**:  1".freeze
+  s.rubygems_version = "3.0.6".freeze
+  s.summary = "A continuous integration toolkit.".freeze
 
   if s.respond_to? :specification_version then
     s.specification_version = 4

          
@@ 28,7 23,7 @@ Gem::Specification.new do |s|
     if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
       s.add_runtime_dependency(%q<loggability>.freeze, ["~> 0.11"])
       s.add_runtime_dependency(%q<configurability>.freeze, ["~> 3.2"])
-      s.add_runtime_dependency(%q<hglib>.freeze, ["~> 0.2"])
+      s.add_runtime_dependency(%q<hglib>.freeze, ["~> 0.1"])
       s.add_runtime_dependency(%q<git>.freeze, ["~> 1.3"])
       s.add_runtime_dependency(%q<gli>.freeze, ["~> 2.18"])
       s.add_runtime_dependency(%q<tty-prompt>.freeze, ["~> 0.18"])

          
@@ 36,23 31,18 @@ Gem::Specification.new do |s|
       s.add_runtime_dependency(%q<sequel>.freeze, ["~> 5.6"])
       s.add_runtime_dependency(%q<msgpack>.freeze, ["~> 1.2"])
       s.add_runtime_dependency(%q<rb-readline>.freeze, ["~> 0.5"])
-      s.add_runtime_dependency(%q<rbnacl>.freeze, ["~> 5.0"])
       s.add_runtime_dependency(%q<state_machines>.freeze, ["~> 0.5"])
       s.add_runtime_dependency(%q<cztop-reactor>.freeze, ["~> 0.7"])
       s.add_runtime_dependency(%q<pluggability>.freeze, ["~> 0.6"])
-      s.add_development_dependency(%q<hoe-mercurial>.freeze, ["~> 1.4"])
-      s.add_development_dependency(%q<hoe-deveiate>.freeze, ["~> 0.10"])
-      s.add_development_dependency(%q<hoe-highline>.freeze, ["~> 0.2"])
+      s.add_development_dependency(%q<rake-deveiate>.freeze, ["~> 0.5"])
       s.add_development_dependency(%q<simplecov>.freeze, ["~> 0.7"])
       s.add_development_dependency(%q<rdoc-generator-fivefish>.freeze, ["~> 0.4"])
-      s.add_development_dependency(%q<rdoc>.freeze, ["~> 6.0"])
       s.add_development_dependency(%q<sqlite3>.freeze, ["~> 1.3"])
       s.add_development_dependency(%q<rspec-wait>.freeze, ["~> 0.0"])
-      s.add_development_dependency(%q<hoe>.freeze, ["~> 3.17"])
     else
       s.add_dependency(%q<loggability>.freeze, ["~> 0.11"])
       s.add_dependency(%q<configurability>.freeze, ["~> 3.2"])
-      s.add_dependency(%q<hglib>.freeze, ["~> 0.2"])
+      s.add_dependency(%q<hglib>.freeze, ["~> 0.1"])
       s.add_dependency(%q<git>.freeze, ["~> 1.3"])
       s.add_dependency(%q<gli>.freeze, ["~> 2.18"])
       s.add_dependency(%q<tty-prompt>.freeze, ["~> 0.18"])

          
@@ 60,24 50,19 @@ Gem::Specification.new do |s|
       s.add_dependency(%q<sequel>.freeze, ["~> 5.6"])
       s.add_dependency(%q<msgpack>.freeze, ["~> 1.2"])
       s.add_dependency(%q<rb-readline>.freeze, ["~> 0.5"])
-      s.add_dependency(%q<rbnacl>.freeze, ["~> 5.0"])
       s.add_dependency(%q<state_machines>.freeze, ["~> 0.5"])
       s.add_dependency(%q<cztop-reactor>.freeze, ["~> 0.7"])
       s.add_dependency(%q<pluggability>.freeze, ["~> 0.6"])
-      s.add_dependency(%q<hoe-mercurial>.freeze, ["~> 1.4"])
-      s.add_dependency(%q<hoe-deveiate>.freeze, ["~> 0.10"])
-      s.add_dependency(%q<hoe-highline>.freeze, ["~> 0.2"])
+      s.add_dependency(%q<rake-deveiate>.freeze, ["~> 0.5"])
       s.add_dependency(%q<simplecov>.freeze, ["~> 0.7"])
       s.add_dependency(%q<rdoc-generator-fivefish>.freeze, ["~> 0.4"])
-      s.add_dependency(%q<rdoc>.freeze, ["~> 6.0"])
       s.add_dependency(%q<sqlite3>.freeze, ["~> 1.3"])
       s.add_dependency(%q<rspec-wait>.freeze, ["~> 0.0"])
-      s.add_dependency(%q<hoe>.freeze, ["~> 3.17"])
     end
   else
     s.add_dependency(%q<loggability>.freeze, ["~> 0.11"])
     s.add_dependency(%q<configurability>.freeze, ["~> 3.2"])
-    s.add_dependency(%q<hglib>.freeze, ["~> 0.2"])
+    s.add_dependency(%q<hglib>.freeze, ["~> 0.1"])
     s.add_dependency(%q<git>.freeze, ["~> 1.3"])
     s.add_dependency(%q<gli>.freeze, ["~> 2.18"])
     s.add_dependency(%q<tty-prompt>.freeze, ["~> 0.18"])

          
@@ 85,18 70,13 @@ Gem::Specification.new do |s|
     s.add_dependency(%q<sequel>.freeze, ["~> 5.6"])
     s.add_dependency(%q<msgpack>.freeze, ["~> 1.2"])
     s.add_dependency(%q<rb-readline>.freeze, ["~> 0.5"])
-    s.add_dependency(%q<rbnacl>.freeze, ["~> 5.0"])
     s.add_dependency(%q<state_machines>.freeze, ["~> 0.5"])
     s.add_dependency(%q<cztop-reactor>.freeze, ["~> 0.7"])
     s.add_dependency(%q<pluggability>.freeze, ["~> 0.6"])
-    s.add_dependency(%q<hoe-mercurial>.freeze, ["~> 1.4"])
-    s.add_dependency(%q<hoe-deveiate>.freeze, ["~> 0.10"])
-    s.add_dependency(%q<hoe-highline>.freeze, ["~> 0.2"])
+    s.add_dependency(%q<rake-deveiate>.freeze, ["~> 0.5"])
     s.add_dependency(%q<simplecov>.freeze, ["~> 0.7"])
     s.add_dependency(%q<rdoc-generator-fivefish>.freeze, ["~> 0.4"])
-    s.add_dependency(%q<rdoc>.freeze, ["~> 6.0"])
     s.add_dependency(%q<sqlite3>.freeze, ["~> 1.3"])
     s.add_dependency(%q<rspec-wait>.freeze, ["~> 0.0"])
-    s.add_dependency(%q<hoe>.freeze, ["~> 3.17"])
   end
 end

          
M data/assemblage/migrations/20180314_initial.rb +22 -22
@@ 7,28 7,28 @@ Sequel.migration do
 		create_table( :repositories ) do
 			primary_key :id
 
-			String :name, null: false, unique: true
-			String :type, null: false
-			String :url, null: false, unique: true
+			text :name, null: false, unique: true
+			text :type, null: false
+			text :url, null: false, unique: true
 
 			jsonb :requirements, default: Sequel.pg_jsonb({})
 			jsonb :traits, default: Sequel.pg_jsonb([])
 
-			Time :created_at, default: Sequel.function(:now)
-			Time :updated_at
-			Time :removed_at
+			timestamptz :created_at, default: Sequel.function(:now)
+			timestamptz :updated_at
+			timestamptz :removed_at
 		end
 
 
 		create_table( :connections ) do
 			primary_key :id
 
-			String :type, null: false
-			String :name, null: false
+			text :type, null: false
+			text :name, null: false
 
-			Time :created_at, default: Sequel.function(:now)
-			Time :updated_at
-			Time :removed_at
+			timestamptz :created_at, default: Sequel.function(:now)
+			timestamptz :updated_at
+			timestamptz :removed_at
 
 			unique [:type, :name]
 			constraint( :valid_connection_type, type: %w[worker publisher] )

          
@@ 38,12 38,12 @@ Sequel.migration do
 		create_table( :events ) do
 			primary_key :id
 
-			String :type, null: false
+			text :type, null: false
 			jsonb :data, default: Sequel.pg_jsonb([])
 
-			Time :created_at, default: Sequel.function(:now)
-			Time :updated_at
-			Time :removed_at
+			timestamptz :created_at, default: Sequel.function(:now)
+			timestamptz :updated_at
+			timestamptz :removed_at
 
 			foreign_key :repository_id, :repositories, null: false,
 				on_delete: :cascade

          
@@ 54,11 54,11 @@ Sequel.migration do
 		create_table( :assemblies ) do
 			primary_key :id
 
-			String :name
+			text :name
 
-			Time :created_at, default: Sequel.function(:now)
-			Time :updated_at
-			Time :finished_at
+			timestamptz :created_at, default: Sequel.function(:now)
+			timestamptz :updated_at
+			timestamptz :finished_at
 
 			foreign_key :via_connection_id, :connections, null: false
 			foreign_key :triggering_event_id, :events, null: false,

          
@@ 69,10 69,10 @@ Sequel.migration do
 		create_table( :assembly_results ) do
 			primary_key :id
 
-			File :data
+			bytea :data
 
-			Time :created_at, default: Sequel.function(:now)
-			Time :updated_at
+			timestamptz :created_at, default: Sequel.function(:now)
+			timestamptz :updated_at
 
 			foreign_key :assembly_id, :assemblies, null: false
 		end

          
M .gems => gem.deps.rb +26 -17
@@ 1,17 1,26 @@ 
-configurability
-cztop-reactor
-git
-gli
-hglib
-hoe-deveiate
-loggability
-msgpack
-pluggability
-rb-readline
-rdoc-generator-fivefish
-rspec-wait
-sequel
-simplecov
-sqlite3
-state_machines
-tty
+source 'https://rubygems.org'
+
+gem 'loggability', "~> 0.11"
+gem 'configurability', "~> 3.2"
+gem 'hglib', "~> 0.1"
+gem 'git', "~> 1.3"
+gem 'gli', "~> 2.18"
+gem 'tty-prompt', "~> 0.18"
+gem 'tty-table', "~> 0.10"
+gem 'sequel', "~> 5.6"
+gem 'pg', "~> 1.1"
+gem 'msgpack', "~> 1.2"
+gem 'rb-readline', "~> 0.5"
+gem 'state_machines', "~> 0.5"
+gem 'cztop-reactor', "~> 0.7"
+gem 'pluggability', "~> 0.6"
+
+group :development do
+	gem 'rake-deveiate', "~> 0.5"
+	gem 'simplecov', "~> 0.7"
+	gem 'rdoc-generator-fivefish', "~> 0.4"
+	gem 'rspec-wait', "~> 0.0"
+end
+
+
+

          
M lib/assemblage/db_object.rb +5 -0
@@ 1,6 1,7 @@ 
 # -*- ruby -*-
 # frozen_string_literal: true
 
+require 'pg'
 require 'sequel'
 
 require 'assemblage' unless defined?( Assemblage )

          
@@ 34,6 35,8 @@ class Assemblage::DbObject
 	#
 	Sequel.extension( :migration )
 	Sequel.extension( :core_refinements )
+	Sequel.extension( :pg_json_ops )
+
 
 	plugin :dirty
 	plugin :subclasses

          
@@ 70,6 73,8 @@ class Assemblage::DbObject
 		newdb.sql_log_level = :debug
 		newdb.logger = Loggability[ Assemblage::DbObject ]
 
+		newdb.extension( :pg_json )
+
 		super
 
 		self.descendents.each do |subclass|

          
M lib/assemblage/server.rb +6 -6
@@ 94,12 94,12 @@ class Assemblage::Server
 
 		config = Assemblage.config || Configurability.default_config
 		config.assemblage.auth.cert_store_dir ||= (directory + 'certs').to_s
-		if config.assemblage.db.uri
-			self.log.warn "Database is already set to: %p" % [ config.assemblage.db.uri ]
-		else
-			config.assemblage.db.uri = "sqlite:%s" % [ directory + 'assemblage.db' ]
-			self.log.debug "  No database set up; set to: %s" % [ config.assemblage.db.uri ]
-		end
+		# if config.assemblage.db.uri
+		# 	self.log.warn "Database is already set to: %p" % [ config.assemblage.db.uri ]
+		# else
+		# 	config.assemblage.db.uri = "sqlite:%s" % [ directory + 'assemblage.db' ]
+		# 	self.log.debug "  No database set up; set to: %s" % [ config.assemblage.db.uri ]
+		# end
 
 		config.install
 		config.write( directory + Assemblage::DEFAULT_CONFIG_FILE )

          
M spec/assemblage/client_spec.rb +1 -3
@@ 7,9 7,7 @@ require 'assemblage/client'
 
 describe Assemblage::Client do
 
-	it "is well-tested" do
-		fail "it isn't."
-	end
+	it "can create a client object for a given connection name"
 
 end
 

          
M spec/spec_helper.rb +26 -0
@@ 27,6 27,12 @@ require 'assemblage'
 #
 module AssemblageSpecHelpers
 
+	# The path to the local config file.
+	LOCAL_TEST_CONFIG = Pathname( '~/.assemblage-test.yml' ).expand_path
+
+	# The path to the testing config file, relative to the base of the project.
+	DEFAULT_TEST_CONFIG = Pathname( 'test-config.yml' ).expand_path
+
 	# Pathname constants
 	BASEDIR = Pathname( __FILE__ ).dirname.parent
 	SPECDIR = BASEDIR + 'spec'

          
@@ 147,6 153,26 @@ module AssemblageSpecHelpers
 	end
 
 
+	### Load and install a FM config from the +configfile+ specified. If no
+	### configfile is specified, it will first look for a file at the
+	### LOCAL_TEST_CONFIG. If it doesn't exist, the DEFAULT_TEST_CONFIG will be
+	### checked. If that too doesn't exist, then +nil+ is passed to
+	### FM.load_config, which will use non-test-specific config files.
+	def load_test_config( configfile=nil )
+		configfile ||= ENV[ FM::CONFIG_ENV ]
+		configfile ||= LOCAL_TEST_CONFIG if LOCAL_TEST_CONFIG.exist?
+		configfile ||= DEFAULT_TEST_CONFIG if DEFAULT_TEST_CONFIG.exist?
+
+		configfile = Pathname( configfile ) if configfile
+
+		$stderr.puts "Loading config from: %s" % [ configfile || 'defaults' ]
+
+		unless FM.config && FM.config.path == configfile
+			FM.load_config( configfile )
+		end
+	end
+
+
 
 	#
 	# Custom matchers