chotto 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9c41d0ab7f3b4a69a3ddc7386d5246476f177dbb2494f35323829fc00156df00
4
- data.tar.gz: e3a675154168eb084157975d87efc4ab52446b160d4e53a6dbb687eb2ada1054
3
+ metadata.gz: 372dec253b24d3abd183e75e361210b2ec2c601a70466816789361b0e3070ab6
4
+ data.tar.gz: ee395a74ab114ec52d3a4e019f1e35e42fa972aeb7a17f3cd59cb6e797f2688a
5
5
  SHA512:
6
- metadata.gz: c4108b72fba8e744a832d8c8238d99951b3070afbc7a710ec7d96cbff84b9ae7a908972dacad76fee9be2703c8240f43c73c073b64c28d1258d45c788f9eded7
7
- data.tar.gz: 91243ec3f65d27ec16f85d005bdea9b09d4fe04ca58b798cce5501f123a4099ed268d0c765007b5230059d6d91e8e9b5d78cc12d4a849dc93cc6c4af9b51dd7e
6
+ metadata.gz: f00b7a2a92cbb8ae9c1785cf0c11a447a269f1dba097fdf161cb4beb1976252a5aef4a7e4cadce95e68e22b6cf65a1dece24069624966c7a3d69d30456237fb6
7
+ data.tar.gz: fe0350716b91cf3e3fb9a75413f91861120d56db2983c105e7233e0d7ab72525c650fa506b2b253f21ed9954c93d420ba44546bda63c85bf327c3c91ab59ba04
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chotto
4
+ Config = Struct.new(:database_path, :db_class, :only_new)
5
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chotto
4
+ class Database
5
+ attr_reader :db
6
+
7
+ def initialize(path:, db_class:)
8
+ @db = db_class.new(path, mode: Notmuch::MODE_READ_WRITE)
9
+ end
10
+
11
+ def search_messages(query)
12
+ db.query(query).search_messages
13
+ end
14
+
15
+ def close
16
+ db.close
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chotto
4
+ module Helpers
5
+ def self.header_name_from_dsl(method_name)
6
+ method_name
7
+ .to_s
8
+ .split('_')
9
+ .map(&:downcase)
10
+ .join('-')
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chotto
4
+ class Message
5
+ attr_reader :message, :messages, :db
6
+
7
+ # attr_accessor :tags
8
+
9
+ def initialize(msg:, db:)
10
+ @message = msg
11
+ @db = db
12
+ # @tags = MessageTags.new(message: message)
13
+ end
14
+
15
+ def method_missing(method_name, *_args)
16
+ handle_get_header(Chotto::Helpers.header_name_from_dsl(method_name))
17
+ end
18
+
19
+ def tags
20
+ @tags ||= message.tags
21
+ end
22
+
23
+ attr_writer :tags
24
+
25
+ def save!
26
+ message.remove_all_tags
27
+ tags.each do |tag|
28
+ message.add_tag(tag.to_s)
29
+ end
30
+ end
31
+
32
+ def thread
33
+ thread_id = message.thread_id
34
+ MessageThread.new(thread_id: thread_id, db: db)
35
+ end
36
+
37
+ private
38
+
39
+ def handle_get_header(header_name)
40
+ message.header(header_name)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chotto
4
+ class MessageThread
5
+ attr_reader :thread_id, :db
6
+
7
+ def initialize(thread_id:, db:)
8
+ @thread_id = thread_id
9
+ @db = db
10
+ end
11
+
12
+ def each
13
+ db.search_messages("thread:#{thread_id}").each do |msg|
14
+ yield(
15
+ Message.new(
16
+ msg: msg,
17
+ db: db
18
+ ))
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chotto
4
+ AND_CONJUCTION = :and
5
+ OR_CONJUCTION = :or
6
+ DEFAULT_CONJUCTION = AND_CONJUCTION
7
+ OLDEST_FIRST_ORDER = 'oldest_first'
8
+ NEWEST_FIRST_ORDER = 'newest_first'
9
+ DEFAULT_ORDER = OLDEST_FIRST_ORDER
10
+
11
+ class Messages
12
+ attr_accessor :query, :current_conjuction, :token_count, :order, :only_new
13
+ attr_reader :db
14
+
15
+ include Enumerable
16
+
17
+ def initialize(db:, only_new:)
18
+ @db = db
19
+ @current_conjuction = AND_CONJUCTION
20
+ @token_count = 0
21
+ @order = DEFAULT_ORDER
22
+ @only_new = only_new
23
+ clear_filter!
24
+ end
25
+
26
+ def or
27
+ @current_conjuction = OR_CONJUCTION
28
+ self
29
+ end
30
+
31
+ def and
32
+ @current_conjuction = AND_CONJUCTION
33
+ self
34
+ end
35
+
36
+ def filter(params)
37
+ case params
38
+ when String
39
+ add_filter_from_string(params)
40
+ when Hash
41
+ add_filter_from_hash(params)
42
+ end
43
+
44
+ self
45
+ end
46
+
47
+ def clear_filter!
48
+ @query = []
49
+ end
50
+
51
+ def newest_first
52
+ @order = NEWEST_FIRST_ORDER
53
+
54
+ self
55
+ end
56
+
57
+ def oldest_first
58
+ @order = OLDEST_FIRST_ORDER
59
+
60
+ self
61
+ end
62
+
63
+ def each
64
+ db.search_messages(query_string).each do |msg|
65
+ yield(
66
+ Message.new(
67
+ msg: msg,
68
+ db: db
69
+ ))
70
+ end
71
+ end
72
+
73
+ def add_filter_from_string(string)
74
+ @query << Token.new(current_conjuction, :direct, string, self)
75
+ end
76
+
77
+ def add_filter_from_hash(hash)
78
+ group = TokenGroup.new(current_conjuction, [], self)
79
+ hash.each do |key, value|
80
+ group.push_token(key, value)
81
+ end
82
+ @query << group
83
+ end
84
+
85
+ def query_string
86
+ string_from_filters = query.map(&:to_query).join(' ')
87
+ if only_new
88
+ "tag:new AND (#{string_from_filters})"
89
+ else
90
+ string_from_filters
91
+ end
92
+ end
93
+
94
+ def next_token_id
95
+ @token_count += 1
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chotto
4
+ RuleSet = Struct.new(:name, :db, :only_new, :rule) do
5
+ def messages
6
+ Messages.new(db: db, only_new: only_new)
7
+ end
8
+
9
+ def run
10
+ instance_eval(&rule)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chotto
4
+ Token = Struct.new(:conjuction, :field, :value, :messages) do
5
+ def to_query
6
+ conjuction_to_use = messages.next_token_id > 1 ? conjuction : ''
7
+ return "#{conjuction_to_use} (#{value})" if field == :direct
8
+
9
+ "#{conjuction_to_use} (#{field}:#{value})"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chotto
4
+ TokenGroup = Struct.new(:conjuction, :tokens, :messages) do
5
+ def initialize(*)
6
+ super
7
+ end
8
+
9
+ def to_query
10
+ tokens.flat_map(&:to_query).join(' ').to_s
11
+ end
12
+
13
+ def push_token(field, value)
14
+ if value.is_a? String
15
+ tokens.push(Token.new(conjuction, field, value, messages))
16
+ elsif value.is_a? Array
17
+ group = TokenGroup.new(OR_CONJUCTION, [], messages)
18
+ value.each do |val|
19
+ group.push_token(field, val)
20
+ end
21
+ tokens.push group
22
+
23
+ end
24
+ end
25
+
26
+ def next_token_id
27
+ @token_count += 1
28
+ end
29
+ end
30
+ end
metadata CHANGED
@@ -1,24 +1,47 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chotto
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - mms
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2024-11-27 00:00:00.000000000 Z
12
- dependencies: []
13
- description:
11
+ date: 2024-11-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '3'
27
+ description: Initial tagging script for Notmuch
14
28
  email: chotto@sapka.me
15
29
  executables:
16
30
  - chotto
17
31
  extensions: []
18
32
  extra_rdoc_files: []
19
33
  files:
20
- - bin/chotto
34
+ - exe/chotto
21
35
  - lib/chotto.rb
36
+ - lib/chotto/config.rb
37
+ - lib/chotto/database.rb
38
+ - lib/chotto/helpers.rb
39
+ - lib/chotto/message.rb
40
+ - lib/chotto/message_thread.rb
41
+ - lib/chotto/messages.rb
42
+ - lib/chotto/ruleset.rb
43
+ - lib/chotto/token.rb
44
+ - lib/chotto/token_group.rb
22
45
  homepage: https://crys.site/projects/chotto
23
46
  licenses:
24
47
  - BSD-3-Clause
@@ -39,8 +62,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
39
62
  - !ruby/object:Gem::Version
40
63
  version: '0'
41
64
  requirements: []
42
- rubygems_version: 3.5.16
65
+ rubygems_version: 3.5.23
43
66
  signing_key:
44
67
  specification_version: 4
45
- summary: Initial tagging script for Notmuch
68
+ summary: chotto-0.1.1
46
69
  test_files: []
File without changes