twi 0.6.0 → 0.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6f15688c986ff6cfb45fb8f72e76934b1c02ea597ee7925c9bf832fd00e3adef
4
- data.tar.gz: 8ed7d2d7baca898202a9b030c1b6d493dd1a11ac7fd25671f41268322a4a4a9a
3
+ metadata.gz: e1f97b3f51774f71277566ba6e50329a019493a1a8f36578aeb1079ae6fe0da1
4
+ data.tar.gz: 0bc82156d7cd71fd36a62bdf6595146424ba553fb0033981f7eea3d0d227e101
5
5
  SHA512:
6
- metadata.gz: ab513b054afb8ca7d41d891d6de3faf0d004af9487b6d288cfd4fe80c2c29570c3f897b7b118be789d679ba5af139df69657baba9476ee6ac462e6b43442d490
7
- data.tar.gz: 4361b2fded185f6456fef30b71da30a14dfde0a17032586fd81a58155d27f87a43aadbf0c7943c5b2c5eef7f3c5b294cf591abcdacf86ee961f49deac9d84d40
6
+ metadata.gz: 3f2b6f37100f53f86b3f2b7792c15591e2d60d7cb6d9e5d1658862d2af84446d5590ba67846f6c26c788038cc43592f41e0ef01c0f39f8cb72f51fde389c6277
7
+ data.tar.gz: 00ed8b8c2b73e63547942266681009205140046043b84a75488d41cd91997ae563e42e40084bf74cea037a0fe3b1580dc74cdcd03f237dd84dcdf22e73c53865
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## [0.8.0] - 2026-09-11
2
+
3
+ - [New] Send media with a message: `Twi.create_message media_url:` carries it as an MMS
4
+ - [New] Record what was sent on Twi.mock.messages, so a suite can assert it
5
+
6
+ ## [0.7.0] - 2026-08-19
7
+
8
+ - [New] Add Twi.reset_mock, to stop a mocked answer outliving the test that arranged it
9
+ - [Fix] Answer an unarranged Twi::Mock::Conversation#create_with, as Message#create does
10
+
1
11
  ## [0.6.0] - 2026-07-27
2
12
 
3
13
  - [Fix] Remove proxy_address from conversation participant
data/lib/twi/message.rb CHANGED
@@ -40,8 +40,7 @@ module Twi
40
40
 
41
41
  # Sends a message.
42
42
  def create
43
- message = api_client.messages.create messaging_service_sid: Twi.lio.messaging_sid.to_s,
44
- from: "+1#{@params[:sender]}", to: "+1#{@params[:recipient]}", body: @params[:content]
43
+ message = api_client.messages.create **create_params
45
44
 
46
45
  @params = { 'MessageSid' => message.sid }
47
46
  @id = message.sid
@@ -62,6 +61,17 @@ module Twi
62
61
 
63
62
  private
64
63
 
64
+ # Twilio fetches whatever `media_url` names and carries it as an MMS, so a vCard among
65
+ # them arrives as a contact card the reader can save rather than a link they must open.
66
+ # @return [Hash] the arguments Twilio takes for one outbound message.
67
+ def create_params
68
+ media = Array @params[:media_url]
69
+
70
+ { messaging_service_sid: Twi.lio.messaging_sid.to_s, from: "+1#{@params[:sender]}",
71
+ to: "+1#{@params[:recipient]}", body: @params[:content] }
72
+ .merge(media.any? ? { media_url: media } : {})
73
+ end
74
+
65
75
  def self.media_params_for(media = [])
66
76
  media.each_with_index.inject({ NumMedia: media.size.to_s }) do |hash, (item, index)|
67
77
  url_key = "MediaUrl#{index}".to_sym
@@ -9,6 +9,8 @@ module Twi
9
9
  end
10
10
  elsif Twi.mock.conversation
11
11
  @params = { id: Twi.mock.conversation[:id], status: Twi.mock.conversation[:status] }
12
+ else
13
+ @params = { id: "CH#{rand}", status: 'initializing' }
12
14
  end
13
15
  end
14
16
 
@@ -7,6 +7,8 @@ module Twi
7
7
  def sid = @params[:id]
8
8
 
9
9
  def create
10
+ Twi.mock.messages << @params.slice(:sender, :recipient, :content, :media_url)
11
+
10
12
  if error = Twi.mock.message_error
11
13
  Twi.mock.message_error = nil
12
14
  raise Error, error
data/lib/twi/mock.rb CHANGED
@@ -4,5 +4,8 @@ module Twi
4
4
  attr_accessor :message, :message_error
5
5
  attr_accessor :conversation, :conversation_error
6
6
  attr_accessor :medium
7
+
8
+ # @return [Array<Hash>] every message sent since the mock was reset, in order.
9
+ def messages = @messages ||= []
7
10
  end
8
11
  end
data/lib/twi/mocking.rb CHANGED
@@ -4,6 +4,13 @@ module Twi
4
4
  @mock ||= Twi::Mock.new
5
5
  end
6
6
 
7
+ # Forgets every answer arranged so far and starts mocking again from nothing.
8
+ # A test suite calls this before each test: the mock lives on the module, so
9
+ # without it one test answers for the next.
10
+ def reset_mock
11
+ @mock = Twi::Mock.new
12
+ end
13
+
7
14
  def create_phone(...)
8
15
  phone(...).tap &:create
9
16
  end
data/lib/twi/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Twi
4
- VERSION = '0.6.0'
4
+ VERSION = '0.8.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Claudio Baccigalupo