attentive 0.1.0.beta1 → 0.1.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
2
  SHA1:
3
- metadata.gz: e5d4df859acd5086ec5d8144696af41186bdc33f
4
- data.tar.gz: 2d5d5fb36e14abd9c2ae64e5cc42407238f97550
3
+ metadata.gz: 5f08339af1a0af46d0ed601f66c0fa93196d3921
4
+ data.tar.gz: 77b5040ac0c4b37a9dad94a60e7e8d196f9718ea
5
5
  SHA512:
6
- metadata.gz: f96291d7ea9b07676a59a958c6a42cc7ef5fad0e0f96a21eba177c6a7c763b052d49dd032f82431612bf89ee75dc9cfb1e068eab8ea1f797878b92d77488be4f
7
- data.tar.gz: 626d7dc7de65850872234c5baa4ad921a2d661d5d50dc9e54539435dff1d1dc5b628413a86134ae2d680a1e88e794eed7bd1ea1dcb5dcafc96303819586f415b
6
+ metadata.gz: 5d81240212f8cef0eeaf6f69f3cbf1512b3870dc11e8205555384b2bbb1584717b8f23795ad1d38de1fbd486c3d34e4090d143f37f31ce8ac5d82268cc327565
7
+ data.tar.gz: 34dff8d29cc4b5b1f674a29032dabcd9d0bbd50068616ea2fe9e09e0ae05f77818d94ddaa431363f4aeedcf2a5348256f4dddd57cd296f46a40a4ccf954cb123
data/README.md CHANGED
@@ -4,6 +4,8 @@ Welcome to your new gem! In this directory, you'll find the files you need to be
4
4
 
5
5
  TODO: Delete this and the text above, and describe your gem
6
6
 
7
+
8
+
7
9
  ## Installation
8
10
 
9
11
  Add this line to your application's Gemfile:
@@ -20,9 +22,21 @@ Or install it yourself as:
20
22
 
21
23
  $ gem install attentive
22
24
 
25
+
26
+
23
27
  ## Usage
24
28
 
25
- TODO: Write usage instructions here
29
+ ```ruby
30
+ include Attentive
31
+
32
+ listen_for "hi there!" do
33
+ puts "heard greeting"
34
+ end
35
+
36
+ hear "hi, there :wink:"
37
+ ```
38
+
39
+
26
40
 
27
41
  ## Development
28
42
 
@@ -30,12 +44,14 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
30
44
 
31
45
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
46
 
47
+
48
+
33
49
  ## Contributing
34
50
 
35
51
  Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/attentive.
36
52
 
37
53
 
54
+
38
55
  ## License
39
56
 
40
57
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
41
-
data/Rakefile CHANGED
@@ -7,4 +7,63 @@ Rake::TestTask.new(:test) do |t|
7
7
  t.test_files = FileList['test/**/*_test.rb']
8
8
  end
9
9
 
10
+ namespace :compile do
11
+
12
+ desc "Compile contractions.rb and abbreviations.rb"
13
+ task :data do
14
+
15
+ data_path = File.expand_path(File.dirname(__FILE__) + "/data")
16
+ output_path = File.expand_path(File.dirname(__FILE__) + "/lib/attentive")
17
+
18
+ contractions = {}
19
+ File.open(data_path + "/contractions.tsv") do |file|
20
+ file.each do |line|
21
+ next if line.start_with?("#") # skip comments
22
+ next if line == "\n" # skip blank lines
23
+
24
+ # the file contains tab-separated values.
25
+ # the first value is the contraction.
26
+ # the remaining values are possible phrases that match it
27
+ phrases = line.downcase.chomp.split("\t")
28
+ raise "#{line.inspect} must have exactly two values" unless phrases.length >= 2
29
+
30
+ contractions[phrases.shift] = phrases
31
+ end
32
+ end
33
+ File.open(output_path + "/contractions.rb", "w") do |file|
34
+ file.write <<-RUBY
35
+ module Attentive
36
+ CONTRACTIONS = #{contractions.inspect}.freeze
37
+ end
38
+ RUBY
39
+ end
40
+
41
+ abbreviations = {}
42
+ File.open(data_path + "/abbreviations.tsv") do |file|
43
+ file.each do |line|
44
+ next if line.start_with?("#") # skip comments
45
+ next if line == "\n" # skip blank lines
46
+
47
+ # the file contains tab-separated values.
48
+ # every line should have exactly two values:
49
+ # + the first is the slang word
50
+ # + the second is the normal word
51
+ words = line.downcase.chomp.split("\t")
52
+ raise "#{line.inspect} must have exactly two values" unless words.length == 2
53
+
54
+ abbreviations[words[0]] = words[1]
55
+ end
56
+ end
57
+ File.open(output_path + "/abbreviations.rb", "w") do |file|
58
+ file.write <<-RUBY
59
+ module Attentive
60
+ ABBREVIATIONS = #{abbreviations.inspect}.freeze
61
+ end
62
+ RUBY
63
+ end
64
+
65
+ end
66
+
67
+ end
68
+
10
69
  task :default => :spec
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
13
13
  spec.homepage = "https://github.com/houston/attentive"
14
14
  spec.license = "MIT"
15
15
 
16
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(data|test|spec|features)/}) }
17
17
  spec.bindir = "exe"
18
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
19
  spec.require_paths = ["lib"]
@@ -1,8 +1,14 @@
1
1
  require "attentive/version"
2
- require "attentive/listener_collection"
3
- require "attentive/message"
2
+ require "attentive/config"
4
3
 
5
4
  module Attentive
5
+ extend Attentive::Config
6
+
7
+ # Default configuration
8
+ self.invocations = ["@me".freeze]
9
+
10
+
11
+ # Attentive DSL
6
12
 
7
13
  def listeners
8
14
  @listeners ||= Attentive::ListenerCollection.new
@@ -18,3 +24,6 @@ module Attentive
18
24
  end
19
25
 
20
26
  end
27
+
28
+ require "attentive/listener_collection"
29
+ require "attentive/message"
@@ -0,0 +1,3 @@
1
+ module Attentive
2
+ ABBREVIATIONS = {"bye"=>"goodbye", "gonna"=>"going to", "hi"=>"hello", "ol'"=>"old", "'sup"=>"what is up", "thanks"=>"thank you", "wanna"=>"want to", "mon"=>"monday", "tue"=>"tuesday", "tues"=>"tuesday", "wed"=>"wednesday", "thu"=>"thursday", "thur"=>"thursday", "thurs"=>"thursday", "fri"=>"friday", "sat"=>"saturday", "sun"=>"sunday"}.freeze
3
+ end
@@ -0,0 +1,11 @@
1
+ module Attentive
2
+ module Config
3
+
4
+ attr_reader :invocations
5
+
6
+ def invocations=(*values)
7
+ @invocations = values.flatten
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module Attentive
2
+ CONTRACTIONS = {"ain't"=>["am not"], "aren't"=>["are not"], "can't"=>["can not"], "cannot"=>["can not"], "could've"=>["could have"], "couldn't"=>["could not"], "couldn't've"=>["could not have"], "didn't"=>["did not"], "doesn't"=>["does not"], "don't"=>["do not"], "hadn't"=>["had not"], "hadn't've"=>["had not have"], "hasn't"=>["has not"], "haven't"=>["have not"], "he'd"=>["he had", "he would"], "he'd've"=>["he would have"], "he'll"=>["he will", "he shall"], "he's"=>["he is", "he has"], "he'sn't"=>["he is not", "he has not"], "how'd"=>["how did", "how would"], "how'll"=>["how will"], "how's"=>["how is", "how has", "how does"], "i'd"=>["i would", "i had"], "i'd've"=>["i would have"], "i'll"=>["i shall", "i will"], "i'm"=>["i am"], "i've"=>["i have"], "i'ven't"=>["i have not"], "isn't"=>["is not"], "it'd"=>["it would", "it had"], "it'd've"=>["it would have"], "it'll"=>["it will", "it shall"], "it's"=>["it is", "it has"], "it'sn't"=>["it is not", "it has not"], "let's"=>["let us"], "ma'am"=>["madam"], "mightn't"=>["might not"], "mightn't've"=>["might not have"], "might've"=>["might have"], "mustn't"=>["must not"], "must've"=>["must have"], "needn't"=>["need not"], "not've"=>["not have"], "o'clock"=>["of the clock"], "oughtn't"=>["ought not"], "shan't"=>["shall not"], "she'd"=>["she had", "she would"], "she'd've"=>["she would have"], "she'll"=>["she shall", "she will"], "she's"=>["she is", "she has"], "she'sn't"=>["she is not", "she has not"], "should've"=>["should have"], "shouldn't"=>["should not"], "shouldn't've"=>["should not have"], "somebody'd"=>["somebody had", "somebody would"], "somebody'd've"=>["somebody would have"], "somebody'dn't've"=>["somebody would not have"], "somebody'll"=>["somebody shall", "somebody will"], "somebody's"=>["somebody is", "somebody has"], "someone'd"=>["someone had", "someone would"], "someone'd've"=>["someone would have"], "someone'll"=>["someone shall", "someone will"], "someone's"=>["someone is", "someone has"], "something'd"=>["something had", "something would"], "something'd've"=>["something would have"], "something'll"=>["something shall", "something will"], "something's"=>["something is", "something has"], "that'll"=>["that will"], "that's"=>["that is", "that has"], "there'd"=>["there had", "there would"], "there'd've"=>["there would have"], "there're"=>["there are"], "there's"=>["there is", "there has"], "they'd"=>["they would", "they had"], "they'dn't"=>["they would not"], "they'dn't've"=>["they would not have"], "they'd've"=>["they would have"], "they'd'ven't"=>["they would have not"], "they'll"=>["they shall", "they will"], "they'lln't've"=>["they will not have"], "they'll'ven't"=>["they will have not"], "they're"=>["they are"], "they've"=>["they have"], "they'ven't"=>["they have not"], "'tis"=>["it is"], "'twas"=>["it was"], "wasn't"=>["was not"], "we'd"=>["we had", "we would"], "we'd've"=>["we would have"], "we'dn't've"=>["we would not have"], "we'll"=>["we will"], "we'lln't've"=>["we will not have"], "we're"=>["we are"], "we've"=>["we have"], "weren't"=>["were not"], "what'll"=>["what shall", "what will"], "what're"=>["what are"], "what's"=>["what is", "what does", "what has"], "what've"=>["what have"], "when's"=>["when is", "when has"], "where'd"=>["where did"], "where's"=>["where is", "where does", "where has"], "where've"=>["where have"], "who'd"=>["who would", "who had"], "who'd've"=>["who would have"], "who'll"=>["who shall", "who will"], "who're"=>["who are"], "who's"=>["who is", "who has"], "who've"=>["who have"], "why'll"=>["why will"], "why're"=>["why are"], "why's"=>["why is", "why has"], "won't"=>["will not"], "won't've"=>["will not have"], "would've"=>["would have"], "wouldn't"=>["would not"], "wouldn't've"=>["would not have"], "y'all"=>["you all"], "y'all'd've"=>["you all would have"], "y'all'dn't've"=>["you all would not have"], "y'all'll"=>["you all will"], "y'all'lln't"=>["you all will not"], "y'all'll've"=>["you all will have"], "y'all'll'ven't"=>["you all will have not"], "you'd"=>["you had", "you would"], "you'd've"=>["you would have"], "you'll"=>["you shall", "you will"], "you're"=>["you are"], "you'ren't"=>["you are not"], "you've"=>["you have"], "you'ven't"=>["you have not"]}.freeze
3
+ end
@@ -27,7 +27,7 @@ Attentive::Entity.define :"relative-date",
27
27
  when /^thu/ then next_wday[4]
28
28
  when /^fri/ then next_wday[5]
29
29
  when /^sat/ then next_wday[6]
30
- else raise NotImplementedError, "Unrecognize weekday: #{weekday.inspect}"
30
+ else raise NotImplementedError, "Unrecognized weekday: #{weekday.inspect}"
31
31
  end
32
32
 
33
33
  date += 7 if match.to_s.start_with?("next")
@@ -38,7 +38,7 @@ Attentive::Entity.define :"relative-date",
38
38
  when "today" then today
39
39
  when "tomorrow" then today + 1
40
40
  when "yesterday" then today - 1
41
- else raise NotImplementedError, "Unrecognize match: #{match.inspect}"
41
+ else raise NotImplementedError, "Unrecognized match: #{match.to_s}"
42
42
  end
43
43
  end
44
44
  end
@@ -37,7 +37,7 @@ module Attentive
37
37
 
38
38
 
39
39
  def initialize(variable_name, pos=0)
40
- @variable_name = variable_name.to_sym
40
+ @variable_name = variable_name.to_s
41
41
  super pos
42
42
  end
43
43
 
@@ -6,10 +6,7 @@ module Attentive
6
6
  class Listener
7
7
  attr_reader :phrases
8
8
 
9
- def initialize(listeners, args, callback)
10
- options = args.last.is_a?(::Hash) ? args.pop : {}
11
-
12
- # Ugh!
9
+ def initialize(listeners, phrases, options, callback)
13
10
  context_options = options.fetch(:context, {})
14
11
  @required_contexts = context_options.fetch(:in, %i{conversation})
15
12
  @required_contexts = [] if @required_contexts == :any
@@ -18,8 +15,8 @@ module Attentive
18
15
  @prohibited_contexts = Set[*@prohibited_contexts]
19
16
 
20
17
  @listeners = listeners
18
+ @phrases = tokenize_phrases!(phrases)
21
19
  @callback = callback
22
- @phrases = tokenize_phrases!(args)
23
20
  end
24
21
 
25
22
  def matches_context?(message)
@@ -47,7 +44,6 @@ module Attentive
47
44
  end
48
45
 
49
46
  def tokenize_phrase!(phrase)
50
- # should this be {regexps: false}?
51
47
  Attentive::Tokenizer.tokenize(phrase, entities: true, regexps: true, ambiguous: false)
52
48
  end
53
49
 
@@ -1,3 +1,4 @@
1
+ require "attentive"
1
2
  require "thread_safe"
2
3
  require "delegate"
3
4
  require "attentive/cursor"
@@ -12,19 +13,13 @@ module Attentive
12
13
  end
13
14
 
14
15
  def listen_for(*args, &block)
15
- Listener.new(self, args, block).tap do |listener|
16
- push listener
17
- end
18
- end
16
+ options = args.last.is_a?(::Hash) ? args.pop : {}
19
17
 
20
- def overhear(*args, &block)
21
- Listener.new(self, args, block).tap do |listener|
18
+ Attentive::Listener.new(self, args, options, block).tap do |listener|
22
19
  push listener
23
20
  end
24
21
  end
25
22
 
26
-
27
-
28
23
  def hear(message)
29
24
  listeners = select { |listener| listener.matches_context?(message) }
30
25
 
@@ -33,8 +28,12 @@ module Attentive
33
28
  message.tokens.each_with_index do |token, i|
34
29
  listeners.each do |listener|
35
30
  listener.phrases.each do |phrase|
36
- match = Attentive::Matcher.new(phrase, Cursor.new(message.tokens, i)).match!
37
- matches.push match if match
31
+ match = Attentive::Matcher.new(phrase, Cursor.new(message.tokens, i), listener: listener, message: message).match!
32
+ next unless match
33
+
34
+ # Don't match more than one phrase per listener
35
+ matches.push match
36
+ break
38
37
  end
39
38
  end
40
39
  end
@@ -1,17 +1,20 @@
1
1
  module Attentive
2
2
  class Match
3
+ attr_reader :listener, :phrase, :message
3
4
 
4
5
  def initialize(phrase, attributes={})
5
6
  @phrase = phrase.to_s
6
7
  @match_data = attributes.fetch(:match_data, {})
8
+ @listener = attributes[:listener]
9
+ @message = attributes[:message]
7
10
  end
8
11
 
9
12
  def matched?(variable_name)
10
- @match_data.key?(variable_name)
13
+ @match_data.key? variable_name.to_s
11
14
  end
12
15
 
13
16
  def [](variable_name)
14
- @match_data.fetch(variable_name)
17
+ @match_data.fetch variable_name.to_s
15
18
  end
16
19
 
17
20
  def to_s
@@ -8,6 +8,7 @@ module Attentive
8
8
  @phrase = phrase
9
9
  @cursor = cursor
10
10
  @pos = params.fetch(:pos, 0)
11
+ @match_params = params.each_with_object({}) { |(key, value), new_hash| new_hash[key] = value if %i{listener message}.member?(key) }
11
12
  @pos += 1 while phrase[pos] && phrase[pos].whitespace?
12
13
  @match_data = {}
13
14
  @state = :matching
@@ -46,8 +47,10 @@ module Attentive
46
47
  end
47
48
  @pos += 1 while phrase[pos] && phrase[pos].whitespace?
48
49
  @state = :found
49
- # puts "matched #{phrase.inspect}"
50
- return Attentive::Match.new(phrase, match_data: @match_data) if pos == phrase.length
50
+
51
+
52
+ # -> This is the one spot where we instantiate a Match
53
+ return Attentive::Match.new(phrase, @match_params.merge(match_data: @match_data)) if pos == phrase.length
51
54
 
52
55
  elsif !token.skippable?
53
56
  @state = :mismatch
@@ -5,9 +5,10 @@ module Attentive
5
5
  class Message
6
6
  attr_reader :contexts, :text
7
7
 
8
- def initialize(text, params)
8
+ def initialize(text, params={})
9
9
  @text = text
10
10
  @contexts = Set.new(params.fetch(:contexts, []))
11
+ contexts << :conversation if tokens.grep(Attentive::Tokens::Invocation).any?
11
12
  end
12
13
 
13
14
  def tokens
@@ -14,44 +14,5 @@ module Attentive
14
14
  text.gsub(/[“”]/, "\"").gsub(/[‘’]/, "'")
15
15
  end
16
16
 
17
-
18
-
19
- DATA_PATH = File.expand_path(File.dirname(__FILE__) + "/../../data").freeze
20
-
21
- CONTRACTIONS = {}.tap do |contractions|
22
- File.open(DATA_PATH + "/contractions.tsv") do |file|
23
- file.each do |line|
24
- next if line.start_with?("#") # skip comments
25
- next if line == "\n" # skip blank lines
26
-
27
- # the file contains tab-separated values.
28
- # the first value is the contraction.
29
- # the remaining values are possible phrases that match it
30
- phrases = line.chomp.split("\t")
31
- raise "#{line.inspect} must have exactly two values" unless phrases.length >= 2
32
-
33
- contractions[phrases.shift] = phrases
34
- end
35
- end
36
- end.freeze
37
-
38
- SLANG = {}.tap do |slang|
39
- File.open(DATA_PATH + "/slang.tsv") do |file|
40
- file.each do |line|
41
- next if line.start_with?("#") # skip comments
42
- next if line == "\n" # skip blank lines
43
-
44
- # the file contains tab-separated values.
45
- # every line should have exactly two values:
46
- # + the first is the slang word
47
- # + the second is the normal word
48
- words = line.chomp.split("\t")
49
- raise "#{line.inspect} must have exactly two values" unless words.length == 2
50
-
51
- slang[words[0]] = words[1]
52
- end
53
- end
54
- end.freeze
55
-
56
17
  end
57
18
  end
@@ -2,7 +2,7 @@ module Attentive
2
2
  class Token
3
3
  attr_reader :pos
4
4
 
5
- def initialize(pos)
5
+ def initialize(pos=nil)
6
6
  @pos = pos
7
7
  end
8
8
 
@@ -37,7 +37,7 @@ module Attentive
37
37
  class StringToken < Token
38
38
  attr_reader :string
39
39
 
40
- def initialize(string, pos)
40
+ def initialize(string, pos=nil)
41
41
  @string = string
42
42
  super pos
43
43
  end
@@ -1,8 +1,11 @@
1
+ require "attentive/abbreviations"
2
+ require "attentive/contractions"
1
3
  require "attentive/text"
2
4
  require "attentive/tokens"
3
5
  require "attentive/phrase"
4
6
  require "attentive/errors"
5
7
 
8
+
6
9
  module Attentive
7
10
  class Tokenizer
8
11
  extend Attentive::Tokens
@@ -14,7 +17,6 @@ module Attentive
14
17
  SPLITTER = /(\n|{{|}}|\s+|\.{2,}|[^\s\w'@-])/.freeze
15
18
  PUNCTUATION = /^\W+$/.freeze
16
19
  WHITESPACE = /^\s+$/.freeze
17
- ME = "@me".freeze
18
20
  ENTITY_START = "{{".freeze
19
21
  ENTITY_END = "}}".freeze
20
22
  REGEXP_START = "(".freeze
@@ -109,14 +111,14 @@ module Attentive
109
111
  when PUNCTUATION
110
112
  tokens << punctuation(string, pos: pos)
111
113
 
112
- when ME
113
- tokens << me(pos: pos)
114
+ when *Attentive.invocations
115
+ tokens << invocation(string, pos: pos)
114
116
 
115
117
  else
116
- if replace_with = Attentive::Text::SLANG[string]
118
+ if replace_with = Attentive::ABBREVIATIONS[string]
117
119
  tokens.concat tokenize(replace_with, options)
118
120
 
119
- elsif expands_to = Attentive::Text::CONTRACTIONS[string]
121
+ elsif expands_to = Attentive::CONTRACTIONS[string]
120
122
  possibilities = expands_to.map do |possibility|
121
123
  tokenize(possibility, options)
122
124
  end
@@ -13,8 +13,8 @@ module Attentive
13
13
  Attentive::Entity[entity_name.to_sym].new(variable_name)
14
14
  end
15
15
 
16
- def me(pos: nil)
17
- Attentive::Tokens::Me.new pos
16
+ def invocation(string, pos: nil)
17
+ Attentive::Tokens::Invocation.new string, pos
18
18
  end
19
19
 
20
20
  def punctuation(string, pos: nil)
@@ -38,7 +38,7 @@ end
38
38
 
39
39
  require "attentive/tokens/any_of"
40
40
  require "attentive/tokens/emoji"
41
- require "attentive/tokens/me"
41
+ require "attentive/tokens/invocation"
42
42
  require "attentive/tokens/punctuation"
43
43
  require "attentive/tokens/regexp"
44
44
  require "attentive/tokens/whitespace"
@@ -2,10 +2,11 @@ require "attentive/token"
2
2
 
3
3
  module Attentive
4
4
  module Tokens
5
- class Me < Token
5
+ class Invocation < StringToken
6
6
 
7
- def to_s
8
- Attentive::Tokenizer::ME
7
+ # All invocations are equal
8
+ def ==(other)
9
+ self.class == other.class
9
10
  end
10
11
 
11
12
  def skippable?
@@ -1,3 +1,3 @@
1
1
  module Attentive
2
- VERSION = "0.1.0.beta1"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attentive
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.beta1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bob Lail
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-04-25 00:00:00.000000000 Z
11
+ date: 2016-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thread_safe
@@ -152,10 +152,11 @@ files:
152
152
  - attentive.gemspec
153
153
  - bin/console
154
154
  - bin/setup
155
- - data/contractions.tsv
156
- - data/slang.tsv
157
155
  - lib/attentive.rb
156
+ - lib/attentive/abbreviations.rb
158
157
  - lib/attentive/composite_entity.rb
158
+ - lib/attentive/config.rb
159
+ - lib/attentive/contractions.rb
159
160
  - lib/attentive/cursor.rb
160
161
  - lib/attentive/entities/integer.rb
161
162
  - lib/attentive/entities/relative_date.rb
@@ -173,7 +174,7 @@ files:
173
174
  - lib/attentive/tokens.rb
174
175
  - lib/attentive/tokens/any_of.rb
175
176
  - lib/attentive/tokens/emoji.rb
176
- - lib/attentive/tokens/me.rb
177
+ - lib/attentive/tokens/invocation.rb
177
178
  - lib/attentive/tokens/punctuation.rb
178
179
  - lib/attentive/tokens/regexp.rb
179
180
  - lib/attentive/tokens/whitespace.rb
@@ -194,9 +195,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
194
195
  version: '0'
195
196
  required_rubygems_version: !ruby/object:Gem::Requirement
196
197
  requirements:
197
- - - ">"
198
+ - - ">="
198
199
  - !ruby/object:Gem::Version
199
- version: 1.3.1
200
+ version: '0'
200
201
  requirements: []
201
202
  rubyforge_project:
202
203
  rubygems_version: 2.2.2
@@ -1,134 +0,0 @@
1
- # List of English Contractions
2
- # https://en.wikipedia.org/wiki/Wikipedia:List_of_English_contractions
3
-
4
- ain't am not
5
- aren't are not
6
- can't can not
7
- cannot can not
8
- could've could have
9
- couldn't could not
10
- couldn't've could not have
11
- didn't did not
12
- doesn't does not
13
- don't do not
14
- hadn't had not
15
- hadn't've had not have
16
- hasn't has not
17
- haven't have not
18
- he'd he had he would
19
- he'd've he would have
20
- he'll he will he shall
21
- he's he is he has
22
- he'sn't he is not he has not
23
- how'd how did how would
24
- how'll how will
25
- how's how is how has how does
26
- I'd I would I had
27
- I'd've I would have
28
- I'll I shall I will
29
- I'm I am
30
- I've I have
31
- I'ven't I have not
32
- isn't is not
33
- it'd it would it had
34
- it'd've it would have
35
- it'll it will it shall
36
- it's it is it has
37
- it'sn't it is not it has not
38
- let's let us
39
- ma'am madam
40
- mightn't might not
41
- mightn't've might not have
42
- might've might have
43
- mustn't must not
44
- must've must have
45
- needn't need not
46
- not've not have
47
- o'clock of the clock
48
- oughtn't ought not
49
- shan't shall not
50
- she'd she had she would
51
- she'd've she would have
52
- she'll she shall she will
53
- she's she is she has
54
- she'sn't she is not she has not
55
- should've should have
56
- shouldn't should not
57
- shouldn't've should not have
58
- somebody'd somebody had somebody would
59
- somebody'd've somebody would have
60
- somebody'dn't've somebody would not have
61
- somebody'll somebody shall somebody will
62
- somebody's somebody is somebody has
63
- someone'd someone had someone would
64
- someone'd've someone would have
65
- someone'll someone shall someone will
66
- someone's someone is someone has
67
- something'd something had something would
68
- something'd've something would have
69
- something'll something shall something will
70
- something's something is something has
71
- that'll that will
72
- that's that is that has
73
- there'd there had there would
74
- there'd've there would have
75
- there're there are
76
- there's there is there has
77
- they'd they would they had
78
- they'dn't they would not
79
- they'dn't've they would not have
80
- they'd've they would have
81
- they'd'ven't they would have not
82
- they'll they shall they will
83
- they'lln't've they will not have
84
- they'll'ven't they will have not
85
- they're they are
86
- they've they have
87
- they'ven't they have not
88
- 'tis it is
89
- 'twas it was
90
- wasn't was not
91
- we'd we had we would
92
- we'd've we would have
93
- we'dn't've we would not have
94
- we'll we will
95
- we'lln't've we will not have
96
- we're we are
97
- we've we have
98
- weren't were not
99
- what'll what shall what will
100
- what're what are
101
- what's what is what does what has
102
- what've what have
103
- when's when is when has
104
- where'd where did
105
- where's where is where does where has
106
- where've where have
107
- who'd who would who had
108
- who'd've who would have
109
- who'll who shall who will
110
- who're who are
111
- who's who is who has
112
- who've who have
113
- why'll why will
114
- why're why are
115
- why's why is why has
116
- won't will not
117
- won't've will not have
118
- would've would have
119
- wouldn't would not
120
- wouldn't've would not have
121
- y'all you all
122
- y'all'd've you all would have
123
- y'all'dn't've you all would not have
124
- y'all'll you all will
125
- y'all'lln't you all will not
126
- y'all'll've you all will have
127
- y'all'll'ven't you all will have not
128
- you'd you had you would
129
- you'd've you would have
130
- you'll you shall you will
131
- you're you are
132
- you'ren't you are not
133
- you've you have
134
- you'ven't you have not
@@ -1,19 +0,0 @@
1
- # Slang / Shorthand
2
-
3
- bye goodbye
4
- gonna going to
5
- hi hello
6
- ol' old
7
- 'sup what is up
8
- thanks thank you
9
- wanna want to
10
- mon monday
11
- tue tuesday
12
- tues tuesday
13
- wed wednesday
14
- thu thursday
15
- thur thursday
16
- thurs thursday
17
- fri friday
18
- sat saturday
19
- sun sunday