notion_ruby_mapping 0.1.4 → 0.2.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.
- checksums.yaml +4 -4
- data/Guardfile +1 -1
- data/README.md +494 -268
- data/env.yml.sample +7 -0
- data/lib/notion_ruby_mapping/base.rb +37 -30
- 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 +33 -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
         |