notion_ruby_mapping 0.7.2 → 0.7.3

Sign up to get free protection for your applications and to get access to all the features.
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