notion_ruby_mapping 0.7.2 → 0.7.4

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: fc53f7256d1ce820695e6f2dc28149ef945dd0ddf765fd933b90882212335d0c
4
+ data.tar.gz: 625c42250124c4e66d8016812c8a8bd53d02cef88c0061320fdd2ea8c996cd28
5
5
  SHA512:
6
- metadata.gz: ab8f1e29cb52504ea7c1b8877743e99d31cd1dd2b08e790a28038d966ea5319e48d733657eeae936b8c55a0af2ed87b010411568770ef57e023e0f4f3c49a9c6
7
- data.tar.gz: a625b8e93d57e4ba506f67526a8f5a95bb872a0a879eaa9154bd719b2fa0c5f2374cab20a7fda448dcdaa03bf4f2f4b800725061c9f3bc0bb76ecaf5a67b3e1b
6
+ metadata.gz: 573470cad7c6c10bb683417cb0ae62ed33819cb3471db31f3eb9b10d5718204c801fd7e42a063a69c1753dd7739f80777fa265fee073d5bd1abd1f17b29320ff
7
+ data.tar.gz: 2b76551f53c23564645aff1c027fe8521d13f0451e6cb43bbd7f66551e784a35bbcc0b1aa0ca4d12df5f35aa5d277570ae12415963a8c51de098574d67c66804
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,8 @@ NotionRubyMapping.configuration { |c| c.notion_token = ENV["NOTION_API_TOKEN"] }
125
126
 
126
127
  ## 3. ChangeLog
127
128
 
129
+ - 2023/2/9 [v0.7.4] bug fix for rollup property of erdToNotionRb.rb script
130
+ - 2023/1/26 [v0.7.3] release beta version of erdToNotionRb.rb script
128
131
  - 2023/1/25 [v0.7.2] bug fix for creating relation property / add erdToNotionRb.rb script
129
132
  - 2022/12/16 [v0.7.1] bug fix for query rollup property
130
133
  - 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,31 @@ 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 + 1
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
+ @finish_flag[@title] = true
63
+ end
64
+
65
+ def update_properties
66
+ ps = @real_db.properties
47
67
  @properties.each do |(value, key)|
48
68
  name, *options = value.split("|")
69
+ next if @finish_flag[name]
70
+
49
71
  property = ps.values_at(name).first
50
72
  case key
51
73
  when /checkbox|created_by|created_time|date|email|files|last_edited_by|last_edited_time|people|phone_number|text|url|status/
@@ -56,13 +78,23 @@ module NotionRubyMapping
56
78
  rich_text: RichTextProperty, url: UrlProperty, status: StatusProperty
57
79
  }[key.to_sym]
58
80
  @real_db.add_property klass, name unless property
81
+ @working << name
59
82
  when "formula"
60
83
  f_e = options.first&.gsub "@", '"'
61
- if property
62
- property.formula_expression = f_e unless property.formula_expression == f_e
84
+ dependencies = f_e&.scan(/prop\("([^"]+)"\)/) || []
85
+ blocked_key = dependencies.select { |k| blocked? k.first }
86
+ if blocked_key.empty?
87
+ if property
88
+ property.formula_expression = f_e unless property.formula_expression == f_e
89
+ else
90
+ @real_db.add_property(FormulaProperty, name) { |dp| dp.formula_expression = f_e }
91
+ end
92
+ @working << name
63
93
  else
64
- @real_db.add_property(FormulaProperty, name) { |dp| dp.formula_expression = f_e }
94
+ print("#{name} blocked by #{blocked_key.flatten}\n")
95
+ next
65
96
  end
97
+
66
98
  when "multi_select"
67
99
  if property
68
100
  (options - (property.multi_select_options.map { |h| h["name"] })).each do |select_name|
@@ -75,6 +107,7 @@ module NotionRubyMapping
75
107
  end
76
108
  end
77
109
  end
110
+ @working << name
78
111
  when "number"
79
112
  format_value = options.empty? ? "number" : options.first
80
113
  if property
@@ -82,6 +115,35 @@ module NotionRubyMapping
82
115
  else
83
116
  @real_db.add_property(NumberProperty, name) { |p| p.format = format_value }
84
117
  end
118
+ @working << name
119
+ when "rollup"
120
+ name, *options = value.split("|")
121
+ relation_name, rollup_name, function = options
122
+ if blocked? relation_name
123
+ print("#{name} blocked by #{relation_name}\n")
124
+ next
125
+ else
126
+ relation_db = @relations[relation_name]
127
+ if relation_db.nil? || relation_db.blocked?(rollup_name)
128
+ print "#{name} blocked by #{relation_name}-#{rollup_name}\n"
129
+ next
130
+ else
131
+ property = ps.values_at(name).first
132
+
133
+ if property
134
+ property.function = function unless property.function == function
135
+ property.relation_property_name = relation_name unless property.relation_property_name == relation_name
136
+ property.rollup_property_name = rollup_name unless property.rollup_property_name == rollup_name
137
+ else
138
+ @real_db.add_property(RollupProperty, name) do |dp|
139
+ dp.function = function
140
+ dp.relation_property_name = relation_name
141
+ dp.rollup_property_name = rollup_name
142
+ end
143
+ end
144
+ @working << name
145
+ end
146
+ end
85
147
  when "select"
86
148
  if property
87
149
  (options - (property.select_options.map { |h| h["name"] })).each do |select_name|
@@ -94,34 +156,51 @@ module NotionRubyMapping
94
156
  end
95
157
  end
96
158
  end
159
+ @working << name
97
160
  else
98
161
  nil
99
162
  end
100
163
  end
101
- @relations.each do |value, relation_db|
164
+ while (array = @relation_queue.shift) do
165
+ value, relation_db = array
102
166
  db_id = relation_db.real_db.id
103
167
  forward, reverse = value.split "|"
104
168
  property = ps.values_at(forward).first
105
169
  if property
106
170
  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
171
+ if property.database_id == db_id && property.synced_property_name == reverse
172
+ relation_db.add_property "relation", reverse
173
+ relation_db.finish_flag[reverse] = true
174
+ else
175
+ unless @finish_flag[forward]
176
+ property.replace_relation_database database_id: db_id
177
+ relation_db.append_reverse_name_queue self, forward, reverse
178
+ end
179
+ @working << forward
180
+ add_property "relation", forward
181
+ end
182
+ relation_db.relations[reverse] = self
111
183
  else
112
- next if property.database_id == db_id
113
-
114
- property.replace_relation_database database_id: db_id, type: "single_property"
184
+ unless property.database_id == db_id
185
+ property.replace_relation_database database_id: db_id, type: "single_property"
186
+ @working << forward
187
+ add_property "relation", forward
188
+ end
115
189
  end
190
+ @relations[forward] = relation_db
116
191
  else
117
192
  @real_db.add_property(RelationProperty, forward) do |p|
118
193
  if reverse
119
194
  p.replace_relation_database database_id: relation_db.real_db.id
120
195
  relation_db.append_reverse_name_queue self, forward, reverse
196
+ relation_db.relations[reverse] = self
121
197
  else
122
198
  p.replace_relation_database database_id: relation_db.real_db.id, type: "single_property"
123
199
  end
124
200
  end
201
+ @relations[forward] = relation_db
202
+ @working << forward
203
+ add_property "relation", forward
125
204
  end
126
205
  end
127
206
  @real_db.property_schema_json
@@ -129,54 +208,39 @@ module NotionRubyMapping
129
208
 
130
209
  def append_reverse_name_queue(other_db, forward, reverse)
131
210
  @reverse_name_queue[reverse] = [other_db, forward]
211
+ add_property "relation", reverse
132
212
  end
133
213
 
134
214
  def update_database
135
215
  update_properties
136
216
  @real_db.save
217
+ while (name = @working.shift)
218
+ @finish_flag[name] = true
219
+ end
137
220
  end
138
221
 
139
222
  def rename_reverse_name
140
223
  save = false
224
+ reverses = []
225
+ clears = []
141
226
  @reverse_name_queue.each do |reverse, (other_db, forward)|
142
227
  frp = other_db.real_db.properties[forward]
143
228
  rp_id = frp.synced_property_id
144
229
  rrp = @real_db.properties.filter { |pp| pp.property_id == rp_id }.first
145
230
  if rrp && rrp.name != reverse
146
231
  rrp.new_name = reverse
232
+ reverses << other_db.real_db
233
+ clears << rrp
147
234
  save = true
148
235
  end
236
+ @finish_flag[reverse] = true
149
237
  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
238
+ if save
239
+ @real_db.save
240
+ clears.map(&:clear_will_update)
241
+ reverses.map(&:reload)
173
242
  end
174
- @real_db.property_schema_json
175
- end
176
-
177
- def update_rollup
178
- update_rollup_schema
179
- @real_db.save
243
+ @reverse_name_queue = {}
180
244
  end
181
245
  end
182
246
  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.4"
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.4
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-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -276,7 +276,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
276
276
  - !ruby/object:Gem::Version
277
277
  version: '0'
278
278
  requirements: []
279
- rubygems_version: 3.4.5
279
+ rubygems_version: 3.4.6
280
280
  signing_key:
281
281
  specification_version: 4
282
282
  summary: Notion Ruby mapping tool