a_marmita 0.0.1 → 0.5.8

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,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NjMwMTZkMmMzYjQ5YThjMzdjMjk4NjE5MTU2NDhjNDZmNDUzYzgzNA==
4
+ YjhiMzBiYzFmNTAxZmRkOWUzOWRiMmE3MGUxOTY2NDM3NTE5NGIxNw==
5
5
  data.tar.gz: !binary |-
6
- MzA3NmYyNDg1MzE4N2U1ZjE3MzI1MzQyNzE1Zjg1OWM1OTMzOWU0Nw==
6
+ ODc0ZjQ3MjgzNDVlODlhOTkzNTVjYTdlMDY3YzVjMzUzMDBiMDZmNw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZThlM2E2MDcxYzE4MGU3OWQ5M2FlZjY4MjkzYmZlYTUwMzg4NmJjNWNhMWQ4
10
- MDNjOTAwNDNiNTllMmNjZjdkNjAxM2ZhM2Y5N2FmMmYyNzkwZmQ4MjFlYmVh
11
- NGE2MTc4NmU0YWU2M2E4MzNjZDU4Zjg0ODY0ZjNjNDZmM2VjMzI=
9
+ YzEwYzFmOGM2MjRkNzVmNTUwNmZjNDNiY2FkZDEzZDFiY2RjNjBjMzU4ODg5
10
+ ZmM0ZGZhODU5NmZhZmFkNmQxMzMwMTE0ZTlmZTk3NGUyZmEwNmY4ZWE4MGYx
11
+ Mzc3ODEzMjcwNDk5ZGRkZTQwNjdmMGEwNTFlOWU0NTg1MDk0YzQ=
12
12
  data.tar.gz: !binary |-
13
- ZDc1ZGYxZGZhNGJkZTkwYzNmODFkM2I0MDUzYjUxNTBiYzQwNjIzYjlkMWUy
14
- NzYyYzk5ODk0MWM3MDY3NTRlZTZhNTY1YmFlZGE5YmZiYTEyYTNiZjUwY2Rh
15
- MGM5NzM1YmZmODEwN2EzNjdmNjg2MDE4MmJkYTI0MTZkNzg5Yjc=
13
+ Y2NjOWM1ZGEyZmM4ZTFjMmJmOTNiNzYwNDNhYzBiYzJlYjUzMWI2NmQxYWZi
14
+ NjA5ZDhmYjA1YTcxYTFhZmU5YjJjMDBkNDFjY2Q4ZWY1MGY4YzFiNTUyYjlm
15
+ ODg4YjdhNDNhOWU2Y2YxNWIxMGU2ZTg4NDJjNDQwZmE3ZWM5OWI=
data/.gitignore CHANGED
@@ -16,3 +16,5 @@ tmp
16
16
  .yardoc
17
17
  _yardoc
18
18
  doc/
19
+
20
+ run_me.rb
data/.rspec ADDED
@@ -0,0 +1,4 @@
1
+ --tty
2
+ --color
3
+ --format documentation
4
+ --format html -o "tmp/rspec_result.html"
data/Gemfile CHANGED
@@ -6,4 +6,5 @@ gemspec
6
6
  group :development, :test do
7
7
  gem "rspec", "~> 2.11"
8
8
  gem "pry"
9
+ gem 'webmock'
9
10
  end
data/Gemfile.lock CHANGED
@@ -1,12 +1,15 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- a_marmita (0.0.1)
4
+ a_marmita (0.3.5)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
+ addressable (2.3.6)
9
10
  coderay (1.1.0)
11
+ crack (0.4.2)
12
+ safe_yaml (~> 1.0.0)
10
13
  diff-lcs (1.2.5)
11
14
  domain_name (0.5.18)
12
15
  unf (>= 0.0.5, < 1.0.0)
@@ -41,10 +44,14 @@ GEM
41
44
  rspec-expectations (2.14.5)
42
45
  diff-lcs (>= 1.1.3, < 2.0)
43
46
  rspec-mocks (2.14.6)
47
+ safe_yaml (1.0.1)
44
48
  slop (3.5.0)
45
49
  unf (0.1.3)
46
50
  unf_ext
47
51
  unf_ext (0.0.6)
52
+ webmock (1.17.4)
53
+ addressable (>= 2.2.7)
54
+ crack (>= 0.3.2)
48
55
  webrobots (0.1.1)
49
56
 
50
57
  PLATFORMS
@@ -56,3 +63,4 @@ DEPENDENCIES
56
63
  mechanize
57
64
  pry
58
65
  rspec (~> 2.11)
66
+ webmock
data/lib/a_marmita.rb CHANGED
@@ -1,40 +1,59 @@
1
+ require 'mechanize'
2
+
3
+ require "a_marmita/client_module"
4
+ require "a_marmita/payment"
1
5
  require "a_marmita/version"
6
+ require "a_marmita/helpers"
7
+ require "a_marmita/scrapper"
8
+ require "a_marmita/web_agent"
9
+ require "a_marmita/cart/base"
10
+ require "a_marmita/meals/base"
11
+ require "a_marmita/orders/base"
12
+ require "a_marmita/authentication"
2
13
 
3
14
  module AMarmita
4
15
 
5
- extend self
6
-
7
- def get_meals
8
-
9
- login('joao.goncalves@linkedcare.com', 'yEJHVd')
16
+ class Client
10
17
 
11
- scrap_meals
18
+ include WebAgent
19
+ include Authentication
12
20
 
13
- end
21
+ def cart
22
+ @cart ||= Cart::Base.new(self)
23
+ end
14
24
 
25
+ def meals
26
+ @meals ||= Meals::Base.new(self)
27
+ end
15
28
 
16
- protected #################### PROTECTED ##################
29
+ def orders
30
+ @orders ||= Orders::Base.new(self)
31
+ end
17
32
 
18
- def scrap_meals
19
- page = agent.get "http://www.amarmita.com/ementa.php"
33
+ def payment
34
+ @payment ||= Payment.new(self)
35
+ end
20
36
 
21
- page.parser.css('#conteudo table tr')
22
- binding.pry
23
37
  end
24
38
 
25
- def login(email, pass)
26
- page = agent.get "http://www.amarmita.com/login.php?user=#{email}&psw=#{pass}"
39
+ module ClassMethods
27
40
 
28
- page.body == "1"
29
- end
41
+ def new_client
42
+ Client.new
43
+ end
30
44
 
31
- def agent
32
- return @agent if defined?(@agent)
45
+ def singleton
46
+ @singleton ||= Client.new
47
+ end
33
48
 
34
- @agent = Mechanize.new.tap do |agent|
35
- agent.log = Logger.new "mech.log"
36
- agent.user_agent_alias = 'Mac Safari'
49
+ def method_missing(method, *args, &block)
50
+ return super unless singleton.respond_to?(method)
51
+
52
+ singleton.send(method, *args)
37
53
  end
54
+
38
55
  end
39
56
 
57
+ extend ClassMethods
58
+
40
59
  end
@@ -0,0 +1,29 @@
1
+ module AMarmita
2
+
3
+ module Authentication
4
+
5
+ def self.include(base)
6
+ base.class_eval { attr_reader :email, :pass }
7
+ end
8
+
9
+ def set_credentials(email, pass)
10
+ @email, @pass = email, pass
11
+ end
12
+
13
+ def login(email = nil, pass = nil)
14
+ set_credentials(email, pass) unless email.nil?
15
+
16
+ @logged = (get_page_body("http://www.amarmita.com/login.php?user=#{@email}&psw=#{@pass}") == "1")
17
+ end
18
+
19
+ def logged?(force = false)
20
+ @logged = nil if force
21
+
22
+ return @logged unless @logged.nil?
23
+
24
+ @logged = (get_page_body("http://www.amarmita.com/logged.php") == "1")
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,66 @@
1
+ require "a_marmita/cart/scrapper"
2
+
3
+ module AMarmita
4
+ module Cart
5
+
6
+ class Base < ClientModule
7
+
8
+ def items
9
+ return :bad_login if cant_log_in?
10
+
11
+ page, last_date = get_page("http://www.amarmita.com/enc.php?op=4"), ''
12
+
13
+ content_rows = page.parser.css('table > tr')
14
+
15
+ content_rows.map do |row|
16
+ new_date = row.css('.em_marmitalist_data')
17
+
18
+ last_date = Helpers.cart_date_parser(new_date.first.text) unless new_date.empty?
19
+
20
+ Cart::Scrapper.new(row).scrap(date: last_date)
21
+ end.compact
22
+ end
23
+
24
+ def add_item(id, date = nil, quantity = 1)
25
+ return :bad_login if cant_log_in?
26
+
27
+ date = Helpers.format_date(date)
28
+
29
+ server_response = get_page_body("http://www.amarmita.com/enc.php?id=#{id}&qtd=#{quantity}&data=#{date}&op=1")
30
+
31
+ { "1" => :ok, "-2" => :bad_date }[server_response] || :error
32
+ end
33
+
34
+ def remove_item(id)
35
+ return :bad_login if cant_log_in?
36
+
37
+ server_response = get_page_body("http://www.amarmita.com/enc.php?id=#{id}&op=2")
38
+
39
+ server_response == "1" ? :ok : :error
40
+ end
41
+
42
+ def total
43
+ return :bad_login if cant_log_in?
44
+
45
+ total = get_page_body("http://www.amarmita.com/enc.php?op=5")
46
+
47
+ Helpers.to_float(total).first
48
+ end
49
+
50
+ def checkout(payment_method)
51
+ return :bad_login if cant_log_in?
52
+
53
+ case payment_method
54
+ when :through_mb
55
+ client.payment.through_mb
56
+ when :end_of_month
57
+ client.payment.end_of_month
58
+ else
59
+ raise 'Unknown payment method!'
60
+ end
61
+ end
62
+
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,50 @@
1
+ module AMarmita
2
+ module Cart
3
+
4
+ class Scrapper < AMarmita::Scrapper
5
+
6
+ DESCRIPTION, QUANTITY = 0, 1
7
+
8
+
9
+ def run(options = {})
10
+ @attributes = {
11
+ date: options[:date],
12
+ id: Helpers.to_int(get_id),
13
+ description: get_description,
14
+ quantity: Helpers.to_int(get_quantity)
15
+ }
16
+ end
17
+
18
+
19
+ protected ############## PROTECTED ##################
20
+
21
+ def get_id
22
+ get_xml_value(css_parser.css('a').first) do |xml_object|
23
+ get_id_from_javascript_function xml_object.attr('href')
24
+ end
25
+ end
26
+
27
+ def get_description
28
+ get_xml_value similar_entries[DESCRIPTION]
29
+ end
30
+
31
+ def get_quantity
32
+ get_xml_value similar_entries[QUANTITY]
33
+ end
34
+
35
+
36
+ private ################# PRIVATE ##################
37
+
38
+ def similar_entries
39
+ @similar_entries ||= css_parser.css('.em_marmitalist_desc')
40
+ end
41
+
42
+ def get_id_from_javascript_function(javascript_function)
43
+ id = javascript_function[(javascript_function.index('(') + 1)..-1]
44
+ id[0..(id.index(')') - 1)]
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,24 @@
1
+ module AMarmita
2
+
3
+ class ClientModule
4
+
5
+ extend Forwardable
6
+
7
+ attr_reader :client
8
+
9
+ def initialize(client)
10
+ @client = client
11
+ end
12
+
13
+ def_delegators :client, :get_page_body, :get_page, :logged?, :login
14
+
15
+
16
+ protected ################ PROTECTED #################
17
+
18
+ def cant_log_in?
19
+ !logged? && !login
20
+ end
21
+
22
+ end
23
+
24
+ end
@@ -0,0 +1,62 @@
1
+ # encoding: utf-8
2
+
3
+ module AMarmita
4
+
5
+ module Helpers
6
+
7
+ extend self
8
+
9
+ MONTH_NAMES_PT = ["", "janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"]
10
+
11
+
12
+ def try(object, *a, &b)
13
+ if a.empty? && block_given?
14
+ yield object
15
+ else
16
+ object.respond_to?(a.first) ? object.public_send(*a, &b) : nil
17
+ end
18
+ end
19
+
20
+ def to_int(string)
21
+ string.nil? ? 0 : string.gsub(/[^0-9]/, '').to_i
22
+ end
23
+
24
+ def to_float(string)
25
+ return 0 if string.nil?
26
+
27
+ values = string.scan(/\d+[,.]*\d*/).flatten.map(&:to_f)
28
+
29
+ values.length > 1 ? values : values.first
30
+ end
31
+
32
+ def cart_date_parser(string)
33
+ return nil if string.nil?
34
+
35
+ day, month = *string.scan(/.* - ([0-9]*) (.*)/).flatten
36
+
37
+ format_date "#{Date.today.year}-#{get_month_number(month)}-#{day}"
38
+ end
39
+
40
+ def date_parser(date)
41
+ if date.is_a?(String)
42
+ date = Date.parse(date) rescue nil
43
+ end
44
+
45
+ date
46
+ end
47
+
48
+ def format_date(date)
49
+ date = date_parser(date)
50
+
51
+ date = (Date.today + 1) unless date.respond_to?(:strftime)
52
+
53
+ date.strftime('%Y-%m-%d')
54
+ end
55
+
56
+ def get_month_number(month)
57
+ MONTH_NAMES_PT.index(month.downcase)
58
+ end
59
+
60
+ end
61
+
62
+ end
@@ -0,0 +1,64 @@
1
+ require "a_marmita/meals/scrapper"
2
+
3
+ module AMarmita
4
+ module Meals
5
+
6
+ SOUP, MAIN_COURSE, DESSERT = 1, 2, 3
7
+
8
+ class Base < ClientModule
9
+
10
+ def today_menu
11
+ page = get_page "http://www.amarmita.com/ementa.php"
12
+
13
+ content_rows = page.parser.css('#conteudo > table > tr')
14
+
15
+ { available_days: parse_links(page), list: parse_meals(content_rows) }
16
+ end
17
+
18
+ def soups(date = nil, week_number = nil)
19
+ get_meals(SOUP, date, week_number)
20
+ end
21
+
22
+ def main_courses(date = nil, week_number = nil)
23
+ get_meals(MAIN_COURSE, date, week_number)
24
+ end
25
+
26
+ def desserts(date = nil, week_number = nil)
27
+ get_meals(DESSERT, date, week_number)
28
+ end
29
+
30
+
31
+ protected ################### PROTECTED ################
32
+
33
+ def get_meals(type, date = nil, week_number = nil)
34
+ date = Helpers.date_parser(date) || Date.today
35
+ week_number ||= date.strftime('%U').to_i + 1
36
+
37
+ page = get_page "http://www.amarmita.com/encomendamain.php?week=#{week_number}&tipo=#{type}&ano=#{date.year}&mes=#{date.month}&dia=#{date.day}"
38
+
39
+ content_rows = page.parser.css('table')[0].css('> tr')
40
+
41
+ parse_meals(content_rows)
42
+ end
43
+
44
+ def parse_links(page)
45
+ page.links.inject([]) do |links, link|
46
+ links << get_date_and_week_number_from_javascript_function(link.href) if link.href.include?('em_setday')
47
+ links
48
+ end
49
+ end
50
+
51
+ def parse_meals(content_rows)
52
+ content_rows.map { |row| Meals::Scrapper.new(row).scrap }.compact
53
+ end
54
+
55
+ def get_date_and_week_number_from_javascript_function(javascript_function)
56
+ args = javascript_function[(javascript_function.index('(') + 1)..-2].split(',')
57
+
58
+ { date: args[0..2].join('-'), week_number: args[3] }
59
+ end
60
+
61
+ end
62
+
63
+ end
64
+ end