notion_ruby_mapping 0.7.2 → 0.7.3

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: 78822f6707fe646abb09c9240dce59ac8adac8c27c300baae8282e16ecd54278
4
- data.tar.gz: 40aa622383799df9e197bf9eafd829d2e7699a9c66194a42812f750a2bb97b1e
3
+ metadata.gz: da835af42a7f97ad54db43b0cbc8bad2e0a7374004cc5a643f2b307641e1b081
4
+ data.tar.gz: d0b5d728ea30328290c676c51cb3bbbf19508c7f2c6413f032b347989cefae12
5
5
  SHA512:
6
- metadata.gz: ab8f1e29cb52504ea7c1b8877743e99d31cd1dd2b08e790a28038d966ea5319e48d733657eeae936b8c55a0af2ed87b010411568770ef57e023e0f4f3c49a9c6
7
- data.tar.gz: a625b8e93d57e4ba506f67526a8f5a95bb872a0a879eaa9154bd719b2fa0c5f2374cab20a7fda448dcdaa03bf4f2f4b800725061c9f3bc0bb76ecaf5a67b3e1b
6
+ metadata.gz: 85bc6f5b88a5a91fc951455c658c9e9e39cc806f3d772c170eafb323eedfc0fc326e601cf8d3ba79ec518f17ec3a42d9c3cec3c70639c1282eec9daed4da6415
7
+ data.tar.gz: 6af5b7f9a5da2c678826746808310e82ce53f5f60df9ea7808e9b12ac7b8b78d20b9bc81441e6a8596896921ec0d57f97c8add47d04c12c48a5b1374a41851de
data/README.md CHANGED
@@ -116,8 +116,9 @@ NotionRubyMapping.configuration { |c| c.notion_token = ENV["NOTION_API_TOKEN"] }
116
116
  1. [Set icon to all icon unsettled pages / 全てのページのアイコンを同一に設定](examples/set_icon_to_all_icon_unsettled_pages.md)
117
117
  2. [Renumbering pages / ページのナンバリング](examples/renumbering_pages.md)
118
118
  3. [Change title / タイトルの変更](examples/change_title.md)
119
- 4. [Create ER Diagram from Notion database / Notion データベースの ER 図を作成](https://www.notion.so/hkob/notionErDiagram-Sample-1720c2199c534ca08138cde38f31f710)
120
- 5. [Create Sitemap from Notion pages / Notion page からサイトマップを作成](https://www.notion.so/hkob/NotionSitemap-sample-14e195c83d024c5382aab09210916c87)
119
+ 4. [Create ER Diagram from Notion database / Notion データベースの ER 図を作成](https://hkob.notion.site/notionErDiagram-Sample-1720c2199c534ca08138cde38f31f710)
120
+ 5. [Create Sitemap from Notion pages / Notion page からサイトマップを作成](https://hkob.notion.site/notionSitemap-sample-14e195c83d024c5382aab09210916c87)
121
+ 6. [Create Notion databases from ER Diagram / ER 図から Notion データベースを作成](https://hkob.notion.site/erdToNotionDb-sample-87e5e52a6b9f46abbdeebcb3c902a516)
121
122
 
122
123
  ### 2.5 API reference / API リファレンス
123
124
 
@@ -125,6 +126,7 @@ NotionRubyMapping.configuration { |c| c.notion_token = ENV["NOTION_API_TOKEN"] }
125
126
 
126
127
  ## 3. ChangeLog
127
128
 
129
+ - 2023/1/26 [v0.7.3] release beta version of erdToNotionRb.rb script
128
130
  - 2023/1/25 [v0.7.2] bug fix for creating relation property / add erdToNotionRb.rb script
129
131
  - 2022/12/16 [v0.7.1] bug fix for query rollup property
130
132
  - 2022/11/28 [v0.7.0] add this_week filter and NotionRubyMapping.configure
data/exe/erdToNotionDb.rb CHANGED
@@ -35,7 +35,22 @@ exist_dbs.each do |db|
35
35
  end
36
36
 
37
37
  mermaid.create_notion_db target_page, inline
38
- mermaid.update_databases
39
- mermaid.rename_reverse_name
40
- mermaid.update_rollup
41
-
38
+ mermaid.update_title
39
+ pass = 1
40
+ pre_remain = nil
41
+ loop do
42
+ print "=== Pass #{pass} ===\n"
43
+ mermaid.update_databases
44
+ mermaid.rename_reverse_name
45
+ count = mermaid.count
46
+ remain = mermaid.remain
47
+ print "Pass #{pass} Remain #{remain} in #{count}\n"
48
+ if pre_remain == remain
49
+ print "Dependency loop detected.\n"
50
+ exit
51
+ end
52
+ pre_remain = remain
53
+ break if remain.zero?
54
+ pass += 1
55
+ end
56
+ print "Finish!!!"
@@ -155,7 +155,12 @@ module NotionRubyMapping
155
155
  if dry_run
156
156
  dry_run_script :patch, @nc.database_path(@id), :update_property_schema_json
157
157
  else
158
- update_json @nc.update_database_request(@id, update_property_schema_json)
158
+ payload = update_property_schema_json
159
+ begin
160
+ update_json @nc.update_database_request(@id, payload)
161
+ rescue StandardError => e
162
+ raise StandardError, "#{e.message} by #{payload}"
163
+ end
159
164
  end
160
165
  end
161
166
  end
@@ -16,7 +16,7 @@ module NotionRubyMapping
16
16
  until @lines.empty?
17
17
  case @lines.shift
18
18
  when / *(\w+) *[|}][|o]--[o|][|{] *(\w+) *: *"(.*)" */
19
- db_or_create(Regexp.last_match(1)).append_relation db_or_create(Regexp.last_match(2)), Regexp.last_match(3)
19
+ db_or_create(Regexp.last_match(1)).append_relation_queue db_or_create(Regexp.last_match(2)), Regexp.last_match(3)
20
20
  when / *(\w+) *{ */
21
21
  append_db_with_attributes Regexp.last_match(1)
22
22
  else
@@ -52,11 +52,17 @@ module NotionRubyMapping
52
52
  end
53
53
 
54
54
  def create_notion_db(target_page, inline)
55
- @databases.values.each do |mdb|
55
+ @databases.each_value do |mdb|
56
56
  mdb.create_notion_db(target_page, inline) unless mdb.real_db
57
57
  end
58
58
  end
59
59
 
60
+ def update_title
61
+ @databases.each_value do |mdb|
62
+ mdb.update_title
63
+ end
64
+ end
65
+
60
66
  def update_databases
61
67
  @databases.each_value(&:update_database)
62
68
  end
@@ -65,8 +71,12 @@ module NotionRubyMapping
65
71
  @databases.each_value(&:rename_reverse_name)
66
72
  end
67
73
 
68
- def update_rollup
69
- @databases.each_value(&:update_rollup)
74
+ def count
75
+ @databases.values.map(&:count).sum
76
+ end
77
+
78
+ def remain
79
+ @databases.values.map(&:remain).sum
70
80
  end
71
81
  end
72
- end
82
+ end
@@ -6,11 +6,14 @@ module NotionRubyMapping
6
6
  @name = key
7
7
  @title = nil
8
8
  @properties = {}
9
+ @finish_flag = {}
10
+ @working = []
9
11
  @relations = {}
12
+ @relation_queue = []
10
13
  @real_db = nil
11
14
  @reverse_name_queue = {}
12
15
  end
13
- attr_reader :properties, :relations, :real_db, :title
16
+ attr_reader :properties, :relation_queue, :relations, :real_db, :title, :finish_flag
14
17
  attr_accessor :name
15
18
 
16
19
  def add_property(key, value)
@@ -21,8 +24,8 @@ module NotionRubyMapping
21
24
  end
22
25
  end
23
26
 
24
- def append_relation(other, relation)
25
- @relations[relation] = other
27
+ def append_relation_queue(other, relation)
28
+ @relation_queue << [relation, other]
26
29
  end
27
30
 
28
31
  def attach_database(db)
@@ -40,12 +43,30 @@ module NotionRubyMapping
40
43
  end
41
44
  end
42
45
 
43
- def update_properties
46
+ def blocked?(name)
47
+ @finish_flag[name].nil?
48
+ end
49
+
50
+ def count
51
+ @properties.count + @relation_queue.count
52
+ end
53
+
54
+ def remain
55
+ count - @finish_flag.count
56
+ end
57
+
58
+ def update_title
44
59
  ps = @real_db.properties
45
60
  title_property = ps.select { |p| p.is_a? TitleProperty }.first
46
61
  title_property.new_name = @title unless title_property.name == @title
62
+ end
63
+
64
+ def update_properties
65
+ ps = @real_db.properties
47
66
  @properties.each do |(value, key)|
48
67
  name, *options = value.split("|")
68
+ next if @finish_flag[name]
69
+
49
70
  property = ps.values_at(name).first
50
71
  case key
51
72
  when /checkbox|created_by|created_time|date|email|files|last_edited_by|last_edited_time|people|phone_number|text|url|status/
@@ -56,13 +77,23 @@ module NotionRubyMapping
56
77
  rich_text: RichTextProperty, url: UrlProperty, status: StatusProperty
57
78
  }[key.to_sym]
58
79
  @real_db.add_property klass, name unless property
80
+ @working << name
59
81
  when "formula"
60
82
  f_e = options.first&.gsub "@", '"'
61
- if property
62
- property.formula_expression = f_e unless property.formula_expression == f_e
83
+ dependencies = f_e&.scan(/prop\("([^"]+)"\)/) || []
84
+ blocked_key = dependencies.select { |k| blocked? k.first }
85
+ if blocked_key.empty?
86
+ if property
87
+ property.formula_expression = f_e unless property.formula_expression == f_e
88
+ else
89
+ @real_db.add_property(FormulaProperty, name) { |dp| dp.formula_expression = f_e }
90
+ end
91
+ @working << name
63
92
  else
64
- @real_db.add_property(FormulaProperty, name) { |dp| dp.formula_expression = f_e }
93
+ print("#{name} blocked by #{blocked_key.flatten}\n")
94
+ next
65
95
  end
96
+
66
97
  when "multi_select"
67
98
  if property
68
99
  (options - (property.multi_select_options.map { |h| h["name"] })).each do |select_name|
@@ -75,6 +106,7 @@ module NotionRubyMapping
75
106
  end
76
107
  end
77
108
  end
109
+ @working << name
78
110
  when "number"
79
111
  format_value = options.empty? ? "number" : options.first
80
112
  if property
@@ -82,6 +114,35 @@ module NotionRubyMapping
82
114
  else
83
115
  @real_db.add_property(NumberProperty, name) { |p| p.format = format_value }
84
116
  end
117
+ @working << name
118
+ when "rollup"
119
+ name, *options = value.split("|")
120
+ relation_name, rollup_name, function = options
121
+ if blocked? relation_name
122
+ print("#{name} blocked by #{relation_name}\n")
123
+ next
124
+ else
125
+ relation_db = @relations[relation_name]
126
+ if relation_db.nil? || relation_db.blocked?(rollup_name)
127
+ print "#{name} blocked by #{relation_name}-#{rollup_name}\n"
128
+ next
129
+ else
130
+ property = ps.values_at(name).first
131
+
132
+ if property
133
+ property.function = function unless property.function == function
134
+ property.relation_property_name = relation_name unless property.relation_property_name == relation_name
135
+ property.rollup_property_name = rollup_name unless property.rollup_property_name == rollup_name
136
+ else
137
+ @real_db.add_property(RollupProperty, name) do |dp|
138
+ dp.function = function
139
+ dp.relation_property_name = relation_name
140
+ dp.rollup_property_name = rollup_name
141
+ end
142
+ end
143
+ @working << name
144
+ end
145
+ end
85
146
  when "select"
86
147
  if property
87
148
  (options - (property.select_options.map { |h| h["name"] })).each do |select_name|
@@ -94,34 +155,51 @@ module NotionRubyMapping
94
155
  end
95
156
  end
96
157
  end
158
+ @working << name
97
159
  else
98
160
  nil
99
161
  end
100
162
  end
101
- @relations.each do |value, relation_db|
163
+ while (array = @relation_queue.shift) do
164
+ value, relation_db = array
102
165
  db_id = relation_db.real_db.id
103
166
  forward, reverse = value.split "|"
104
167
  property = ps.values_at(forward).first
105
168
  if property
106
169
  if reverse
107
- next if property.database_id == db_id && property.synced_property_name == reverse
108
-
109
- property.replace_relation_database database_id: db_id
110
- relation_db.append_reverse_name_queue self, forward, reverse
170
+ if property.database_id == db_id && property.synced_property_name == reverse
171
+ relation_db.add_property "relation", reverse
172
+ relation_db.finish_flag[reverse] = true
173
+ else
174
+ unless @finish_flag[forward]
175
+ property.replace_relation_database database_id: db_id
176
+ relation_db.append_reverse_name_queue self, forward, reverse
177
+ end
178
+ @working << forward
179
+ add_property "relation", forward
180
+ end
181
+ relation_db.relations[reverse] = self
111
182
  else
112
- next if property.database_id == db_id
113
-
114
- property.replace_relation_database database_id: db_id, type: "single_property"
183
+ unless property.database_id == db_id
184
+ property.replace_relation_database database_id: db_id, type: "single_property"
185
+ @working << forward
186
+ add_property "relation", forward
187
+ end
115
188
  end
189
+ @relations[forward] = relation_db
116
190
  else
117
191
  @real_db.add_property(RelationProperty, forward) do |p|
118
192
  if reverse
119
193
  p.replace_relation_database database_id: relation_db.real_db.id
120
194
  relation_db.append_reverse_name_queue self, forward, reverse
195
+ relation_db.relations[reverse] = self
121
196
  else
122
197
  p.replace_relation_database database_id: relation_db.real_db.id, type: "single_property"
123
198
  end
124
199
  end
200
+ @relations[forward] = relation_db
201
+ @working << forward
202
+ add_property "relation", forward
125
203
  end
126
204
  end
127
205
  @real_db.property_schema_json
@@ -129,54 +207,39 @@ module NotionRubyMapping
129
207
 
130
208
  def append_reverse_name_queue(other_db, forward, reverse)
131
209
  @reverse_name_queue[reverse] = [other_db, forward]
210
+ add_property "relation", reverse
132
211
  end
133
212
 
134
213
  def update_database
135
214
  update_properties
136
215
  @real_db.save
216
+ while (name = @working.shift)
217
+ @finish_flag[name] = true
218
+ end
137
219
  end
138
220
 
139
221
  def rename_reverse_name
140
222
  save = false
223
+ reverses = []
224
+ clears = []
141
225
  @reverse_name_queue.each do |reverse, (other_db, forward)|
142
226
  frp = other_db.real_db.properties[forward]
143
227
  rp_id = frp.synced_property_id
144
228
  rrp = @real_db.properties.filter { |pp| pp.property_id == rp_id }.first
145
229
  if rrp && rrp.name != reverse
146
230
  rrp.new_name = reverse
231
+ reverses << other_db.real_db
232
+ clears << rrp
147
233
  save = true
148
234
  end
235
+ @finish_flag[reverse] = true
149
236
  end
150
- @real_db.save if save
151
- end
152
-
153
- def update_rollup_schema
154
- ps = @real_db.properties
155
- @properties.each do |(value, key)|
156
- next unless key == "rollup"
157
-
158
- name, *options = value.split("|")
159
- property = ps.values_at(name).first
160
-
161
- relation_name, rollup_name, function = options
162
- if property
163
- property.function = function unless property.function == function
164
- property.relation_property_name = relation_name unless property.relation_property_name == relation_name
165
- property.rollup_property_name = rollup_name unless property.rollup_property_name == rollup_name
166
- else
167
- @real_db.add_property(RollupProperty, name) do |dp|
168
- dp.function = function
169
- dp.relation_property_name = relation_name
170
- dp.rollup_property_name = rollup_name
171
- end
172
- end
237
+ if save
238
+ @real_db.save
239
+ clears.map(&:clear_will_update)
240
+ reverses.map(&:reload)
173
241
  end
174
- @real_db.property_schema_json
175
- end
176
-
177
- def update_rollup
178
- update_rollup_schema
179
- @real_db.save
242
+ @reverse_name_queue = {}
180
243
  end
181
244
  end
182
245
  end
@@ -126,6 +126,8 @@ module NotionRubyMapping
126
126
 
127
127
  # @return [FalseClass]
128
128
  def clear_will_update
129
+ @new_name = nil
130
+ @remove = nil
129
131
  @will_update = false
130
132
  end
131
133
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module NotionRubyMapping
4
- VERSION = "0.7.2"
4
+ VERSION = "0.7.3"
5
5
  NOTION_VERSION = "2022-06-28"
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: notion_ruby_mapping
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
4
+ version: 0.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hiroyuki KOBAYASHI
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-01-25 00:00:00.000000000 Z
11
+ date: 2023-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday