superset 0.3.2 → 0.3.4

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
  SHA256:
3
- metadata.gz: eccf34d9aa2007200762969b6483106b398d889027e7913b393c5a1386678106
4
- data.tar.gz: 18a65c328bb022afaf81e1482af324ee8ce90f9dfadf9af710723cfbd727e11d
3
+ metadata.gz: 565da0973df5cfd3aa9f1c555f477a9a9d710870c143ea2ca1678ff85febf3e6
4
+ data.tar.gz: 75620c8a9459443001e1b0ea62ccc5375f77d7bf5eb7b6bc6705bb840ed73b36
5
5
  SHA512:
6
- metadata.gz: 4728bc69910b3d6e911bd863bf7a9bee973287e367bc2d95b328a0ae2bf01499a4e1647dc0ea97303d0009a4d055c8dbf847bf24f2afc224056b4d42d4b7825c
7
- data.tar.gz: 66d21dfaef3abee7cf51eb02780f17205e2cd4f9173148033f500b26363cb236633c6fc884e7d830d38a4655c1fcff4b3e598886c4a1e500ef07368434ef4575
6
+ metadata.gz: 754a540a0a88322c7b63efce92ab04d44d3aaaebdd865f12ff7397414804e39a9e3a2586a6cfad0e26e0681fd556d22bc23b515ad69f7bc8ecdfd0a2f8aeb7b0
7
+ data.tar.gz: 4c1f810364a9389712183eabb06c81d473a634d8e6f6306d3b7b4b312818ad872df252f071f6b29df73cf622ebc3d0db37f009a0600a83358c464832a3f607c9
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  ## Change Log
2
2
 
3
+ ## 0.3.3 - 2025-12-11
4
+ * Add databases method to Superset::Dashboard::Datasets::List
5
+ * New class to get Superset::Database::Connection details
6
+
3
7
  ## 0.3.2 - 2025-11-28
4
8
  * Add require happi
5
9
 
@@ -2,12 +2,13 @@ module Superset
2
2
  module Chart
3
3
  class List < Superset::Request
4
4
 
5
- attr_reader :title_contains, :dashboard_id_eq, :dataset_id_eq
5
+ attr_reader :title_contains, :dashboard_id_eq, :dataset_id_eq, :owner_id_eq
6
6
 
7
- def initialize(title_contains: '', dashboard_id_eq: '', dataset_id_eq: '', **kwargs)
7
+ def initialize(title_contains: '', dashboard_id_eq: '', dataset_id_eq: '', owner_id_eq: '', **kwargs)
8
8
  @title_contains = title_contains
9
9
  @dashboard_id_eq = dashboard_id_eq
10
10
  @dataset_id_eq = dataset_id_eq
11
+ @owner_id_eq = owner_id_eq
11
12
  super(**kwargs)
12
13
  end
13
14
 
@@ -41,6 +42,7 @@ module Superset
41
42
  filter_set << "(col:slice_name,opr:ct,value:'#{title_contains}')" if title_contains.present?
42
43
  filter_set << "(col:dashboards,opr:rel_m_m,value:#{dashboard_id_eq})" if dashboard_id_eq.present? # rel many to many
43
44
  filter_set << "(col:datasource_id,opr:eq,value:#{dataset_id_eq})" if dataset_id_eq.present?
45
+ filter_set << "(col:owners,opr:rel_m_m,value:#{owner_id_eq})" if owner_id_eq.present?
44
46
 
45
47
  unless filter_set.empty?
46
48
  "filters:!(" + filter_set.join(',') + "),"
@@ -21,8 +21,8 @@ module Superset
21
21
 
22
22
  dashboard_ids.sort.each do |dashboard_id|
23
23
  logger.info("Dashboard Id: #{dashboard_id.to_s} Attempting CASCADE delete of dashboard, charts, datasets")
24
- delete_datasets(dashboard_id)
25
24
  delete_charts(dashboard_id)
25
+ delete_datasets(dashboard_id)
26
26
  delete_dashboard(dashboard_id)
27
27
  end
28
28
  true
@@ -36,7 +36,7 @@ module Superset
36
36
  end
37
37
 
38
38
  def add_user_to_datasets_ownership
39
- dataset_ids = Superset::Dashboard::Datasets::List.new(dashboard_id: dashboard_id).ids
39
+ dataset_ids = Superset::Dashboard::Datasets::List.new(dashboard_id: dashboard_id, include_filter_datasets: true).ids
40
40
  dataset_ids.each do |dataset_id|
41
41
  current_dataset_owner_ids = Superset::Dataset::Get.new(dataset_id).result['owners'].map{|c| c['id']}
42
42
  next if current_dataset_owner_ids.include?(user_id)
@@ -51,4 +51,4 @@ module Superset
51
51
  end
52
52
  end
53
53
  end
54
- end
54
+ end
@@ -7,15 +7,12 @@ module Superset
7
7
  module Dashboard
8
8
  module Datasets
9
9
  class List < Superset::Request
10
- attr_reader :id, :include_filter_datasets # id - dashboard id
10
+ attr_reader :dashboard_id, :include_filter_datasets, :include_catalog_lookup # id - dashboard id
11
11
 
12
- def self.call(id)
13
- self.new(id).list
14
- end
15
-
16
- def initialize(dashboard_id:, include_filter_datasets: false)
17
- @id = dashboard_id
12
+ def initialize(dashboard_id:, include_filter_datasets: false, include_catalog_lookup: false)
13
+ @dashboard_id = dashboard_id
18
14
  @include_filter_datasets = include_filter_datasets
15
+ @include_catalog_lookup = include_catalog_lookup
19
16
  end
20
17
 
21
18
  def perform
@@ -23,29 +20,24 @@ module Superset
23
20
  self
24
21
  end
25
22
 
26
- def schemas
27
- @schemas ||= begin
28
- all_dashboard_schemas = datasets_details.map {|d| d[:schema] }.uniq
29
-
30
- # For the current superset setup we will assume a dashboard datasets will point to EXACTLY one schema, their own.
31
- # if not .. we need to know about it. Potentially we could override this check if others do not consider it a problem.
32
- if all_dashboard_schemas.count > 1
33
- Rollbar.error("SUPERSET DASHBOARD ERROR: Dashboard id #{id} has multiple dataset schema linked: #{all_dashboard_schemas.to_s}") if defined?(Rollbar)
34
- end
35
- all_dashboard_schemas
23
+ def datasets_details
24
+ @datasets_details ||= begin
25
+ datasets_list = chart_datasets + additional_filter_datasets
26
+ datasets_list = include_catalog_details(datasets_list) if include_catalog_lookup
27
+ datasets_list.compact
36
28
  end
37
29
  end
38
30
 
39
- def datasets_details
40
- chart_datasets = result.map do |details|
41
- details.slice('id', 'datasource_name', 'schema', 'sql').merge('database' => details['database'].slice('id', 'name', 'backend')).with_indifferent_access
42
- end
43
- return chart_datasets unless include_filter_datasets
44
- chart_dataset_ids = chart_datasets.map{|d| d['id'] }
45
- filter_dataset_ids_not_used_in_charts = filter_dataset_ids - chart_dataset_ids
46
- return chart_datasets if filter_dataset_ids_not_used_in_charts.empty?
47
- # returning chart and filter datasets
48
- chart_datasets + filter_datasets(filter_dataset_ids_not_used_in_charts)
31
+ def databases
32
+ @databases ||= datasets_details.map {|d| d[:database] }.uniq
33
+ end
34
+
35
+ def catalogs
36
+ datasets_details.map {|d| d[:catalog] }.compact.uniq
37
+ end
38
+
39
+ def schemas
40
+ datasets_details.map {|d| d[:schema] }.compact.uniq
49
41
  end
50
42
 
51
43
  def rows
@@ -64,24 +56,47 @@ module Superset
64
56
 
65
57
  private
66
58
 
59
+ def include_catalog_details(datasets_list)
60
+ datasets_list.each {|d| d[:catalog] = Superset::Dataset::Get.new(d[:id].to_i).result['catalog'] }
61
+ end
62
+
63
+ # list of chart dataset details used in the dashboard
64
+ def chart_datasets
65
+ result.map do |details|
66
+ details.slice('id', 'datasource_name', 'schema', 'sql').merge('database' => details['database'].slice('id', 'name', 'backend')).with_indifferent_access
67
+ end
68
+ end
69
+
70
+ # list of any additional filter dataset details on the dashboard that are not used in charts
71
+ def additional_filter_datasets
72
+ return [] unless include_filter_datasets
73
+
74
+ chart_dataset_ids = chart_datasets.map{|d| d['id'] }
75
+ filter_dataset_ids_not_used_in_charts = filter_dataset_ids - chart_dataset_ids
76
+ retrieve_filter_datasets(filter_dataset_ids_not_used_in_charts) unless filter_dataset_ids_not_used_in_charts.empty?
77
+ end
78
+
67
79
  def filter_dataset_ids
68
80
  @filter_dataset_ids ||= dashboard.filter_configuration.map { |c| c['targets'] }.flatten.compact.map { |c| c['datasetId'] }.flatten.compact.uniq
69
81
  end
70
82
 
71
- def filter_datasets(filter_dataset_ids_not_used_in_charts)
83
+ def retrieve_filter_datasets(filter_dataset_ids_not_used_in_charts)
72
84
  filter_dataset_ids_not_used_in_charts.map do |filter_dataset_id|
73
85
  filter_dataset = Superset::Dataset::Get.new(filter_dataset_id).result
74
- database_info = {
75
- 'id' => filter_dataset['database']['id'],
76
- 'name' => filter_dataset['database']['database_name'],
77
- 'backend' => filter_dataset['database']['backend']
78
- }
79
- filter_dataset.slice('id', 'datasource_name', 'schema', 'sql').merge('database' => database_info, 'filter_only': true).with_indifferent_access
86
+ { id: filter_dataset_id,
87
+ datasource_name: filter_dataset['datasource_name'],
88
+ schema: filter_dataset['schema'],
89
+ sql: filter_dataset['sql'],
90
+ database: {
91
+ 'id' => filter_dataset['database']['id'],
92
+ 'name' => filter_dataset['database']['database_name'],
93
+ 'backend' => filter_dataset['database']['backend'] },
94
+ filter_only: true }.with_indifferent_access
80
95
  end
81
96
  end
82
97
 
83
98
  def route
84
- "dashboard/#{id}/datasets"
99
+ "dashboard/#{dashboard_id}/datasets"
85
100
  end
86
101
 
87
102
  def list_attributes
@@ -90,11 +105,11 @@ module Superset
90
105
 
91
106
  # when displaying a list of datasets, show dashboard title as well
92
107
  def title
93
- @title ||= [id, dashboard.title].join(' ')
108
+ @title ||= [dashboard_id, dashboard.title].join(' ')
94
109
  end
95
110
 
96
111
  def dashboard
97
- @dashboard ||= Superset::Dashboard::Get.new(id)
112
+ @dashboard ||= Superset::Dashboard::Get.new(dashboard_id)
98
113
  end
99
114
  end
100
115
  end
@@ -7,14 +7,15 @@ module Superset
7
7
  class List < Superset::Request
8
8
  attr_reader :title_contains, :title_equals,
9
9
  :tags_contain, :tags_equal,
10
- :ids_not_in, :include_filter_dataset_schemas
10
+ :ids_not_in, :owner_id_eq, :include_filter_dataset_schemas
11
11
 
12
- def initialize(title_contains: '', title_equals: '', tags_contain: [], tags_equal: [], ids_not_in: [], include_filter_dataset_schemas: false, **kwargs)
12
+ def initialize(title_contains: '', title_equals: '', tags_contain: [], tags_equal: [], ids_not_in: [], owner_id_eq: '', include_filter_dataset_schemas: false, **kwargs)
13
13
  @title_contains = title_contains
14
14
  @title_equals = title_equals
15
15
  @tags_contain = tags_contain
16
16
  @tags_equal = tags_equal
17
17
  @ids_not_in = ids_not_in
18
+ @owner_id_eq = owner_id_eq
18
19
  @include_filter_dataset_schemas = include_filter_dataset_schemas
19
20
  super(**kwargs)
20
21
  end
@@ -86,6 +87,7 @@ module Superset
86
87
  filter_set << tags_contain_filters if tags_contain.present?
87
88
  filter_set << tags_equal_filters if tags_equal.present?
88
89
  filter_set << ids_not_in_filters if ids_not_in.present?
90
+ filter_set << "(col:owners,opr:rel_m_m,value:#{owner_id_eq})" if owner_id_eq.present?
89
91
 
90
92
  unless filter_set.empty?
91
93
  "filters:!(" + filter_set.join(',') + "),"
@@ -0,0 +1,26 @@
1
+ module Superset
2
+ module Database
3
+ class Connection < Superset::Request
4
+
5
+ attr_reader :id
6
+
7
+ def initialize(id)
8
+ @id = id
9
+ end
10
+
11
+ def self.call(id)
12
+ self.new(id).result
13
+ end
14
+
15
+ def connection_db_name
16
+ result['parameters']['database']
17
+ end
18
+
19
+ private
20
+
21
+ def route
22
+ "database/#{id}/connection"
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,13 +1,14 @@
1
1
  module Superset
2
2
  module Dataset
3
3
  class List < Superset::Request
4
- attr_reader :title_contains, :title_equals, :schema_equals, :database_id_eq
4
+ attr_reader :title_contains, :title_equals, :schema_equals, :database_id_eq, :owner_id_eq
5
5
 
6
- def initialize(title_contains: '', title_equals: '', schema_equals: '', database_id_eq: '', **kwargs)
6
+ def initialize(title_contains: '', title_equals: '', schema_equals: '', database_id_eq: '', owner_id_eq: '', **kwargs)
7
7
  @title_contains = title_contains
8
8
  @title_equals = title_equals
9
9
  @schema_equals = schema_equals
10
10
  @database_id_eq = database_id_eq
11
+ @owner_id_eq = owner_id_eq
11
12
  super(**kwargs)
12
13
  end
13
14
 
@@ -28,6 +29,8 @@ module Superset
28
29
  filters << "(col:table_name,opr:eq,value:'#{title_equals}')" if title_equals.present?
29
30
  filters << "(col:schema,opr:eq,value:'#{schema_equals}')" if schema_equals.present?
30
31
  filters << "(col:database,opr:rel_o_m,value:#{database_id_eq})" if database_id_eq.present? # rel one to many
32
+ filters << "(col:owners,opr:rel_m_m,value:#{owner_id_eq})" if owner_id_eq.present?
33
+
31
34
  unless filters.empty?
32
35
  "filters:!(" + filters.join(',') + "),"
33
36
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Superset
4
- VERSION = "0.3.2"
4
+ VERSION = "0.3.4"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: superset
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - jbat
@@ -246,6 +246,7 @@ files:
246
246
  - lib/superset/dashboard/list.rb
247
247
  - lib/superset/dashboard/put.rb
248
248
  - lib/superset/dashboard/warm_up_cache.rb
249
+ - lib/superset/database/connection.rb
249
250
  - lib/superset/database/export.rb
250
251
  - lib/superset/database/get.rb
251
252
  - lib/superset/database/get_catalogs.rb