locasms 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 061caed197edecf988387ffa2f5145f4cc9249d6
4
- data.tar.gz: 04d6e7039d8e83261e83d4575e88e74a65cce055
2
+ SHA256:
3
+ metadata.gz: 39596e51a28908193ac0455bf97fb1c703becaedc33c569fe509e1ce450a6e70
4
+ data.tar.gz: f4a5d880167d667f952ebd75f68116b4dcfda9da03579d9a2b4bca87f735b1ac
5
5
  SHA512:
6
- metadata.gz: 69d4f764660e36d5cfa3745d944fab97405a92227d9990c4be889f2280f288b96bed3e2e2d6ea4cb82b04998b126495514a588630b5a370da15bf2506ff908d3
7
- data.tar.gz: 57ca434f3d72c864e63b201162f11fd7b3d7de6ae1a4b545f3baf1b9c5998d63e35d6192be51af4e80e3095e9490d168e7b5be746d30ba6353064042dfbec961
6
+ metadata.gz: '028885bb02e34a3f5bb918e805795e24e62a1f7d9bd18acc81bafb53e824502b263128b159c75af90d06d5764b210cd0fc01968d865cfed31a89bf1041fbdbd6'
7
+ data.tar.gz: 56ca283b83035314141fadcf0b48cedbf875176822c5ca159c99c7a70857260cfe9c3a8284f0ddcd8fe9b147edd4f4a3f91542df4107c683a1f1d2e1a87f3422
@@ -0,0 +1,6 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ require: rubocop-rspec
4
+
5
+ AllCops:
6
+ NewCops: enable
@@ -0,0 +1,30 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2020-10-15 23:34:33 UTC using RuboCop version 0.93.1.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 8
10
+ # Configuration parameters: CountComments, CountAsOne, ExcludedMethods.
11
+ # ExcludedMethods: refine
12
+ Metrics/BlockLength:
13
+ Max: 171
14
+
15
+ # Offense count: 1
16
+ # Configuration parameters: CountComments, CountAsOne, ExcludedMethods.
17
+ Metrics/MethodLength:
18
+ Max: 27
19
+
20
+ # Offense count: 1
21
+ # Configuration parameters: CountKeywordArgs.
22
+ Metrics/ParameterLists:
23
+ Max: 13
24
+
25
+ # Offense count: 1
26
+ # Cop supports --auto-correct.
27
+ # Configuration parameters: AutoCorrect, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
28
+ # URISchemes: http, https
29
+ Layout/LineLength:
30
+ Max: 179
@@ -1,10 +1,17 @@
1
1
  language: ruby
2
2
  rvm:
3
+ - 2.7
4
+ - 2.6
3
5
  - 2.5
4
6
  - 2.4
5
- - 2.3
6
- - 2.2
7
- - 2.1
8
7
  env:
9
8
  - TRAVIS=true
10
- before_install: gem install bundler -v 1.15.4
9
+ before_script:
10
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
11
+ - chmod +x ./cc-test-reporter
12
+ - ./cc-test-reporter before-build
13
+ script:
14
+ - bundle exec rspec
15
+ - bundle exec rubocop
16
+ after_script:
17
+ - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in locasms.gemspec
data/Guardfile CHANGED
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  guard 'rspec' do
2
4
  watch(%r{^spec/.+_spec\.rb})
3
5
  watch(%r{^lib/(.+)\.rb}) { |m| "spec/#{m[1]}_spec.rb" }
4
- watch('spec/spec_helper.rb') { "spec" }
5
- end
6
+ watch('spec/spec_helper.rb') { 'spec' }
7
+ end
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # locasms
2
- [![Gem Version](https://badge.fury.io/rb/locasms.svg)](http://badge.fury.io/rb/locasms) [![Build Status](https://travis-ci.org/mcorp/locasms.png?branch=master)](https://travis-ci.org/mcorp/locasms) [![Code Climate](https://codeclimate.com/github/mcorp/locasms.png)](https://codeclimate.com/github/mcorp/locasms) [![Inline docs](http://inch-ci.org/github/mcorp/locasms.svg?branch=master)](http://inch-ci.org/github/mcorp/locasms)
2
+ [![Gem Version](https://badge.fury.io/rb/locasms.svg)](http://badge.fury.io/rb/locasms) [![Build Status](https://travis-ci.org/mcorp/locasms.png?branch=master)](https://travis-ci.org/mcorp/locasms) [![Code Climate](https://api.codeclimate.com/v1/badges/4187ea939aabd3b66bf7/maintainability)](https://codeclimate.com/github/mcorp/locasms) [![CC Coverage](https://api.codeclimate.com/v1/badges/4187ea939aabd3b66bf7/test_coverage)](https://codeclimate.com/github/mcorp/locasms/test_coverage) [![Inline docs](http://inch-ci.org/github/mcorp/locasms.svg?branch=master)](http://inch-ci.org/github/mcorp/locasms)
3
3
 
4
4
  > :warning: After `February, 10, 2018` the base IP of the service will change as noticed on this [issue](https://github.com/mcorp/locasms/issues/21). If you don't upgrade to version `0.3.1` your app will stop delivering SMS.
5
5
 
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rubygems'
2
4
  require 'bundler'
3
5
 
@@ -14,4 +16,4 @@ task :console do
14
16
  sh 'bundle exec irb -rubygems -I lib -r locasms.rb'
15
17
  end
16
18
 
17
- task :default => (ENV['TRAVIS'] ? :spec : :console)
19
+ task default: (ENV['TRAVIS'] ? :spec : :console)
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ # frozen_string_literal: true
4
+
3
5
  require 'bundler/setup'
4
6
  require 'locasms'
5
7
 
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'locasms/version'
2
4
 
3
5
  autoload :CSV, 'csv'
4
6
  autoload :MultiJson, 'multi_json'
5
7
 
8
+ # Module to encapsulate implementation
6
9
  module LocaSMS
7
10
  autoload :Client, 'locasms/client'
8
11
  autoload :Exception, 'locasms/exception'
@@ -11,6 +14,7 @@ module LocaSMS
11
14
  autoload :Numbers, 'locasms/numbers'
12
15
  autoload :RestClient, 'locasms/rest_client'
13
16
 
17
+ # Module to encapsulate helpers
14
18
  module Helpers
15
19
  autoload :DateTimeHelper, 'locasms/helpers/date_time_helper'
16
20
  end
@@ -1,13 +1,14 @@
1
- module LocaSMS
1
+ # frozen_string_literal: true
2
2
 
3
+ module LocaSMS
3
4
  # Client to interact with LocaSMS API
4
5
  class Client
5
6
  # Default API "domain"
6
- DOMAIN = 'app.locasms.com.br'.freeze
7
+ DOMAIN = 'app.locasms.com.br'
7
8
 
8
9
  # Default API address
9
10
  ENDPOINT = {
10
- default: "http://#{DOMAIN}/painel/api.ashx",
11
+ default: "http://#{DOMAIN}/painel/api.ashx",
11
12
  shortcode: "http://#{DOMAIN}/shortcode/api.ashx"
12
13
  }.freeze
13
14
 
@@ -17,7 +18,7 @@ module LocaSMS
17
18
  # @param [String] password access password
18
19
  # @param [Hash] opts
19
20
  # @option opts :rest_client (RestClient) client to be used to handle http requests
20
- def initialize(login, password, opts={})
21
+ def initialize(login, password, opts = {})
21
22
  @login = login
22
23
  @password = password
23
24
  @type = opts[:type] || :default
@@ -65,20 +66,24 @@ module LocaSMS
65
66
 
66
67
  # Gets the current status of the given campaign
67
68
  # @param [String] id campaign id
68
- # @return [Array<Hash>] {campaign_id: id, delivery_id: delivery_id, enqueue_time: enqueue_time, delivery_time: delivery_time, status: status, carrier: carrier, mobile_number: mobile_number, message: message }
69
+ # @return [Array<Hash>]
70
+ # { campaign_id: id, delivery_id: delivery_id, enqueue_time: enqueue_time,
71
+ # delivery_time: delivery_time, status: status, carrier: carrier,
72
+ # mobile_number: mobile_number, message: message }
69
73
  def campaign_status(id)
70
74
  response = rest.get(:getstatus, id: id)
71
75
  begin
72
76
  CSV.new(response['data'] || '', col_sep: ';', quote_char: '"').map do |delivery_id, _, enqueue_time, _, delivery_time, _, status, _, _, carrier, mobile_number, _, message|
73
- status = if status =~ /aguardando envio/i
74
- :waiting
75
- elsif status =~ /sucesso/i
76
- :success
77
- elsif status =~ /numero invalido|nao cadastrado/i
78
- :invalid
79
- else
80
- :unknown
81
- end
77
+ status = case status
78
+ when /aguardando envio/i
79
+ waiting
80
+ when /sucesso/i
81
+ success
82
+ when /numero invalido|nao cadastrado/i
83
+ invalid
84
+ else
85
+ unknown
86
+ end
82
87
 
83
88
  {
84
89
  campaign_id: id,
@@ -91,8 +96,8 @@ module LocaSMS
91
96
  message: message
92
97
  }
93
98
  end
94
- rescue
95
- raise Exception.new 'Invalid delivery response data'
99
+ rescue StandardError
100
+ raise LocaSMS::Exception.new(message: 'Invalid delivery response data')
96
101
  end
97
102
  end
98
103
 
@@ -128,7 +133,7 @@ module LocaSMS
128
133
  numbers = Numbers.new mobiles
129
134
  return numbers.to_s unless numbers.bad?
130
135
 
131
- raise Exception("Bad numbers were given: #{numbers.bad.join(',')}")
136
+ raise LocaSMS::Exception.new(message: "Bad numbers were given: #{numbers.bad.join(',')}")
132
137
  end
133
138
  end
134
139
  end
@@ -1,7 +1,8 @@
1
- module LocaSMS
1
+ # frozen_string_literal: true
2
2
 
3
+ module LocaSMS
3
4
  # Common base exception
4
- class Exception < ::Exception
5
+ class Exception < RuntimeError
5
6
  attr_reader :raw, :action
6
7
 
7
8
  def initialize(data = {})
@@ -11,7 +12,7 @@ module LocaSMS
11
12
  super data[:message] || default_message
12
13
  end
13
14
 
14
- private
15
+ private
15
16
 
16
17
  def default_message
17
18
  nil
@@ -20,17 +21,16 @@ module LocaSMS
20
21
 
21
22
  # Raised when asked for an invalid operation
22
23
  # @see https://github.com/mcorp/locasms/wiki/A-API-de-envio#lista-das-a%C3%A7%C3%B5es-dispon%C3%ADveis
23
- class InvalidOperation < Exception
24
+ class InvalidOperation < RuntimeError
24
25
  def default_message
25
26
  'Invalid Operation'
26
27
  end
27
28
  end
28
29
 
29
30
  # Raised when the given credentials are invalid
30
- class InvalidLogin < Exception
31
+ class InvalidLogin < RuntimeError
31
32
  def default_message
32
33
  'Invalid Login'
33
34
  end
34
35
  end
35
-
36
- end
36
+ end
@@ -1,74 +1,43 @@
1
- module LocaSMS
2
- module Helpers
3
-
4
- # Helper class to handle with time parsing
5
- class DateTimeHelper
6
- # Parse a value into a time
7
- # @param [Fixnum,String,DateTime,Time,#to_time] date
8
- # @result [Time] return a parsed time
9
- #
10
- # @example
11
- #
12
- # DateTimeHelper.parse '1977-03-14 14:12:00'
13
- # # => 1977-03-14 14:12:00 -0300
14
- #
15
- # DateTimeHelper.split 227207520
16
- # # => 1977-03-14 14:12:00 -0300
17
- #
18
- def self.parse(date)
19
- date = Time.at(date) if date.is_a? Fixnum
20
- date = Time.parse(date) if date.is_a? String
21
- date = date.to_time if date.respond_to? :to_time
22
- end
23
-
24
- # Breaks a given date in date and time
25
- # @param [Fixnum,String,DateTime,Time,#to_time] date
26
- # @result [Array<String>] an array containing respectively DD/MM/YYYY and HH:MM
27
- #
28
- # @example
29
- #
30
- # DateTimeHelper.split Time.now
31
- # # => ['14/03/1977', '14:12']
32
- #
33
- # DateTimeHelper.split 227207520
34
- # # => ['14/03/1977', '14:12']
35
- #
36
- def self.split(date)
37
- parse(date).strftime('%d/%m/%Y %H:%M').split(' ')
38
- end
1
+ # frozen_string_literal: true
39
2
 
40
- # Parse a value into a time
41
- # @param [Fixnum,String,DateTime,Time,#to_time] date
42
- # @result [Time] return a parsed time
43
- #
44
- # @example
45
- #
46
- # DateTimeHelper.parse '1977-03-14 14:12:00'
47
- # # => 1977-03-14 14:12:00 -0300
48
- #
49
- # DateTimeHelper.split 227207520
50
- # # => 1977-03-14 14:12:00 -0300
51
- #
52
- def parse(date)
53
- DateTimeHelper.parse date
54
- end
3
+ module LocaSMS
4
+ module Helpers
5
+ # Helper class to handle with time parsing
6
+ class DateTimeHelper
7
+ # Parse a value into a time
8
+ # @param [Fixnum,String,DateTime,Time,#to_time] date
9
+ # @result [Time] return a parsed time
10
+ #
11
+ # @example
12
+ #
13
+ # DateTimeHelper.parse '1977-03-14 14:12:00'
14
+ # # => 1977-03-14 14:12:00 -0300
15
+ #
16
+ # DateTimeHelper.split 227207520
17
+ # # => 1977-03-14 14:12:00 -0300
18
+ #
19
+ def self.parse(date)
20
+ date = Time.at(date) if date.is_a? Integer
21
+ date = Time.parse(date) if date.is_a? String
22
+ date = date.to_time if date.respond_to? :to_time
23
+ date
24
+ end
55
25
 
56
- # Breaks a given date in date and time
57
- # @param [Fixnum,String,DateTime,Time,#to_time] date
58
- # @result [Array<String>] an array containing respectively DD/MM/YYYY and HH:MM
59
- #
60
- # @example
61
- #
62
- # DateTimeHelper.split Time.now
63
- # # => ['14/03/1977', '14:12']
64
- #
65
- # DateTimeHelper.split 227207520
66
- # # => ['14/03/1977', '14:12']
67
- #
68
- def split(date)
69
- DateTimeHelper.split date
26
+ # Breaks a given date in date and time
27
+ # @param [Fixnum,String,DateTime,Time,#to_time] date
28
+ # @result [Array<String>] an array containing respectively DD/MM/YYYY and HH:MM
29
+ #
30
+ # @example
31
+ #
32
+ # DateTimeHelper.split Time.now
33
+ # # => ['14/03/1977', '14:12']
34
+ #
35
+ # DateTimeHelper.split 227207520
36
+ # # => ['14/03/1977', '14:12']
37
+ #
38
+ def self.split(date)
39
+ parse(date).strftime('%d/%m/%Y %H:%M').split(' ')
40
+ end
70
41
  end
71
42
  end
72
-
73
43
  end
74
- end
@@ -1,5 +1,6 @@
1
- module LocaSMS
1
+ # frozen_string_literal: true
2
2
 
3
+ module LocaSMS
3
4
  # Class that sanitizes and validates a list of mobile's numbers
4
5
  class Numbers
5
6
  attr_reader :good, :bad
@@ -9,15 +10,16 @@ module LocaSMS
9
10
  # @see #normalize
10
11
  # @see #evaluate
11
12
  def initialize(*numbers)
12
- evaluated = evaluate(numbers)
13
- @good, @bad = evaluated[:good], evaluated[:bad]
13
+ evaluated = evaluate(numbers)
14
+ @good = evaluated[:good]
15
+ @bad = evaluated[:bad]
14
16
  end
15
17
 
16
18
  # Checks if there are bad numbers
17
19
  # @return [TrueClass, FalseClass] true if there are bad numbers
18
20
  # @see #valid_number?
19
21
  def bad?
20
- not bad.empty?
22
+ !bad.empty?
21
23
  end
22
24
 
23
25
  # Clears all non digits from a mobile's number and converts into a normalized array
@@ -34,17 +36,19 @@ module LocaSMS
34
36
  # numbers.normalize '8888-9999', ['AA', '6666-9999', '7777-0000'], '3333-4444,555-9999'
35
37
  # # => ['88889999','AA','66669999','77770000','33334444','5559999']
36
38
  def normalize(*numbers)
37
- numbers = numbers.join(',')
39
+ numbers
40
+ .join(',')
38
41
  .split(',')
39
- .map{|number| number.gsub(/[^0-9a-zA-Z]/, '') }
40
- .delete_if{|number| number.empty? }
42
+ .map { |number| number.gsub(/[^0-9a-zA-Z]/, '') }
43
+ .delete_if(&:empty?)
41
44
  end
42
45
 
43
46
  # Validates if a mobile's number has only digits
44
47
  # @param [String] number given number to be validated
45
48
  # @return [TrueClass, FalseClass] true if the number is valid
46
49
  def valid_number?(number)
47
- return false if number.nil? or number =~ /[^0-9a-zA-Z]/
50
+ return false if number.nil? || number =~ (/[^0-9a-zA-Z]/)
51
+
48
52
  [10, 11].include? number.size
49
53
  end
50
54
 
@@ -63,10 +67,9 @@ module LocaSMS
63
67
  # Numbers.new.evaluate('4199998888','11777770000','5551212')
64
68
  # #=> {good: ['4199998888','11777770000'], bad: ['5551212']}
65
69
  def evaluate(*numbers)
66
- normalize(numbers).reduce({good: [], bad: []}) do |hash, number|
70
+ normalize(numbers).each_with_object({ good: [], bad: [] }) do |number, hash|
67
71
  bucket = valid_number?(number) ? :good : :bad
68
72
  hash[bucket] << number
69
- hash
70
73
  end
71
74
  end
72
75
 
@@ -76,5 +79,4 @@ module LocaSMS
76
79
  (good || []).join(',')
77
80
  end
78
81
  end
79
-
80
- end
82
+ end
@@ -1,17 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'json'
2
4
  require 'net/http'
3
5
 
4
6
  module LocaSMS
5
-
6
7
  # Class that handle http calls to LocaSMS api
7
- # @see https://github.com/mcorp/locasms/wiki/A-API-de-envio List of avaiable services
8
+ # @see https://github.com/mcorp/locasms/wiki/A-API-de-envio
9
+ # List of avaiable services
8
10
  class RestClient
9
11
  attr_accessor :base_url, :base_params
10
12
 
11
13
  # Creates a new instance of the RestClient class
12
14
  # @param [String] base_url a well formed url
13
15
  # @param [Hash] base_params base params to send on every call
14
- def initialize(base_url, base_params={})
16
+ def initialize(base_url, base_params = {})
15
17
  @base_url = base_url
16
18
  @base_params = base_params
17
19
  end
@@ -35,11 +37,12 @@ module LocaSMS
35
37
  # client.get :holdsms, id: 345678
36
38
  # # => {"status"=>1,"data"=>nil,"msg"=>"SUCESSO"}
37
39
  #
38
- # @see https://github.com/mcorp/locasms/wiki/A-API-de-envio#lista-das-a%C3%A7%C3%B5es-dispon%C3%ADveis List of avaiable actions
40
+ # @see https://github.com/mcorp/locasms/wiki/A-API-de-envio#lista-das-a%C3%A7%C3%B5es-dispon%C3%ADveis
41
+ # List of avaiable actions
39
42
  # @raise [LocaSMS::InvalidOperation] when asked for an invalid operation
40
43
  # @raise [LocaSMS::InvalidLogin] when the given credentials are invalid
41
- def get(action, params={})
42
- params = params_for action, params
44
+ def get(action, params = {})
45
+ params = params_for action, params
43
46
 
44
47
  uri = URI.parse(base_url)
45
48
  uri.query = URI.encode_www_form(params)
@@ -59,9 +62,10 @@ module LocaSMS
59
62
  # client.params_for :ACTION, a: 1, b: 2
60
63
  # # => { action: :ACTION, lgn: 'LOGIN', pwd: 'PASSWORD', a: 1, b: 2 }
61
64
  #
62
- # @see https://github.com/mcorp/locasms/wiki/A-API-de-envio#lista-das-a%C3%A7%C3%B5es-dispon%C3%ADveis List of avaiable actions
63
- def params_for(action, params={})
64
- { action: action }.merge(base_params).merge(params).select {|k, v| v }
65
+ # @see https://github.com/mcorp/locasms/wiki/A-API-de-envio#lista-das-a%C3%A7%C3%B5es-dispon%C3%ADveis
66
+ # List of avaiable actions
67
+ def params_for(action, params = {})
68
+ { action: action }.merge(base_params).merge(params).select { |_k, v| v }
65
69
  end
66
70
 
67
71
  # Parses a result trying to get it in json
@@ -73,13 +77,17 @@ module LocaSMS
73
77
  def parse_response(action, response)
74
78
  raise InvalidOperation.new(action: action) if response =~ /^0:OPERACAO INVALIDA$/i
75
79
 
76
- j = MultiJson.load(response) rescue { 'status' => 1, 'data' => response, 'msg' => nil }
80
+ j = begin
81
+ MultiJson.load(response)
82
+ rescue StandardError
83
+ { 'status' => 1, 'data' => response, 'msg' => nil }
84
+ end
77
85
 
78
- return j if j['status'] == 1 or action == :getstatus
86
+ return j if (j['status'] == 1) || (action == :getstatus)
79
87
 
80
88
  raise InvalidLogin.new(action: action) if j['msg'] =~ /^falha ao realizar login$/i
81
- raise Exception.new(message: j['msg'], raw: response, action: action)
89
+
90
+ raise LocaSMS::Exception.new(message: j['msg'], raw: response, action: action)
82
91
  end
83
92
  end
84
-
85
93
  end