notion_ruby_mapping 0.7.2 → 0.7.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: 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