purview 1.3.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 857247110c4fa3aeb219d07aa207bc4b7017a3d0
4
- data.tar.gz: 1348881a82f7aa07d31fbf52ead8423c2d7458eb
3
+ metadata.gz: 4bfebf90c2dfbac7b718635c204d78fb6921a779
4
+ data.tar.gz: 7b2da04835cbf716b784300140e02b78d2188aa9
5
5
  SHA512:
6
- metadata.gz: f77a3dd4d4bab8da4beadd7e2ab4f843e5ad9a5f0e87e66912b055dfa87f2d4237926829fe1658188f7aa6ec486a51fd13c71ef125c5049771066287eeeeb134
7
- data.tar.gz: 2d522937e113acd589b83f4d0a0d939f136e461b1620b2181e522d8cfc9d501515865601c2677a8f337e6e21bee9ee0040a612c31c23b1144b28a382451f80bc
6
+ metadata.gz: 5ec0e4d36ea4d42dd29c3d8bf1608c6c30db990ecc4e95b0fc6ddf7c951db243f2225b5a7be117f2f11597a7467cfada79f8b90073de2c5c13c60a6ce79932d8
7
+ data.tar.gz: d43914f1565f2f3a6c4ec41245a4e06e00069c521fb9e892f378500640e16c6e277bc5c93595c95d98d4da34751c97e01afaf3f6e7b28390ab60d610a087b888
data/CHANGELOG CHANGED
@@ -1,36 +1,41 @@
1
- Release 1.3.0
2
- -------------
1
+ Release 1.3.1 (2015-06-05)
2
+ --------------------------
3
+
4
+ * Add `table_metadata` helper to `Database` class
5
+
6
+ Release 1.3.0 (2015-06-04)
7
+ --------------------------
3
8
 
4
9
  * Add support for easily adding additional indices + clean-up
5
10
  * DEPRECATION: `create_temporary_table` deprecated in favor of `create_table`
6
11
  with the `temporary` option specified
7
12
 
8
- Release 1.2.0
9
- -------------
13
+ Release 1.2.0 (2015-06-03)
14
+ --------------------------
10
15
 
11
16
  * Use system-time as opposed to assuming/forcing UTC time
12
17
  * Add `sync_table` helper to `Database` class
13
18
  * Eliminate explicit `return(s)` -- they were causing issues w/ `yield`
14
19
 
15
- Release 1.1.1
16
- -------------
20
+ Release 1.1.1 (2015-06-02)
21
+ --------------------------
17
22
 
18
23
  * Add `baseline_table` helper to `Database` class
19
24
 
20
- Release 1.1.0
21
- -------------
25
+ Release 1.1.0 (2015-06-01)
26
+ --------------------------
22
27
 
23
28
  * Change how `starting_timestamp` is configured
24
29
  * BUGFIX: Fix/standardize exception class/file names
25
30
 
26
- Release 1.0.1
27
- -------------
31
+ Release 1.0.1 (2015-05-29)
32
+ --------------------------
28
33
 
29
34
  * Use consistent naming for database connection-opts (this allowed some DRYing)
30
35
  * OPPREF: Only update `table_metadata` when creating/dropping tables
31
36
 
32
- Release 1.0.0
33
- -------------
37
+ Release 1.0.0 (2015-05-28)
38
+ --------------------------
34
39
 
35
40
  * Support on JRuby, MRI, and RBX for pulling, validating, parsing and loading
36
41
  CSV/TSV and SQL data (ETL)
data/TODO CHANGED
@@ -55,15 +55,17 @@
55
55
 
56
56
  * Add COPY `def copy(sql)` support to PostgreSQL connection
57
57
  * Leverage COPY support for PostgreSQL pulls
58
- * Create class to encapulate `table_metadata` logic
59
- * Further encapsulate `Dialect` logic
58
+ * Create class to encapulate `table_metadata` (in order to clean up the logic
59
+ in the `Database` and `TableMetadata` (struct) classes)
60
+ * Further encapsulate `Dialect` logic (in order to DRY `Database` classes)
61
+
60
62
  * Build out change-log tables
61
63
  * Build out canonical, fact and aggregate tables (and related transforms)
62
64
  * Configurable re-pull window (do this automatically once up to current?)
63
65
  * Add schema management capabilities (detect schema-deltas and suggestion
64
66
  modifications)
65
- * Refactor mutator methods to be globally available (e.g. coalesced -> Coalesce,
66
- quoted -> Quote, etc.)
67
+ * Consider refactoring mutator methods to be globally available (e.g. coalesced
68
+ -> Coalesce, quoted -> Quote, etc.)
67
69
 
68
70
  ... CLOSED QUESTIONS ...
69
71
 
@@ -207,6 +207,21 @@ module Purview
207
207
  table_name
208
208
  end
209
209
 
210
+ def table_metadata(table)
211
+ ensure_table_valid_for_database(table)
212
+ table_metadata = nil
213
+ table_name = table_name(table)
214
+ with_context_logging("`table_metadata` for: #{table_name}") do
215
+ with_new_connection do |connection|
216
+ row = connection.execute(table_metadata_sql(table)).rows.first
217
+ raise Purview::Exceptions::CouldNotFindTableMetadata.new(table) \
218
+ unless row
219
+ table_metadata = Purview::Structs::TableMetadata.new(row)
220
+ end
221
+ end
222
+ table_metadata
223
+ end
224
+
210
225
  def unlock_table(table)
211
226
  ensure_table_valid_for_database(table)
212
227
  table_name = table_name(table)
@@ -576,53 +591,96 @@ module Purview
576
591
  end
577
592
  end
578
593
 
579
- def table_unlocked?(table)
580
- !table_locked?(table)
594
+ def table_metadata_column_definitions
595
+ [
596
+ table_metadata_table_name_column_definition,
597
+ table_metadata_enabled_at_column_definition,
598
+ table_metadata_last_pulled_at_column_definition,
599
+ table_metadata_locked_at_column_definition,
600
+ table_metadata_max_timestamp_pulled_column_definition,
601
+ ]
602
+ end
603
+
604
+ def table_metadata_column_names
605
+ table_metadata_columns.map(&:name)
606
+ end
607
+
608
+ def table_metadata_columns
609
+ [
610
+ table_metadata_table_name_column,
611
+ table_metadata_enabled_at_column,
612
+ table_metadata_last_pulled_at_column,
613
+ table_metadata_locked_at_column,
614
+ table_metadata_max_timestamp_pulled_column,
615
+ ]
616
+ end
617
+
618
+ def table_metadata_enabled_at_column
619
+ Purview::Columns::Timestamp.new(table_metadata_enabled_at_column_name)
581
620
  end
582
621
 
583
622
  def table_metadata_enabled_at_column_definition
584
- column = Purview::Columns::Timestamp.new(table_metadata_enabled_at_column_name)
585
- column_definition(column)
623
+ column_definition(table_metadata_enabled_at_column)
586
624
  end
587
625
 
588
626
  def table_metadata_enabled_at_column_name
589
627
  'enabled_at'
590
628
  end
591
629
 
630
+ def table_metadata_last_pulled_at_column
631
+ Purview::Columns::Timestamp.new(table_metadata_last_pulled_at_column_name)
632
+ end
633
+
592
634
  def table_metadata_last_pulled_at_column_definition
593
- column = Purview::Columns::Timestamp.new(table_metadata_last_pulled_at_column_name)
594
- column_definition(column)
635
+ column_definition(table_metadata_last_pulled_at_column)
595
636
  end
596
637
 
597
638
  def table_metadata_last_pulled_at_column_name
598
639
  'last_pulled_at'
599
640
  end
600
641
 
642
+ def table_metadata_locked_at_column
643
+ Purview::Columns::Timestamp.new(table_metadata_locked_at_column_name)
644
+ end
645
+
601
646
  def table_metadata_locked_at_column_definition
602
- column = Purview::Columns::Timestamp.new(table_metadata_locked_at_column_name)
603
- column_definition(column)
647
+ column_definition(table_metadata_locked_at_column)
604
648
  end
605
649
 
606
650
  def table_metadata_locked_at_column_name
607
651
  'locked_at'
608
652
  end
609
653
 
654
+ def table_metadata_max_timestamp_pulled_column
655
+ Purview::Columns::Timestamp.new(table_metadata_max_timestamp_pulled_column_name)
656
+ end
657
+
610
658
  def table_metadata_max_timestamp_pulled_column_definition
611
- column = Purview::Columns::Timestamp.new(table_metadata_max_timestamp_pulled_column_name)
612
- column_definition(column)
659
+ column_definition(table_metadata_max_timestamp_pulled_column)
613
660
  end
614
661
 
615
662
  def table_metadata_max_timestamp_pulled_column_name
616
663
  'max_timestamp_pulled'
617
664
  end
618
665
 
666
+ def table_metadata_sql(table)
667
+ raise %{All "#{Base}(s)" must override the "table_metadata_sql" method}
668
+ end
669
+
619
670
  def table_metadata_table_name
620
671
  'table_metadata'
621
672
  end
622
673
 
674
+ def table_metadata_table_name_column
675
+ Purview::Columns::Id.new(
676
+ table_metadata_table_name_column_name,
677
+ :type => Purview::Types::String,
678
+ :limit => 255,
679
+ )
680
+ end
681
+
623
682
  def table_metadata_table_name_column_definition
624
- column = Purview::Columns::String.new(table_metadata_table_name_column_name)
625
- column_definition(column)
683
+ column_definition(table_metadata_table_name_column)
626
684
  end
627
685
 
628
686
  def table_metadata_table_name_column_name
@@ -633,6 +691,10 @@ module Purview
633
691
  table_opts[:name] || table.name
634
692
  end
635
693
 
694
+ def table_unlocked?(table)
695
+ !table_locked?(table)
696
+ end
697
+
636
698
  def tables_by_name
637
699
  @tables_by_name ||= {}.tap do |result|
638
700
  tables.each do |table|
@@ -88,13 +88,9 @@ module Purview
88
88
  end
89
89
 
90
90
  def ensure_table_metadata_table_exists_sql
91
- 'CREATE TABLE IF NOT EXISTS %s (%s PRIMARY KEY, %s, %s, %s, %s)' % [
91
+ 'CREATE TABLE IF NOT EXISTS %s (%s)' % [
92
92
  table_metadata_table_name,
93
- table_metadata_table_name_column_definition,
94
- table_metadata_enabled_at_column_definition,
95
- table_metadata_last_pulled_at_column_definition,
96
- table_metadata_locked_at_column_definition,
97
- table_metadata_max_timestamp_pulled_column_definition,
93
+ table_metadata_column_definitions.join(', '),
98
94
  ]
99
95
  end
100
96
 
@@ -212,6 +208,15 @@ module Purview
212
208
  ]
213
209
  end
214
210
 
211
+ def table_metadata_sql(table)
212
+ 'SELECT %s FROM %s WHERE %s = %s' % [
213
+ table_metadata_column_names.join(', '),
214
+ table_metadata_table_name,
215
+ table_metadata_table_name_column_name,
216
+ quoted(table.name),
217
+ ]
218
+ end
219
+
215
220
  def type_map
216
221
  super.merge(
217
222
  Purview::Types::Money => 'decimal',
@@ -88,13 +88,9 @@ module Purview
88
88
  end
89
89
 
90
90
  def ensure_table_metadata_table_exists_sql
91
- 'CREATE TABLE IF NOT EXISTS %s (%s PRIMARY KEY, %s, %s, %s, %s)' % [
91
+ 'CREATE TABLE IF NOT EXISTS %s (%s)' % [
92
92
  table_metadata_table_name,
93
- table_metadata_table_name_column_definition,
94
- table_metadata_enabled_at_column_definition,
95
- table_metadata_last_pulled_at_column_definition,
96
- table_metadata_locked_at_column_definition,
97
- table_metadata_max_timestamp_pulled_column_definition,
93
+ table_metadata_column_definitions.join(', '),
98
94
  ]
99
95
  end
100
96
 
@@ -215,6 +211,15 @@ module Purview
215
211
  ]
216
212
  end
217
213
 
214
+ def table_metadata_sql(table)
215
+ 'SELECT %s FROM %s WHERE %s = %s' % [
216
+ table_metadata_column_names.join(', '),
217
+ table_metadata_table_name,
218
+ table_metadata_table_name_column_name,
219
+ quoted(table.name),
220
+ ]
221
+ end
222
+
218
223
  def type_map
219
224
  super.merge(
220
225
  Purview::Types::Money => 'money',
@@ -0,0 +1,9 @@
1
+ module Purview
2
+ module Exceptions
3
+ class CouldNotFindTableMetadata < BaseTable
4
+ def message
5
+ "Could not find metadata for table: #{table.name}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -4,6 +4,7 @@ require 'purview/exceptions/base_table'
4
4
  require 'purview/exceptions/could_not_baseline'
5
5
  require 'purview/exceptions/could_not_disable'
6
6
  require 'purview/exceptions/could_not_enable'
7
+ require 'purview/exceptions/could_not_find_table_metadata'
7
8
  require 'purview/exceptions/could_not_initialize'
8
9
  require 'purview/exceptions/could_not_lock'
9
10
  require 'purview/exceptions/could_not_sync'
@@ -0,0 +1,39 @@
1
+ module Purview
2
+ module Structs
3
+ class TableMetadata < Base
4
+ def initialize(row)
5
+ enabled_at = row.enabled_at && Time.parse(row.enabled_at)
6
+ last_pulled_at = row.last_pulled_at && Time.parse(row.last_pulled_at)
7
+ locked_at = row.locked_at && Time.parse(row.locked_at)
8
+ max_timestamp_pulled = row.max_timestamp_pulled && Time.parse(row.max_timestamp_pulled)
9
+ super(
10
+ :table_name => row.table_name,
11
+ :enabled_at => enabled_at,
12
+ :last_pulled_at => last_pulled_at,
13
+ :locked_at => locked_at,
14
+ :max_timestamp_pulled => max_timestamp_pulled,
15
+ )
16
+ end
17
+
18
+ def diabled?
19
+ !enabled?
20
+ end
21
+
22
+ def enabled?
23
+ !!enabled_at
24
+ end
25
+
26
+ def initialized?
27
+ !!max_timestamp_pulled
28
+ end
29
+
30
+ def locked?
31
+ !!locked_at
32
+ end
33
+
34
+ def unlocked?
35
+ !locked?
36
+ end
37
+ end
38
+ end
39
+ end
@@ -2,4 +2,5 @@ require 'purview/structs/base'
2
2
 
3
3
  require 'purview/structs/result'
4
4
  require 'purview/structs/row'
5
+ require 'purview/structs/table_metadata'
5
6
  require 'purview/structs/window'
@@ -1,3 +1,3 @@
1
1
  module Purview
2
- VERSION = '1.3.0'
2
+ VERSION = '1.3.1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: purview
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan W. Zaleski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-04 00:00:00.000000000 Z
11
+ date: 2015-06-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -115,6 +115,7 @@ files:
115
115
  - lib/purview/exceptions/could_not_baseline.rb
116
116
  - lib/purview/exceptions/could_not_disable.rb
117
117
  - lib/purview/exceptions/could_not_enable.rb
118
+ - lib/purview/exceptions/could_not_find_table_metadata.rb
118
119
  - lib/purview/exceptions/could_not_initialize.rb
119
120
  - lib/purview/exceptions/could_not_lock.rb
120
121
  - lib/purview/exceptions/could_not_sync.rb
@@ -167,6 +168,7 @@ files:
167
168
  - lib/purview/structs/base.rb
168
169
  - lib/purview/structs/result.rb
169
170
  - lib/purview/structs/row.rb
171
+ - lib/purview/structs/table_metadata.rb
170
172
  - lib/purview/structs/window.rb
171
173
  - lib/purview/tables.rb
172
174
  - lib/purview/tables/base.rb