notion_ruby_mapping 0.1.3 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Guardfile +1 -1
- data/README.md +550 -197
- data/env.yml.sample +7 -0
- data/lib/notion_ruby_mapping/base.rb +45 -25
- data/lib/notion_ruby_mapping/checkbox_property.rb +26 -0
- data/lib/notion_ruby_mapping/created_by_property.rb +21 -0
- data/lib/notion_ruby_mapping/created_time_property.rb +20 -0
- data/lib/notion_ruby_mapping/database.rb +8 -8
- data/lib/notion_ruby_mapping/date_base_property.rb +40 -38
- data/lib/notion_ruby_mapping/date_property.rb +42 -18
- data/lib/notion_ruby_mapping/email_property.rb +30 -1
- data/lib/notion_ruby_mapping/files_property.rb +40 -0
- data/lib/notion_ruby_mapping/formula_property.rb +18 -0
- data/lib/notion_ruby_mapping/last_edited_by_property.rb +21 -0
- data/lib/notion_ruby_mapping/last_edited_time_property.rb +20 -0
- data/lib/notion_ruby_mapping/list.rb +41 -2
- data/lib/notion_ruby_mapping/mention_object.rb +49 -0
- data/lib/notion_ruby_mapping/multi_select_property.rb +25 -6
- data/lib/notion_ruby_mapping/notion_cache.rb +126 -53
- data/lib/notion_ruby_mapping/number_property.rb +13 -8
- data/lib/notion_ruby_mapping/page.rb +5 -2
- data/lib/notion_ruby_mapping/payload.rb +10 -2
- data/lib/notion_ruby_mapping/people_property.rb +38 -0
- data/lib/notion_ruby_mapping/phone_number_property.rb +30 -1
- data/lib/notion_ruby_mapping/property.rb +79 -43
- data/lib/notion_ruby_mapping/property_cache.rb +31 -12
- data/lib/notion_ruby_mapping/query.rb +5 -2
- data/lib/notion_ruby_mapping/relation_property.rb +37 -0
- data/lib/notion_ruby_mapping/rich_text_object.rb +74 -0
- data/lib/notion_ruby_mapping/rich_text_property.rb +18 -0
- data/lib/notion_ruby_mapping/rollup_property.rb +29 -0
- data/lib/notion_ruby_mapping/select_property.rb +12 -6
- data/lib/notion_ruby_mapping/text_object.rb +89 -0
- data/lib/notion_ruby_mapping/text_property.rb +61 -0
- data/lib/notion_ruby_mapping/title_property.rb +18 -0
- data/lib/notion_ruby_mapping/url_property.rb +30 -1
- data/lib/notion_ruby_mapping/user_object.rb +38 -0
- data/lib/notion_ruby_mapping/version.rb +2 -1
- data/lib/notion_ruby_mapping.rb +3 -3
- data/notion_ruby_mapping.gemspec +3 -1
- metadata +40 -7
@@ -4,21 +4,25 @@ module NotionRubyMapping
|
|
4
4
|
# abstract class for property
|
5
5
|
class Property
|
6
6
|
# @param [String] name Property name
|
7
|
-
# @param [Hash] json
|
8
7
|
# @return [Property] generated Property object
|
9
|
-
def initialize(name,
|
8
|
+
def initialize(name, will_update: false)
|
10
9
|
@name = name
|
11
|
-
@will_update =
|
12
|
-
@json = json
|
10
|
+
@will_update = will_update
|
13
11
|
end
|
14
12
|
attr_reader :name
|
15
|
-
|
13
|
+
|
14
|
+
# @return [TrueClass, FalseClass]
|
15
|
+
attr_reader :will_update
|
16
16
|
|
17
17
|
# @param [String] key query parameter
|
18
18
|
# @param [Object] value query value
|
19
19
|
# @return [NotionRubyMapping::Query] generated Query object
|
20
|
-
def make_filter_query(key, value)
|
21
|
-
|
20
|
+
def make_filter_query(key, value, rollup = nil, rollup_type = nil)
|
21
|
+
if rollup
|
22
|
+
Query.new filter: {"property" => @name, rollup => {rollup_type => {key => value}}}
|
23
|
+
else
|
24
|
+
Query.new filter: {"property" => @name, type => {key => value}}
|
25
|
+
end
|
22
26
|
end
|
23
27
|
|
24
28
|
# @return [Symbol] property type
|
@@ -26,21 +30,53 @@ module NotionRubyMapping
|
|
26
30
|
self.class::TYPE
|
27
31
|
end
|
28
32
|
|
29
|
-
# @param [String]
|
33
|
+
# @param [String] name
|
30
34
|
# @param [Hash] input_json
|
31
35
|
# @return [NotionRubyMapping::Property, nil] generated Property object
|
32
|
-
def self.create_from_json(
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
36
|
+
def self.create_from_json(name, input_json)
|
37
|
+
raise StandardError, "Property not found: #{name}:#{input_json}" if input_json.nil?
|
38
|
+
|
39
|
+
case input_json["type"]
|
40
|
+
when "number"
|
41
|
+
NumberProperty.new name, number: input_json["number"]
|
42
|
+
when "select"
|
43
|
+
SelectProperty.new name, json: input_json["select"]
|
44
|
+
when "multi_select"
|
45
|
+
MultiSelectProperty.new name, json: input_json["multi_select"]
|
46
|
+
when "date"
|
47
|
+
DateProperty.new name, json: input_json["date"]
|
48
|
+
when "title"
|
49
|
+
TitleProperty.new name, json: input_json["title"]
|
50
|
+
when "rich_text"
|
51
|
+
RichTextProperty.new name, json: input_json["rich_text"]
|
52
|
+
when "checkbox"
|
53
|
+
CheckboxProperty.new name, checkbox: input_json["checkbox"]
|
54
|
+
when "people"
|
55
|
+
PeopleProperty.new name, json: input_json["people"]
|
56
|
+
when "email"
|
57
|
+
EmailProperty.new name, email: input_json["email"]
|
58
|
+
when "url"
|
59
|
+
UrlProperty.new name, url: input_json["url"]
|
60
|
+
when "phone_number"
|
61
|
+
PhoneNumberProperty.new name, phone_number: input_json["phone_number"]
|
62
|
+
when "files"
|
63
|
+
FilesProperty.new name, json: input_json["files"]
|
64
|
+
when "created_time"
|
65
|
+
CreatedTimeProperty.new name, created_time: input_json["created_time"]
|
66
|
+
when "last_edited_time"
|
67
|
+
LastEditedTimeProperty.new name, last_edited_time: input_json["last_edited_time"]
|
68
|
+
when "created_by"
|
69
|
+
CreatedByProperty.new name, json: input_json["created_by"]
|
70
|
+
when "last_edited_by"
|
71
|
+
LastEditedByProperty.new name, json: input_json["last_edited_by"]
|
72
|
+
when "formula"
|
73
|
+
FormulaProperty.new name, json: input_json["formula"]
|
74
|
+
when "rollup"
|
75
|
+
RollupProperty.new name, json: input_json["rollup"]
|
76
|
+
when "relation"
|
77
|
+
RelationProperty.new name, json: input_json["relation"]
|
42
78
|
else
|
43
|
-
|
79
|
+
raise StandardError, "Irregular property type: #{input_json["type"]}"
|
44
80
|
end
|
45
81
|
end
|
46
82
|
end
|
@@ -49,14 +85,14 @@ module NotionRubyMapping
|
|
49
85
|
module EqualsDoesNotEqual
|
50
86
|
# @param [String, Number] value Query value
|
51
87
|
# @return [NotionRubyMapping::Query] generated Query object
|
52
|
-
def filter_equals(value)
|
53
|
-
make_filter_query "equals", value
|
88
|
+
def filter_equals(value, rollup = nil, rollup_type = nil)
|
89
|
+
make_filter_query "equals", value, rollup, rollup_type
|
54
90
|
end
|
55
91
|
|
56
92
|
# @param [String, Number] value Query value
|
57
93
|
# @return [NotionRubyMapping::Query] generated Query object
|
58
|
-
def filter_does_not_equal(value)
|
59
|
-
make_filter_query "does_not_equal", value
|
94
|
+
def filter_does_not_equal(value, rollup = nil, rollup_type = nil)
|
95
|
+
make_filter_query "does_not_equal", value, rollup, rollup_type
|
60
96
|
end
|
61
97
|
end
|
62
98
|
|
@@ -64,14 +100,14 @@ module NotionRubyMapping
|
|
64
100
|
module ContainsDoesNotContain
|
65
101
|
# @param [String] value Query value
|
66
102
|
# @return [NotionRubyMapping::Query] generated Query object
|
67
|
-
def filter_contains(value)
|
68
|
-
make_filter_query "contains", value
|
103
|
+
def filter_contains(value, rollup = nil, rollup_type = nil)
|
104
|
+
make_filter_query "contains", value, rollup, rollup_type
|
69
105
|
end
|
70
106
|
|
71
107
|
# @param [String] value Query value
|
72
108
|
# @return [NotionRubyMapping::Query] generated Query object
|
73
|
-
def filter_does_not_contain(value)
|
74
|
-
make_filter_query "does_not_contain", value
|
109
|
+
def filter_does_not_contain(value, rollup = nil, rollup_type = nil)
|
110
|
+
make_filter_query "does_not_contain", value, rollup, rollup_type
|
75
111
|
end
|
76
112
|
end
|
77
113
|
|
@@ -79,27 +115,27 @@ module NotionRubyMapping
|
|
79
115
|
module StartsWithEndsWith
|
80
116
|
# @param [String] value Query value
|
81
117
|
# @return [NotionRubyMapping::Query] generated Query object
|
82
|
-
def filter_starts_with(value)
|
83
|
-
make_filter_query "starts_with", value
|
118
|
+
def filter_starts_with(value, rollup = nil, rollup_type = nil)
|
119
|
+
make_filter_query "starts_with", value, rollup, rollup_type
|
84
120
|
end
|
85
121
|
|
86
122
|
# @param [String] value Query value
|
87
123
|
# @return [NotionRubyMapping::Query] generated Query object
|
88
|
-
def filter_ends_with(value)
|
89
|
-
make_filter_query "ends_with", value
|
124
|
+
def filter_ends_with(value, rollup = nil, rollup_type = nil)
|
125
|
+
make_filter_query "ends_with", value, rollup, rollup_type
|
90
126
|
end
|
91
127
|
end
|
92
128
|
|
93
129
|
# module for make query of is_empty and is_not_empty
|
94
130
|
module IsEmptyIsNotEmpty
|
95
131
|
# @return [NotionRubyMapping::Query] generated Query object
|
96
|
-
def filter_is_empty
|
97
|
-
make_filter_query "is_empty", true
|
132
|
+
def filter_is_empty(rollup = nil, rollup_type = nil)
|
133
|
+
make_filter_query "is_empty", true, rollup, rollup_type
|
98
134
|
end
|
99
135
|
|
100
136
|
# @return [NotionRubyMapping::Query] generated Query object
|
101
|
-
def filter_is_not_empty
|
102
|
-
make_filter_query "is_not_empty", true
|
137
|
+
def filter_is_not_empty(rollup = nil, rollup_type = nil)
|
138
|
+
make_filter_query "is_not_empty", true, rollup, rollup_type
|
103
139
|
end
|
104
140
|
end
|
105
141
|
|
@@ -107,26 +143,26 @@ module NotionRubyMapping
|
|
107
143
|
module GreaterThanLessThan
|
108
144
|
# @param [Number] value Query value
|
109
145
|
# @return [NotionRubyMapping::Query] generated Query object
|
110
|
-
def filter_greater_than(value)
|
111
|
-
make_filter_query "greater_than", value
|
146
|
+
def filter_greater_than(value, rollup = nil, rollup_type = nil)
|
147
|
+
make_filter_query "greater_than", value, rollup, rollup_type
|
112
148
|
end
|
113
149
|
|
114
150
|
# @param [Number] value Query value
|
115
151
|
# @return [NotionRubyMapping::Query] generated Query object
|
116
|
-
def filter_less_than(value)
|
117
|
-
make_filter_query "less_than", value
|
152
|
+
def filter_less_than(value, rollup = nil, rollup_type = nil)
|
153
|
+
make_filter_query "less_than", value, rollup, rollup_type
|
118
154
|
end
|
119
155
|
|
120
156
|
# @param [Number] value Query value
|
121
157
|
# @return [NotionRubyMapping::Query] generated Query object
|
122
|
-
def filter_greater_than_or_equal_to(value)
|
123
|
-
make_filter_query "greater_than_or_equal_to", value
|
158
|
+
def filter_greater_than_or_equal_to(value, rollup = nil, rollup_type = nil)
|
159
|
+
make_filter_query "greater_than_or_equal_to", value, rollup, rollup_type
|
124
160
|
end
|
125
161
|
|
126
162
|
# @param [Number] value Query value
|
127
163
|
# @return [NotionRubyMapping::Query] generated Query object
|
128
|
-
def filter_less_than_or_equal_to(value)
|
129
|
-
make_filter_query "less_than_or_equal_to", value
|
164
|
+
def filter_less_than_or_equal_to(value, rollup = nil, rollup_type = nil)
|
165
|
+
make_filter_query "less_than_or_equal_to", value, rollup, rollup_type
|
130
166
|
end
|
131
167
|
end
|
132
168
|
end
|
@@ -1,36 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module NotionRubyMapping
|
4
|
+
# PropertyCache class
|
2
5
|
class PropertyCache
|
6
|
+
include Enumerable
|
3
7
|
def initialize(json = {})
|
4
8
|
@properties = {}
|
5
9
|
@json = json
|
6
10
|
end
|
11
|
+
attr_writer :json
|
7
12
|
|
8
13
|
# @param [String] key
|
9
14
|
# @return [Property] Property for key
|
10
15
|
def [](key)
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
+
@properties[key] ||= Property.create_from_json key, @json[key]
|
17
|
+
end
|
18
|
+
|
19
|
+
# @param [Array] key
|
20
|
+
# @return [Array]
|
21
|
+
def values_at(*key)
|
22
|
+
generate_all_properties
|
23
|
+
@properties.values_at(*key)
|
24
|
+
end
|
25
|
+
|
26
|
+
def generate_all_properties
|
27
|
+
if @json.empty?
|
28
|
+
@properties.values
|
29
|
+
else
|
30
|
+
@json.keys.map { |key| self[key] }
|
16
31
|
end
|
17
|
-
|
32
|
+
end
|
33
|
+
|
34
|
+
# @return [Hash, Enumerator]
|
35
|
+
def each(&block)
|
36
|
+
return enum_for(:each) unless block_given?
|
37
|
+
|
38
|
+
generate_all_properties.each(&block)
|
18
39
|
end
|
19
40
|
|
20
41
|
# @param [Property] property added Property
|
21
|
-
|
22
|
-
def add_property(property, will_update: false)
|
42
|
+
def add_property(property)
|
23
43
|
@properties[property.name] = property
|
24
|
-
property.will_update = true if will_update
|
25
44
|
self
|
26
45
|
end
|
27
46
|
|
28
47
|
# @return [Hash] created json
|
29
|
-
def
|
30
|
-
@properties.each_with_object({}) do |(
|
48
|
+
def property_values_json
|
49
|
+
@properties.each_with_object({}) do |(_, property), ans|
|
31
50
|
if property.will_update
|
32
51
|
ans["properties"] ||= {}
|
33
|
-
ans["properties"]
|
52
|
+
ans["properties"].merge! property.property_values_json
|
34
53
|
end
|
35
54
|
end
|
36
55
|
end
|
@@ -3,11 +3,14 @@
|
|
3
3
|
module NotionRubyMapping
|
4
4
|
# Query object
|
5
5
|
class Query
|
6
|
-
def initialize(filter: {}, sort: [])
|
6
|
+
def initialize(filter: {}, sort: [], page_size: 100, start_cursor: nil)
|
7
7
|
@filter = filter
|
8
8
|
@sort = sort
|
9
|
+
@page_size = page_size
|
10
|
+
@start_cursor = start_cursor
|
9
11
|
end
|
10
|
-
attr_reader :filter, :sort
|
12
|
+
attr_reader :filter, :sort, :page_size
|
13
|
+
attr_accessor :start_cursor
|
11
14
|
|
12
15
|
# @param [Query] other_query other query
|
13
16
|
# @return [NotionRubyMapping::Query] updated self (Query object)
|
@@ -4,5 +4,42 @@ module NotionRubyMapping
|
|
4
4
|
# MultiSelect property
|
5
5
|
class RelationProperty < MultiProperty
|
6
6
|
TYPE = "relation"
|
7
|
+
|
8
|
+
# @param [String] name
|
9
|
+
# @param [Hash] json
|
10
|
+
# @param [String, Array<String>] relation
|
11
|
+
def initialize(name, will_update: false, json: nil, relation: nil)
|
12
|
+
super name, will_update: will_update
|
13
|
+
@relation = if relation
|
14
|
+
Array(relation)
|
15
|
+
elsif json
|
16
|
+
json.map { |r| r["id"] }
|
17
|
+
else
|
18
|
+
[]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# @param [String, Array<String>] relation a id or Array of id
|
23
|
+
# @return [Array<String>] settled relation Array
|
24
|
+
def relation=(relation)
|
25
|
+
@will_update = true
|
26
|
+
@relation = Array(relation)
|
27
|
+
end
|
28
|
+
|
29
|
+
# @param [Hash] json
|
30
|
+
def update_from_json(json)
|
31
|
+
@will_update = false
|
32
|
+
@relation = json["relation"].map { |r| r["id"] }
|
33
|
+
end
|
34
|
+
|
35
|
+
# @return [Hash] created json
|
36
|
+
def property_values_json
|
37
|
+
{
|
38
|
+
@name => {
|
39
|
+
"type" => "relation",
|
40
|
+
"relation" => @relation.map { |rid| {"id" => rid} },
|
41
|
+
},
|
42
|
+
}
|
43
|
+
end
|
7
44
|
end
|
8
45
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NotionRubyMapping
|
4
|
+
# RichTextObject
|
5
|
+
class RichTextObject
|
6
|
+
# @param [String] type
|
7
|
+
# @return [TextObject]
|
8
|
+
def initialize(type, options = {})
|
9
|
+
if instance_of?(RichTextObject)
|
10
|
+
raise StandardError,
|
11
|
+
"RichTextObject is abstract class. Please use TextObject."
|
12
|
+
end
|
13
|
+
|
14
|
+
@type = type
|
15
|
+
@options = options
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.create_from_json(json)
|
19
|
+
type = json["type"]
|
20
|
+
options = (json["annotations"] || {}).merge(json.slice("plain_text", "href"))
|
21
|
+
case type
|
22
|
+
when "text"
|
23
|
+
TextObject.new json["plain_text"], options
|
24
|
+
when "mention"
|
25
|
+
mention = json["mention"]
|
26
|
+
case mention["type"]
|
27
|
+
when "user"
|
28
|
+
MentionObject.new options.merge({"user_id" => mention["user"]["id"]})
|
29
|
+
when "page"
|
30
|
+
MentionObject.new options.merge({"page_id" => mention["page"]["id"]})
|
31
|
+
when "database"
|
32
|
+
MentionObject.new options.merge({"database_id" => mention["database"]["id"]})
|
33
|
+
when "date"
|
34
|
+
MentionObject.new options.merge(mention["date"].slice("start", "end", "time_zone"))
|
35
|
+
else
|
36
|
+
raise StandardError, json
|
37
|
+
end
|
38
|
+
else
|
39
|
+
raise StandardError, json
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# @param [RichTextObject, String] to
|
44
|
+
# @return [NotionRubyMapping::RichTextObject] RichTextObject
|
45
|
+
def self.text_object(to)
|
46
|
+
if to.is_a? RichTextObject
|
47
|
+
to
|
48
|
+
else
|
49
|
+
TextObject.new to
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# @return [Hash{String (frozen)->Object}]
|
54
|
+
def property_values_json
|
55
|
+
{
|
56
|
+
"type" => @type,
|
57
|
+
@type => partial_property_values_json,
|
58
|
+
"plain_text" => @options["plain_text"],
|
59
|
+
"href" => @options["href"],
|
60
|
+
}.merge annotations_json
|
61
|
+
end
|
62
|
+
|
63
|
+
protected
|
64
|
+
|
65
|
+
# @return [Hash] options
|
66
|
+
attr_reader :options
|
67
|
+
|
68
|
+
# @return [Hash, Hash{String (frozen)->Hash}]
|
69
|
+
def annotations_json
|
70
|
+
annotations = @options.slice(*%w[bold italic strikethrough underline code color])
|
71
|
+
annotations.empty? ? {} : {"annotations" => annotations}
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -1,7 +1,25 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module NotionRubyMapping
|
4
|
+
# RichTextProperty
|
4
5
|
class RichTextProperty < TextProperty
|
5
6
|
TYPE = "rich_text"
|
7
|
+
|
8
|
+
# @param [Hash] json
|
9
|
+
def update_from_json(json)
|
10
|
+
@will_update = false
|
11
|
+
@text_objects = json["rich_text"].map { |to| RichTextObject.create_from_json to }
|
12
|
+
end
|
13
|
+
|
14
|
+
# @return [Hash] created json
|
15
|
+
def property_values_json
|
16
|
+
text_json = @text_objects.map(&:property_values_json)
|
17
|
+
{
|
18
|
+
@name => {
|
19
|
+
"type" => "rich_text",
|
20
|
+
"rich_text" => text_json.empty? ? (@json || []) : text_json,
|
21
|
+
},
|
22
|
+
}
|
23
|
+
end
|
6
24
|
end
|
7
25
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NotionRubyMapping
|
4
|
+
# Rollup property
|
5
|
+
class RollupProperty < DateBaseProperty
|
6
|
+
include ContainsDoesNotContain
|
7
|
+
include StartsWithEndsWith
|
8
|
+
include GreaterThanLessThan
|
9
|
+
TYPE = "rollup"
|
10
|
+
|
11
|
+
# @param [String] name
|
12
|
+
# @param [Hash] json
|
13
|
+
def initialize(name, json: nil)
|
14
|
+
super name, will_update: false
|
15
|
+
@json = json
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [Hash] {} created_time cannot be updated
|
19
|
+
def property_values_json
|
20
|
+
{}
|
21
|
+
end
|
22
|
+
|
23
|
+
# @param [Hash] json
|
24
|
+
def update_from_json(json)
|
25
|
+
@will_update = false
|
26
|
+
@json = json["rollup"]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -10,14 +10,20 @@ module NotionRubyMapping
|
|
10
10
|
# @param [String] name Property name
|
11
11
|
# @param [Hash] json
|
12
12
|
# @param [String] select String value (optional)
|
13
|
-
def initialize(name, json: nil, select: nil)
|
14
|
-
super
|
15
|
-
@select = select
|
13
|
+
def initialize(name, will_update: false, json: nil, select: nil)
|
14
|
+
super name, will_update: will_update
|
15
|
+
@select = select || json && json["name"]
|
16
|
+
end
|
17
|
+
|
18
|
+
# @param [Hash] json
|
19
|
+
def update_from_json(json)
|
20
|
+
@will_update = false
|
21
|
+
@select = json["select"]["name"]
|
16
22
|
end
|
17
23
|
|
18
24
|
# @return [Hash]
|
19
|
-
def
|
20
|
-
{"select" => @select ? {"name" => @select} : @json}
|
25
|
+
def property_values_json
|
26
|
+
{@name => {"type" => "select", "select" => (@select ? {"name" => @select} : @json)}}
|
21
27
|
end
|
22
28
|
|
23
29
|
# @param [String] select
|
@@ -27,4 +33,4 @@ module NotionRubyMapping
|
|
27
33
|
@select = select
|
28
34
|
end
|
29
35
|
end
|
30
|
-
end
|
36
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NotionRubyMapping
|
4
|
+
# TextObject
|
5
|
+
class TextObject < RichTextObject
|
6
|
+
# @param [String] text
|
7
|
+
# @return [TextObject]
|
8
|
+
def initialize(text, options = {})
|
9
|
+
super "text", {"plain_text" => text}.merge(options)
|
10
|
+
@text = text
|
11
|
+
@type = "text"
|
12
|
+
@will_update = false
|
13
|
+
end
|
14
|
+
attr_reader :text, :will_update
|
15
|
+
|
16
|
+
# @param [String, RichTextObject] value
|
17
|
+
# @return [RichTextObject] self
|
18
|
+
def text=(value)
|
19
|
+
@will_update = true
|
20
|
+
if value.is_a? RichTextObject
|
21
|
+
@options = value.options
|
22
|
+
@text = value.text
|
23
|
+
else
|
24
|
+
p value
|
25
|
+
@text = value
|
26
|
+
@options["plain_text"] = value
|
27
|
+
end
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
31
|
+
# @param [String, RichTextObject] value
|
32
|
+
# @return [String] input text
|
33
|
+
def plain_text=(value)
|
34
|
+
text(value)
|
35
|
+
end
|
36
|
+
|
37
|
+
# @param [Boolean] flag
|
38
|
+
# @return [Boolean] input flag
|
39
|
+
def bold=(flag)
|
40
|
+
@will_update = true
|
41
|
+
@options["bold"] = flag
|
42
|
+
end
|
43
|
+
|
44
|
+
# @param [Boolean] flag
|
45
|
+
# @return [Boolean] input flag
|
46
|
+
def italic=(flag)
|
47
|
+
@will_update = true
|
48
|
+
@options["italic"] = flag
|
49
|
+
end
|
50
|
+
|
51
|
+
# @param [Boolean] flag
|
52
|
+
# @return [Boolean] input flag
|
53
|
+
def strikethrough=(flag)
|
54
|
+
@will_update = true
|
55
|
+
@options["strikethrough"] = flag
|
56
|
+
end
|
57
|
+
|
58
|
+
# @param [Boolean] flag
|
59
|
+
# @return [Boolean] input flag
|
60
|
+
def underline=(flag)
|
61
|
+
@will_update = true
|
62
|
+
@options["underline"] = flag
|
63
|
+
end
|
64
|
+
|
65
|
+
# @param [Boolean] flag
|
66
|
+
# @return [Boolean] input flag
|
67
|
+
def code=(flag)
|
68
|
+
@will_update = true
|
69
|
+
@options["code"] = flag
|
70
|
+
end
|
71
|
+
|
72
|
+
# @param [String] color
|
73
|
+
# @return [String] input color
|
74
|
+
def color=(color)
|
75
|
+
@will_update = true
|
76
|
+
@options["color"] = color
|
77
|
+
end
|
78
|
+
|
79
|
+
protected
|
80
|
+
|
81
|
+
def partial_property_values_json
|
82
|
+
url = @options["href"]
|
83
|
+
{
|
84
|
+
"content" => @text,
|
85
|
+
"link" => url ? {"url" => url} : nil,
|
86
|
+
}
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -1,11 +1,72 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "forwardable"
|
4
|
+
|
3
5
|
module NotionRubyMapping
|
4
6
|
# Text property
|
5
7
|
class TextProperty < Property
|
8
|
+
extend Forwardable
|
9
|
+
include Enumerable
|
6
10
|
include EqualsDoesNotEqual
|
7
11
|
include ContainsDoesNotContain
|
8
12
|
include StartsWithEndsWith
|
9
13
|
include IsEmptyIsNotEmpty
|
14
|
+
|
15
|
+
# @param [String] name
|
16
|
+
# @param [Hash] json
|
17
|
+
# @param [Array<RichTextObject>] text_objects
|
18
|
+
def initialize(name, will_update: false, json: nil, text_objects: nil)
|
19
|
+
raise StandardError, "TextObject is abstract class. Please use RichTextProperty." if instance_of? TextProperty
|
20
|
+
|
21
|
+
super name, will_update: will_update
|
22
|
+
@text_objects = if text_objects
|
23
|
+
text_objects.map { |to_s| RichTextObject.text_object to_s }
|
24
|
+
elsif json
|
25
|
+
json.map { |to| RichTextObject.create_from_json to }
|
26
|
+
else
|
27
|
+
[]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
attr_reader :text_objects
|
31
|
+
|
32
|
+
# @return [TrueClass, FalseClass] will update?
|
33
|
+
def will_update
|
34
|
+
@will_update || @text_objects.map(&:will_update).any?
|
35
|
+
end
|
36
|
+
|
37
|
+
# @param [Proc] block
|
38
|
+
# @return [Enumerator]
|
39
|
+
def each(&block)
|
40
|
+
return enum_for(:each) unless block
|
41
|
+
|
42
|
+
@text_objects.each(&block)
|
43
|
+
end
|
44
|
+
|
45
|
+
# @param [String, RichTextObject] to
|
46
|
+
# @return [NotionRubyMapping::RichTextObject] added RichTextObject
|
47
|
+
def <<(to)
|
48
|
+
@will_update = true
|
49
|
+
rto = RichTextObject.text_object(to)
|
50
|
+
@text_objects << rto
|
51
|
+
rto
|
52
|
+
end
|
53
|
+
|
54
|
+
# @param [Numeric] index index number
|
55
|
+
# @return [RichTextObject] selected RichTextObject
|
56
|
+
def [](index)
|
57
|
+
@text_objects[index]
|
58
|
+
end
|
59
|
+
|
60
|
+
# @param [Numeric] index
|
61
|
+
# @return [NotionRubyMapping::RichTextObject] removed RichTextObject
|
62
|
+
def delete_at(index)
|
63
|
+
@will_update = true
|
64
|
+
@text_objects[index]
|
65
|
+
end
|
66
|
+
|
67
|
+
# @return [String] full_text
|
68
|
+
def full_text
|
69
|
+
map(&:text).join ""
|
70
|
+
end
|
10
71
|
end
|
11
72
|
end
|
@@ -1,7 +1,25 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module NotionRubyMapping
|
4
|
+
# TitleProperty
|
4
5
|
class TitleProperty < TextProperty
|
5
6
|
TYPE = "title"
|
7
|
+
|
8
|
+
# @param [Hash] json
|
9
|
+
def update_from_json(json)
|
10
|
+
@will_update = false
|
11
|
+
@text_objects = json["title"].map { |to| RichTextObject.create_from_json to }
|
12
|
+
end
|
13
|
+
|
14
|
+
# @return [Hash] created json
|
15
|
+
def property_values_json
|
16
|
+
text_json = map(&:property_values_json)
|
17
|
+
{
|
18
|
+
@name => {
|
19
|
+
"type" => "title",
|
20
|
+
"title" => text_json.empty? ? @json : text_json,
|
21
|
+
},
|
22
|
+
}
|
23
|
+
end
|
6
24
|
end
|
7
25
|
end
|