notion_ruby_mapping 0.3.3 → 0.5.0

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.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +44 -1237
  3. data/env.yml.sample +0 -13
  4. data/examples/change_title.md +1 -1
  5. data/examples/renumbering_pages.md +3 -3
  6. data/examples/set_icon_to_all_icon_unsettled_pages.md +4 -4
  7. data/lib/notion_ruby_mapping/{base.rb → blocks/base.rb} +163 -92
  8. data/lib/notion_ruby_mapping/blocks/block.rb +145 -0
  9. data/lib/notion_ruby_mapping/blocks/bookmark_block.rb +11 -0
  10. data/lib/notion_ruby_mapping/blocks/breadcrumb_block.rb +19 -0
  11. data/lib/notion_ruby_mapping/blocks/bulleted_list_item_block.rb +11 -0
  12. data/lib/notion_ruby_mapping/blocks/callout_block.rb +82 -0
  13. data/lib/notion_ruby_mapping/blocks/child_base_block.rb +21 -0
  14. data/lib/notion_ruby_mapping/blocks/child_database_block.rb +11 -0
  15. data/lib/notion_ruby_mapping/blocks/child_page_block.rb +11 -0
  16. data/lib/notion_ruby_mapping/blocks/code_block.rb +50 -0
  17. data/lib/notion_ruby_mapping/blocks/column_block.rb +29 -0
  18. data/lib/notion_ruby_mapping/blocks/column_list_block.rb +33 -0
  19. data/lib/notion_ruby_mapping/{database.rb → blocks/database.rb} +41 -8
  20. data/lib/notion_ruby_mapping/blocks/divider_block.rb +19 -0
  21. data/lib/notion_ruby_mapping/blocks/embed_block.rb +11 -0
  22. data/lib/notion_ruby_mapping/blocks/equation_block.rb +43 -0
  23. data/lib/notion_ruby_mapping/blocks/file_base_block.rb +50 -0
  24. data/lib/notion_ruby_mapping/blocks/file_block.rb +11 -0
  25. data/lib/notion_ruby_mapping/blocks/heading1_block.rb +18 -0
  26. data/lib/notion_ruby_mapping/blocks/heading2_block.rb +18 -0
  27. data/lib/notion_ruby_mapping/blocks/heading3_block.rb +18 -0
  28. data/lib/notion_ruby_mapping/blocks/image_block.rb +11 -0
  29. data/lib/notion_ruby_mapping/blocks/link_preview_block.rb +16 -0
  30. data/lib/notion_ruby_mapping/blocks/link_to_page_block.rb +40 -0
  31. data/lib/notion_ruby_mapping/{list.rb → blocks/list.rb} +37 -6
  32. data/lib/notion_ruby_mapping/blocks/numbered_list_item_block.rb +11 -0
  33. data/lib/notion_ruby_mapping/blocks/page.rb +77 -0
  34. data/lib/notion_ruby_mapping/blocks/paragraph_block.rb +11 -0
  35. data/lib/notion_ruby_mapping/{block.rb → blocks/pdf_block.rb} +4 -3
  36. data/lib/notion_ruby_mapping/blocks/quote_block.rb +11 -0
  37. data/lib/notion_ruby_mapping/blocks/synced_block.rb +44 -0
  38. data/lib/notion_ruby_mapping/blocks/table_block.rb +50 -0
  39. data/lib/notion_ruby_mapping/blocks/table_of_contents_block.rb +34 -0
  40. data/lib/notion_ruby_mapping/blocks/table_row_block.rb +34 -0
  41. data/lib/notion_ruby_mapping/blocks/template_block.rb +34 -0
  42. data/lib/notion_ruby_mapping/blocks/text_sub_block_color_base_block.rb +45 -0
  43. data/lib/notion_ruby_mapping/blocks/to_do_block.rb +42 -0
  44. data/lib/notion_ruby_mapping/blocks/toggle_block.rb +11 -0
  45. data/lib/notion_ruby_mapping/blocks/toggle_heading1_block.rb +11 -0
  46. data/lib/notion_ruby_mapping/blocks/toggle_heading2_block.rb +11 -0
  47. data/lib/notion_ruby_mapping/blocks/toggle_heading3_block.rb +11 -0
  48. data/lib/notion_ruby_mapping/blocks/url_base_block.rb +34 -0
  49. data/lib/notion_ruby_mapping/blocks/url_caption_base_block.rb +46 -0
  50. data/lib/notion_ruby_mapping/blocks/video_block.rb +11 -0
  51. data/lib/notion_ruby_mapping/{notion_cache.rb → controllers/notion_cache.rb} +144 -102
  52. data/lib/notion_ruby_mapping/{payload.rb → controllers/payload.rb} +32 -18
  53. data/lib/notion_ruby_mapping/{property_cache.rb → controllers/property_cache.rb} +21 -20
  54. data/lib/notion_ruby_mapping/{query.rb → controllers/query.rb} +27 -19
  55. data/lib/notion_ruby_mapping/{rich_text_array.rb → controllers/rich_text_array.rb} +39 -17
  56. data/lib/notion_ruby_mapping/objects/emoji_object.rb +40 -0
  57. data/lib/notion_ruby_mapping/objects/equation_object.rb +43 -0
  58. data/lib/notion_ruby_mapping/objects/file_object.rb +60 -0
  59. data/lib/notion_ruby_mapping/{mention_object.rb → objects/mention_object.rb} +11 -0
  60. data/lib/notion_ruby_mapping/{rich_text_object.rb → objects/rich_text_object.rb} +12 -4
  61. data/lib/notion_ruby_mapping/{text_object.rb → objects/text_object.rb} +0 -1
  62. data/lib/notion_ruby_mapping/{user_object.rb → objects/user_object.rb} +9 -4
  63. data/lib/notion_ruby_mapping/{checkbox_property.rb → properties/checkbox_property.rb} +3 -0
  64. data/lib/notion_ruby_mapping/{created_by_property.rb → properties/created_by_property.rb} +1 -0
  65. data/lib/notion_ruby_mapping/{created_time_property.rb → properties/created_time_property.rb} +1 -0
  66. data/lib/notion_ruby_mapping/properties/date_base_property.rb +135 -0
  67. data/lib/notion_ruby_mapping/{date_property.rb → properties/date_property.rb} +13 -0
  68. data/lib/notion_ruby_mapping/{email_property.rb → properties/email_property.rb} +2 -2
  69. data/lib/notion_ruby_mapping/{files_property.rb → properties/files_property.rb} +26 -13
  70. data/lib/notion_ruby_mapping/{formula_property.rb → properties/formula_property.rb} +5 -1
  71. data/lib/notion_ruby_mapping/{last_edited_by_property.rb → properties/last_edited_by_property.rb} +1 -0
  72. data/lib/notion_ruby_mapping/{last_edited_time_property.rb → properties/last_edited_time_property.rb} +1 -0
  73. data/lib/notion_ruby_mapping/{multi_property.rb → properties/multi_property.rb} +0 -0
  74. data/lib/notion_ruby_mapping/{multi_select_property.rb → properties/multi_select_property.rb} +4 -3
  75. data/lib/notion_ruby_mapping/{number_property.rb → properties/number_property.rb} +4 -0
  76. data/lib/notion_ruby_mapping/{people_property.rb → properties/people_property.rb} +8 -3
  77. data/lib/notion_ruby_mapping/{phone_number_property.rb → properties/phone_number_property.rb} +4 -1
  78. data/lib/notion_ruby_mapping/{property.rb → properties/property.rb} +33 -0
  79. data/lib/notion_ruby_mapping/{relation_property.rb → properties/relation_property.rb} +30 -10
  80. data/lib/notion_ruby_mapping/{rich_text_property.rb → properties/rich_text_property.rb} +0 -0
  81. data/lib/notion_ruby_mapping/{rollup_property.rb → properties/rollup_property.rb} +7 -0
  82. data/lib/notion_ruby_mapping/{select_property.rb → properties/select_property.rb} +8 -2
  83. data/lib/notion_ruby_mapping/{text_property.rb → properties/text_property.rb} +0 -0
  84. data/lib/notion_ruby_mapping/{title_property.rb → properties/title_property.rb} +0 -0
  85. data/lib/notion_ruby_mapping/{url_property.rb → properties/url_property.rb} +4 -1
  86. data/lib/notion_ruby_mapping/version.rb +1 -1
  87. data/lib/notion_ruby_mapping.rb +21 -7
  88. metadata +82 -40
  89. data/lib/notion_ruby_mapping/date_base_property.rb +0 -75
  90. data/lib/notion_ruby_mapping/page.rb +0 -50
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NotionRubyMapping
4
+ # Notion block
5
+ class ChildPageBlock < ChildBaseBlock
6
+ # @return [String (frozen)]
7
+ def type
8
+ "child_page"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NotionRubyMapping
4
+ # Notion block
5
+ class CodeBlock < Block
6
+ # @param [RichTextArray, String, Array<String>, RichTextObject, Array<RichTextObject>] text_info
7
+ # @param [RichTextArray, String, Array<String>, RichTextObject, Array<RichTextObject>] caption
8
+ # @param [String] language
9
+ # @see https://www.notion.so/hkob/CodeBlock-3a25869f60394b3f902c1ed0bf5ce1c9#7777d9b785234278876d7bf6842dd8a2
10
+ def initialize(text_info = nil, caption: [], language: "shell", json: nil, id: nil, parent: nil)
11
+ super(json: json, id: id, parent: parent)
12
+ if @json
13
+ decode_block_rich_text_array
14
+ decode_block_caption
15
+ @language = json[type]["language"] || "shell"
16
+ else
17
+ rich_text_array_and_color "rich_text", text_info
18
+ @caption = RichTextArray.rich_text_array "caption", caption
19
+ @language = language
20
+ end
21
+ end
22
+
23
+ # @see https://www.notion.so/hkob/CodeBlock-3a25869f60394b3f902c1ed0bf5ce1c9#282b6ca100a14841b849ab24519647f3
24
+ # @see https://www.notion.so/hkob/CodeBlock-3a25869f60394b3f902c1ed0bf5ce1c9#6321da9df4f04ccdbddddcd93b1afbe2
25
+ # @see https://www.notion.so/hkob/CodeBlock-3a25869f60394b3f902c1ed0bf5ce1c9#9de0cd82fb594a3a8d12095d9e21ea8d
26
+ attr_reader :caption, :language, :rich_text_array
27
+
28
+ # @param [Boolean] not_update false when update
29
+ # @return [Hash{String (frozen)->Hash}]
30
+ def block_json(not_update: true)
31
+ ans = super
32
+ ans[type] = @rich_text_array.update_property_schema_json(not_update).merge(
33
+ @caption.update_property_schema_json(not_update),
34
+ )
35
+ ans[type]["language"] = @language
36
+ ans
37
+ end
38
+
39
+ # @param [String] new_language
40
+ def language=(new_language)
41
+ @language = new_language
42
+ @payload.add_update_block_key "language"
43
+ end
44
+
45
+ # @return [String (frozen)]
46
+ def type
47
+ "code"
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NotionRubyMapping
4
+ # Notion block
5
+ class ColumnBlock < Block
6
+ # @param [NotionRubyMapping::Block, Array<NotionRubyMapping::Block>, nil] sub_blocks
7
+ # @see https://www.notion.so/hkob/ColumnBlock-91cb314fc6594ff6b0c77c1eae6c7fab#4b4486cdf26a474eab1c92f9c6ea8a91
8
+ def initialize(sub_blocks = [], json: nil, id: nil, parent: nil)
9
+ super(json: json, id: id, parent: parent)
10
+ add_sub_blocks sub_blocks unless json
11
+ @can_have_children = true
12
+ @can_append = false
13
+ end
14
+
15
+ # @return [String (frozen)]
16
+ def type
17
+ "column"
18
+ end
19
+
20
+ # @param [Boolean] not_update false when update
21
+ # @return [Hash{String (frozen)->Hash}]
22
+ def block_json(not_update: true)
23
+ ans = super
24
+ ans[type] = {}
25
+ ans[type]["children"] = @sub_blocks.map(&:block_json) if @sub_blocks
26
+ ans
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NotionRubyMapping
4
+ # Notion block
5
+ class ColumnListBlock < Block
6
+ # @param [Array<Array<NotionRubyMapping::Block, Array<NotionRubyMapping::Block>>>] array_of_sub_blocks
7
+ # @return [NotionRubyMapping::Block]
8
+ # @see https://www.notion.so/hkob/ColumnListBlock-78d12860099f4e7d89b65c446bd314ba#6e1c97e1b5da45038232f43994e4d7e5
9
+ def initialize(array_of_sub_blocks = [], json: nil, id: nil, parent: nil)
10
+ super(json: json, id: id, parent: parent)
11
+ unless json
12
+ raise StandardError, "The column_list must have at least 2 columns." if array_of_sub_blocks.count < 2
13
+
14
+ @columns = array_of_sub_blocks.map { |sub_blocks| ColumnBlock.new(sub_blocks) }
15
+ end
16
+ @can_have_children = true
17
+ end
18
+
19
+ # @return [String (frozen)]
20
+ def type
21
+ "column_list"
22
+ end
23
+
24
+ # @param [Boolean] not_update false when update
25
+ # @return [Hash{String (frozen)->Hash}]
26
+ def block_json(not_update: true)
27
+ ans = super
28
+ ans[type] = {}
29
+ ans[type]["children"] = @columns.map(&:block_json) if @columns
30
+ ans
31
+ end
32
+ end
33
+ end
@@ -7,6 +7,7 @@ module NotionRubyMapping
7
7
 
8
8
  # @param [String] id
9
9
  # @return [NotionRubyMapping::Database, String]
10
+ # @see https://www.notion.so/hkob/Database-1462b24502424539a4231bedc07dc2f5#58ba9190fd544432a9e2a5823d6c33b7
10
11
  def self.find(id, dry_run: false)
11
12
  nc = NotionCache.instance
12
13
  if dry_run
@@ -16,9 +17,16 @@ module NotionRubyMapping
16
17
  end
17
18
  end
18
19
 
19
- # @return [NotionRubyMapping::Property]
20
+ # @param [String] key
21
+ # @return [NotionRubyMapping::PropertyCache, Hash] obtained Page value or PropertyCache
22
+ def [](key)
23
+ get key
24
+ end
25
+
20
26
  # @param [Class] klass
21
27
  # @param [String] title
28
+ # @return [NotionRubyMapping::Property]
29
+ # @see https://www.notion.so/hkob/Database-1462b24502424539a4231bedc07dc2f5#c9d24269123c444295af88b9b27074a9
22
30
  def add_property(klass, title)
23
31
  prop = assign_property klass, title
24
32
  yield prop if block_given?
@@ -29,7 +37,8 @@ module NotionRubyMapping
29
37
 
30
38
  # @param [Array<Property, Class, String>] assign
31
39
  # @return [NotionRubyMapping::Base]
32
- def create_child_page(*assign)
40
+ # @see https://www.notion.so/hkob/Database-1462b24502424539a4231bedc07dc2f5#c217ce78020a4de79b720790fce3092d
41
+ def build_child_page(*assign)
33
42
  assign = properties.map { |p| [p.class, p.name] }.flatten if assign.empty?
34
43
  page = Page.new assign: assign, parent: {"database_id" => @id}
35
44
  pp = page.properties
@@ -38,38 +47,62 @@ module NotionRubyMapping
38
47
  page
39
48
  end
40
49
 
50
+ # @param [Array<Property, Class, String>] assign
51
+ # @return [NotionRubyMapping::Base]
52
+ # @see https://www.notion.so/hkob/Database-1462b24502424539a4231bedc07dc2f5#c217ce78020a4de79b720790fce3092d
53
+ def create_child_page(*assign, dry_run: false)
54
+ assign = properties.map { |p| [p.class, p.name] }.flatten if assign.empty?
55
+ page = Page.new assign: assign, parent: {"database_id" => @id}
56
+ pp = page.properties
57
+ pp.clear_will_update
58
+ yield page, pp if block_given?
59
+ page.save dry_run: dry_run
60
+ end
61
+
41
62
  # @return [NotionRubyMapping::RichTextArray]
63
+ # @see https://www.notion.so/hkob/Database-1462b24502424539a4231bedc07dc2f5#217a7d988c404d68b270c4874a9117b4
42
64
  def database_title
43
65
  @database_title ||= RichTextArray.new "title", json: (self["title"]), will_update: new_record?
44
66
  end
45
67
 
68
+ # @return [Hash] created json for property schemas (for create database)
46
69
  def property_schema_json
47
70
  @payload.property_schema_json @property_cache, database_title
48
71
  end
49
72
 
50
- # @return [Hash] created json for update database
73
+ # @return [Hash] created json for property values
51
74
  def property_values_json
52
75
  @payload.property_values_json @property_cache, database_title
53
76
  end
54
77
 
55
78
  # @param [NotionRubyMapping::Query] query object
56
79
  # @return [NotionRubyMapping::List, String]
80
+ # @see https://www.notion.so/hkob/Database-1462b24502424539a4231bedc07dc2f5#6bd9acf62c454f64bc555c8828057e6b
57
81
  def query_database(query = Query.new, dry_run: false)
58
82
  if dry_run
59
83
  Base.dry_run_script :post, @nc.query_database_path(@id), query.query_json
60
84
  else
61
- response = @nc.database_query @id, query
85
+ response = @nc.database_query_request @id, query
62
86
  List.new json: response, database: self, query: query
63
87
  end
64
88
  end
65
89
 
66
- # @param [Array] names
90
+ # @param [Array] property_names
67
91
  # @return [Array<NotionRubyMapping::Property>]
68
- def remove_properties(*names)
69
- names.map { |n| properties[n] }.each(&:remove)
92
+ # @see https://www.notion.so/hkob/Database-1462b24502424539a4231bedc07dc2f5#5d15354be2604141adfbf78d14d49942
93
+ def remove_properties(*property_names)
94
+ property_names.map { |n| properties[n] }.each(&:remove)
95
+ end
96
+
97
+ # @param [String] old_property_name
98
+ # @param [String] new_property_name
99
+ # @return [NotionRubyMapping::Database]
100
+ def rename_property(old_property_name, new_property_name)
101
+ properties[old_property_name].new_name = new_property_name
102
+ self
70
103
  end
71
104
 
72
- # @return [Hash] created json for update database
105
+ # @return [Hash] created json for property schemas (for update database)
73
106
  def update_property_schema_json
74
107
  @payload.update_property_schema_json @property_cache, database_title
75
108
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NotionRubyMapping
4
+ # Notion block
5
+ class DividerBlock < Block
6
+ # @param [Boolean] not_update false when update
7
+ # @return [Hash{String (frozen)->Hash}]
8
+ def block_json(not_update: true)
9
+ ans = super
10
+ ans[type] = {}
11
+ ans
12
+ end
13
+
14
+ # @return [String (frozen)]
15
+ def type
16
+ "divider"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NotionRubyMapping
4
+ # Notion block
5
+ class EmbedBlock < UrlCaptionBaseBlock
6
+ # @return [String (frozen)]
7
+ def type
8
+ "embed"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NotionRubyMapping
4
+ # Notion block
5
+ class EquationBlock < Block
6
+ # @param [String, NotionRubyMapping::EquationObject] expression
7
+ # @see https://www.notion.so/hkob/EquationBlock-df0f823dc5ac41b798052f161dd6540c#cfcd2ceb77194c0e915500b429e8b91b
8
+ def initialize(expression = nil, json: nil, id: nil, parent: nil)
9
+ super(json: json, id: id, parent: parent)
10
+ @equation_object = if @json
11
+ EquationObject.equation_object @json[type]["expression"]
12
+ else
13
+ EquationObject.equation_object expression
14
+ end
15
+ end
16
+
17
+ # @param [Boolean] not_update false when update
18
+ # @return [Hash{String (frozen)->Hash}]
19
+ def block_json(not_update: true)
20
+ ans = super
21
+ ans[type] = {"expression" => @equation_object.expression}
22
+ ans
23
+ end
24
+
25
+ # @return [String]
26
+ # @see https://www.notion.so/hkob/EquationBlock-df0f823dc5ac41b798052f161dd6540c#da3e9d93ffac4d84854be3342b4bf3fe
27
+ def expression
28
+ @equation_object&.expression
29
+ end
30
+
31
+ # @param [String] new_expression
32
+ # @see https://www.notion.so/hkob/EquationBlock-df0f823dc5ac41b798052f161dd6540c#f05e3b2c82914cea9f05e9e6644647e1
33
+ def expression=(new_expression)
34
+ @equation_object = EquationObject.equation_object new_expression
35
+ @payload.add_update_block_key "expression"
36
+ end
37
+
38
+ # @return [String (frozen)]
39
+ def type
40
+ "equation"
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NotionRubyMapping
4
+ # Notion block
5
+ class FileBaseBlock < Block
6
+ # @param [String, nil] url
7
+ # @param [RichTextArray, String, Array<String>, RichTextObject, Array<RichTextObject>, nil] caption
8
+ # @see https://www.notion.so/hkob/FileBlock-08f2aa6948364d00b92beacaac9a619c#ace53d2e6ff2404f937179ae1e966e98
9
+ # @see https://www.notion.so/hkob/ImageBlock-806b3d2a9a2c4bf5a5aca6e3fbc8a7e2#4cb790b8b5c847acab4341d55e4fa66a
10
+ def initialize(url = nil, caption: [], json: nil, id: nil, parent: nil)
11
+ super(json: json, id: id, parent: parent)
12
+ if @json
13
+ @file_object = FileObject.new json: @json[type]
14
+ decode_block_caption
15
+ @can_append = @file_object.external?
16
+ else
17
+ @file_object = FileObject.file_object url
18
+ @caption = RichTextArray.rich_text_array "caption", caption
19
+ end
20
+ end
21
+
22
+ # @see https://www.notion.so/hkob/FileBlock-08f2aa6948364d00b92beacaac9a619c#158487a7e1644fae8778dcff59869356
23
+ # @see https://www.notion.so/hkob/ImageBlock-806b3d2a9a2c4bf5a5aca6e3fbc8a7e2#19a4aa3e06514bbe84be9d3b8a45a20f
24
+ attr_reader :caption
25
+
26
+ # @param [Boolean] not_update false when update
27
+ # @return [Hash{String (frozen)->Hash}]
28
+ def block_json(not_update: true)
29
+ ans = super
30
+ ans[type] = @file_object.property_values_json
31
+ ans[type].merge! @caption.update_property_schema_json(not_update) if @caption
32
+ ans
33
+ end
34
+
35
+ # @return [String]
36
+ # @see https://www.notion.so/hkob/FileBlock-08f2aa6948364d00b92beacaac9a619c#d3e7d31b7b274955aa7603163867fa57
37
+ # @see https://www.notion.so/hkob/ImageBlock-806b3d2a9a2c4bf5a5aca6e3fbc8a7e2#01e1883119f14c5f9f7f6823793e72ec
38
+ def url
39
+ @file_object&.url
40
+ end
41
+
42
+ # @param [String] url
43
+ # @see https://www.notion.so/hkob/FileBlock-08f2aa6948364d00b92beacaac9a619c#23497b8eb2214c45b3d5881796f984cb
44
+ # @see https://www.notion.so/hkob/ImageBlock-806b3d2a9a2c4bf5a5aca6e3fbc8a7e2#61598d260b6140f2a359f7d22ea2548a
45
+ def url=(url)
46
+ @file_object.url = url
47
+ @payload.add_update_block_key "external"
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NotionRubyMapping
4
+ # Notion block
5
+ class FileBlock < FileBaseBlock
6
+ # @return [String (frozen)]
7
+ def type
8
+ "file"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NotionRubyMapping
4
+ # Notion block
5
+ class Heading1Block < TextSubBlockColorBaseBlock
6
+ # @param [RichTextArray, String, Array<String>, RichTextObject, Array<RichTextObject>, nil] text_info
7
+ # @param [String] color
8
+ def initialize(text_info = nil, color: nil, json: nil, id: nil, parent: nil)
9
+ super(text_info, color: color, json: json, id: id, parent: parent)
10
+ @can_have_children = false
11
+ end
12
+
13
+ # @return [String (frozen)]
14
+ def type
15
+ "heading_1"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NotionRubyMapping
4
+ # Notion block
5
+ class Heading2Block < TextSubBlockColorBaseBlock
6
+ # @param [RichTextArray, String, Array<String>, RichTextObject, Array<RichTextObject>] text_info
7
+ # @param [String] color
8
+ def initialize(text_info = nil, color: nil, json: nil, id: nil, parent: nil)
9
+ super(text_info, color: color, json: json, id: id, parent: parent)
10
+ @can_have_children = false
11
+ end
12
+
13
+ # @return [String (frozen)]
14
+ def type
15
+ "heading_2"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NotionRubyMapping
4
+ # Notion block
5
+ class Heading3Block < TextSubBlockColorBaseBlock
6
+ # @param [RichTextArray, String, Array<String>, RichTextObject, Array<RichTextObject>] text_info
7
+ # @param [String] color
8
+ def initialize(text_info = nil, color: nil, json: nil, id: nil, parent: nil)
9
+ super(text_info, color: color, json: json, id: id, parent: parent)
10
+ @can_have_children = false
11
+ end
12
+
13
+ # @return [String (frozen)]
14
+ def type
15
+ "heading_3"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NotionRubyMapping
4
+ # Notion block
5
+ class ImageBlock < FileBaseBlock
6
+ # @return [String (frozen)]
7
+ def type
8
+ "image"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NotionRubyMapping
4
+ # Notion block
5
+ class LinkPreviewBlock < UrlBaseBlock
6
+ def initialize(url = nil, json: nil, id: nil, parent: nil)
7
+ super
8
+ @can_append = false
9
+ end
10
+
11
+ # @return [String (frozen)]
12
+ def type
13
+ "link_preview"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NotionRubyMapping
4
+ # Notion block
5
+ class LinkToPageBlock < Block
6
+ # @param [String] page_id
7
+ # @param [String] database_id
8
+ # @see https://www.notion.so/hkob/LinkToPageBlock-e6d09d4742a24fb6bf1101b14a288ff5#d46a2f4288b04cbdbd1b4679f70b7642
9
+ def initialize(page_id: nil, database_id: nil, json: nil, id: nil, parent: nil)
10
+ super(json: json, id: id, parent: parent)
11
+ if @json
12
+ @page_id, @database_id = @json[type].values_at(*%w[page_id database_id])
13
+ else
14
+ @page_id = page_id
15
+ @database_id = database_id
16
+ end
17
+ end
18
+
19
+ # @see https://www.notion.so/hkob/LinkToPageBlock-e6d09d4742a24fb6bf1101b14a288ff5#f0ccbad5a94248baa658efc26d9c0ca3
20
+ # @see https://www.notion.so/hkob/LinkToPageBlock-e6d09d4742a24fb6bf1101b14a288ff5#1444263ecc7d402c8a18f4dd32a14956
21
+ attr_reader :database_id, :page_id
22
+
23
+ # @param [Boolean] not_update false when update
24
+ # @return [Hash{String (frozen)->Hash}]
25
+ def block_json(not_update: true)
26
+ ans = super
27
+ ans[type] = if @page_id
28
+ {"type" => "page_id", "page_id" => @page_id}
29
+ else
30
+ {"type" => "database_id", "database_id" => @database_id}
31
+ end
32
+ ans
33
+ end
34
+
35
+ # @return [String (frozen)]
36
+ def type
37
+ "link_to_page"
38
+ end
39
+ end
40
+ end
@@ -5,27 +5,57 @@ module NotionRubyMapping
5
5
  class List < Base
6
6
  include Enumerable
7
7
 
8
- def initialize(json: nil, id: nil, database: nil, query: nil)
8
+ def initialize(json: nil, id: nil, database: nil, parent: nil, query: nil)
9
9
  super(json: json, id: id)
10
10
  @has_more = @json["has_more"]
11
11
  @load_all_contents = !@has_more
12
12
  @database = database
13
+ @parent = parent
13
14
  @query = query
14
15
  @index = 0
15
16
  @has_content = true
16
17
  end
17
18
  attr_reader :has_more
18
19
 
19
- ### Public announced methods
20
-
20
+ # @return [NotionRubyMapping::List, Enumerator]
21
+ # @see https://www.notion.so/hkob/List-9a0b32335e0d48849a785ce5e162c760#12e1c261a0944a4095776b7515bef4a1
21
22
  def each
22
23
  return enum_for(:each) unless block_given?
23
24
 
24
- if @database
25
+ if @parent
26
+ unless @has_content
27
+ unless @load_all_contents
28
+ @query.start_cursor = nil
29
+ @json = @parent.children @query
30
+ @has_more = @json["has_more"]
31
+ end
32
+ @index = 0
33
+ @has_content = true
34
+ end
35
+
36
+ while @has_content
37
+ if @index < results.length
38
+ object = Base.create_from_json(results[@index])
39
+ @index += 1
40
+ yield object
41
+ elsif @has_more
42
+ if @parent
43
+ @query.start_cursor = @json["next_cursor"]
44
+ @json = @parent.children @query
45
+ @index = 0
46
+ @has_more = @json["has_more"]
47
+ else
48
+ @has_content = false
49
+ end
50
+ else
51
+ @has_content = false
52
+ end
53
+ end
54
+ elsif @database
25
55
  unless @has_content # re-exec
26
56
  unless @load_all_contents
27
57
  @query.start_cursor = nil
28
- @json = @database.query_database @query
58
+ @json = @nc.database_query_request @database.id, @query
29
59
  @has_more = @json["has_more"]
30
60
  end
31
61
  @index = 0
@@ -40,7 +70,7 @@ module NotionRubyMapping
40
70
  elsif @has_more
41
71
  if @database
42
72
  @query.start_cursor = @json["next_cursor"]
43
- @json = @database.query_database @query
73
+ @json = @nc.database_query_request @database.id, @query
44
74
  @index = 0
45
75
  @has_more = @json["has_more"]
46
76
  else
@@ -51,6 +81,7 @@ module NotionRubyMapping
51
81
  end
52
82
  end
53
83
  end
84
+ self
54
85
  end
55
86
 
56
87
  private
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NotionRubyMapping
4
+ # Notion block
5
+ class NumberedListItemBlock < TextSubBlockColorBaseBlock
6
+ # @return [String (frozen)]
7
+ def type
8
+ "numbered_list_item"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NotionRubyMapping
4
+ # Notion page object
5
+ class Page < Base
6
+ ### Public announced methods
7
+
8
+ # @param [String] id
9
+ # @return [NotionRubyMapping::Page, String]
10
+ # @see https://www.notion.so/hkob/Page-d359650e3ca94424af8359a24147b9a0#7d868b8b81c3473082bbdc7370813a4a
11
+ def self.find(id, dry_run: false)
12
+ nc = NotionCache.instance
13
+ if dry_run
14
+ Base.dry_run_script :get, nc.page_path(id)
15
+ else
16
+ nc.page id
17
+ end
18
+ end
19
+
20
+ # @param [String] key
21
+ # @return [NotionRubyMapping::PropertyCache, Hash] obtained Page value or PropertyCache
22
+ def [](key)
23
+ get key
24
+ end
25
+
26
+ # @param [String] title
27
+ # @param [Array<String, Property>] assigns
28
+ # @return [NotionRubyMapping::Database]
29
+ # @see https://www.notion.so/hkob/Page-d359650e3ca94424af8359a24147b9a0#2e8ca5408afb4f83a92b7b84c0dc9903
30
+ def build_child_database(title, *assigns)
31
+ db = Database.new json: {"title" => [TextObject.new(title).property_values_json]},
32
+ assign: assigns, parent: {"type" => "page_id", "page_id" => @id}
33
+ yield db, db.properties if block_given?
34
+ db
35
+ end
36
+
37
+ def create_child_database(title, *assigns, dry_run: false)
38
+ build_child_database title, *assigns
39
+ db = Database.new json: {"title" => [TextObject.new(title).property_values_json]},
40
+ assign: assigns, parent: {"type" => "page_id", "page_id" => @id}
41
+ yield db, db.properties
42
+ db.save dry_run: dry_run
43
+ end
44
+
45
+ # @return [String] title
46
+ # @see https://www.notion.so/hkob/Page-d359650e3ca94424af8359a24147b9a0#2ff7209055f346fbbda454cdbb40b1c8
47
+ def title
48
+ properties.select { |p| p.is_a? TitleProperty }.map(&:full_text).join ""
49
+ end
50
+
51
+ protected
52
+
53
+ # @return [NotionRubyMapping::Base, String]
54
+ def create(dry_run: false)
55
+ if dry_run
56
+ dry_run_script :post, @nc.pages_path, :property_values_json
57
+ else
58
+ @new_record = false
59
+ update_json @nc.create_page_request(property_values_json)
60
+ end
61
+ end
62
+
63
+ # @return [Hash]
64
+ def reload_json
65
+ @nc.page_request @id
66
+ end
67
+
68
+ # @return [NotionRubyMapping::Base, String]
69
+ def update(dry_run: false)
70
+ if dry_run
71
+ dry_run_script :patch, @nc.page_path(@id), :property_values_json
72
+ else
73
+ update_json @nc.update_page_request(@id, property_values_json)
74
+ end
75
+ end
76
+ end
77
+ end