towsta 1.3.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +3 -0
- data/lib/towsta/envs/development.rb +7 -0
- data/lib/towsta/envs/production.rb +13 -0
- data/lib/towsta/envs/test.rb +5 -0
- data/lib/towsta/kinds/boolean.rb +2 -1
- data/lib/towsta/kinds/formated.rb +0 -4
- data/lib/towsta/kinds/gallery.rb +2 -3
- data/lib/towsta/kinds/money.rb +6 -0
- data/lib/towsta/kinds/multiple.rb +3 -10
- data/lib/towsta/kinds/user.rb +6 -8
- data/lib/towsta/kinds/vertical.rb +5 -9
- data/lib/towsta/memory.rb +2 -4
- data/lib/towsta/sinatra_extension.rb +1 -1
- data/lib/towsta/synchronizer.rb +29 -32
- data/lib/towsta/version.rb +1 -1
- data/lib/towsta/vertical-core/attributes.rb +52 -0
- data/lib/towsta/vertical-core/base.rb +24 -0
- data/lib/towsta/vertical-core/crud.rb +41 -0
- data/lib/towsta/vertical-core/locales.rb +21 -0
- data/lib/towsta/vertical-core/mail.rb +17 -0
- data/lib/towsta/vertical-core/references.rb +44 -0
- data/lib/towsta/vertical.rb +19 -134
- data/lib/towsta.rb +9 -21
- data/spec/kinds/boolean_spec.rb +54 -0
- data/spec/kinds/date_spec.rb +37 -0
- data/spec/kinds/datetime_spec.rb +37 -0
- data/spec/kinds/gallery_spec.rb +43 -0
- data/spec/kinds/image_spec.rb +39 -0
- data/spec/kinds/integer_spec.rb +33 -0
- data/spec/kinds/list_spec.rb +37 -0
- data/spec/kinds/main_spec.rb +24 -0
- data/spec/kinds/money_spec.rb +37 -0
- data/spec/kinds/multiple_spec.rb +41 -0
- data/spec/kinds/user_spec.rb +41 -0
- data/spec/kinds/vertical_spec.rb +41 -0
- data/spec/kinds/video_spec.rb +37 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/synchronizer/base_spec.rb +6 -0
- data/spec/synchronizer/cache_string_spec.rb +25 -0
- data/spec/synchronizer/has_secret_spec.rb +25 -0
- data/spec/synchronizer/parse_json_spec.rb +26 -0
- data/spec/synchronizer/populate_verticals_spec.rb +25 -0
- data/spec/synchronizer/populate_verticals_spec.rb~ +25 -0
- data/spec/synchronizer/remote_string_spec.rb +25 -0
- data/spec/synchronizer/solve_params_spec.rb +28 -0
- data/spec/synchronizer/validate_response_spec.rb +25 -0
- data/spec/synchronizer/validate_secret_spec.rb +25 -0
- data/spec/towsta_spec.rb +7 -0
- data/spec/vertical/vertical_spec.rb +17 -0
- data/spec/webmock.json +1 -0
- data/towsta.gemspec +19 -13
- metadata +90 -16
- data/lib/towsta/string_extension.rb +0 -5
data/Rakefile
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
require "./towsta.rb"
|
2
|
+
|
3
|
+
require 'dalli'
|
4
|
+
set :cache, Dalli::Client.new
|
5
|
+
require File.expand_path('../../towsta/memory', __FILE__)
|
6
|
+
|
7
|
+
Towsta::Synchronizer.new params: {}, request: :structure
|
8
|
+
|
9
|
+
(Dir["./controllers/*.rb"] + Dir["./models/*.rb"]).each {|file| require file}
|
10
|
+
|
11
|
+
def sync_with_towsta params={}
|
12
|
+
Towsta::Memory.recover(params).status
|
13
|
+
end
|
data/lib/towsta/kinds/boolean.rb
CHANGED
data/lib/towsta/kinds/gallery.rb
CHANGED
data/lib/towsta/kinds/money.rb
CHANGED
@@ -5,21 +5,17 @@ module Towsta
|
|
5
5
|
|
6
6
|
attr_accessor :content
|
7
7
|
|
8
|
-
def initialize content=nil
|
9
|
-
self.set content
|
10
|
-
end
|
11
|
-
|
12
8
|
def get
|
13
9
|
return @content if @content.class == Array
|
10
|
+
return [] if !!(@content =~ /[^0-9 ]/)
|
14
11
|
aux = []
|
15
12
|
@content.to_s.split(' ').each do |i|
|
16
13
|
Vertical.all.each do |v|
|
17
|
-
horizontal = v.find_by_id i
|
14
|
+
horizontal = v.find_by_id i.to_i
|
18
15
|
aux << horizontal if horizontal
|
19
16
|
end
|
20
17
|
end
|
21
18
|
@content = aux
|
22
|
-
@content
|
23
19
|
end
|
24
20
|
|
25
21
|
def set content
|
@@ -28,10 +24,7 @@ module Towsta
|
|
28
24
|
end
|
29
25
|
|
30
26
|
def export
|
31
|
-
|
32
|
-
aux = ''
|
33
|
-
@content.each {|c| aux << c.id}
|
34
|
-
aux
|
27
|
+
get.collect{|c| c.id}.join ' '
|
35
28
|
end
|
36
29
|
|
37
30
|
end
|
data/lib/towsta/kinds/user.rb
CHANGED
@@ -4,17 +4,15 @@ module Towsta
|
|
4
4
|
class UserKind < MainKind
|
5
5
|
|
6
6
|
def get
|
7
|
+
return nil unless @content
|
7
8
|
return @content if @content.class == User
|
8
|
-
|
9
|
-
@content = user if user
|
10
|
-
@content
|
9
|
+
@content = User.find_by_id @content
|
11
10
|
end
|
12
11
|
|
13
12
|
def set content
|
14
13
|
return @content = content if content.class == User
|
15
|
-
return @content =
|
16
|
-
@content =
|
17
|
-
@content = content
|
14
|
+
return @content = nil if !!(content =~ /[^0-9]/)
|
15
|
+
return @content = content.to_i
|
18
16
|
end
|
19
17
|
|
20
18
|
def compare object
|
@@ -23,8 +21,8 @@ module Towsta
|
|
23
21
|
end
|
24
22
|
|
25
23
|
def export
|
26
|
-
return
|
27
|
-
|
24
|
+
return get.id.to_s if get.class == User
|
25
|
+
get.to_s
|
28
26
|
end
|
29
27
|
|
30
28
|
end
|
@@ -4,6 +4,7 @@ module Towsta
|
|
4
4
|
class VerticalKind < MainKind
|
5
5
|
|
6
6
|
def get
|
7
|
+
return nil unless @content
|
7
8
|
return @content if @content.class != Fixnum
|
8
9
|
Vertical.all.each do |v|
|
9
10
|
horizontal = v.find_by_id @content
|
@@ -16,26 +17,21 @@ module Towsta
|
|
16
17
|
end
|
17
18
|
|
18
19
|
def set content
|
19
|
-
return @content =
|
20
|
+
return @content = nil if !!(content =~ /[^0-9]/)
|
21
|
+
return @content = content if Vertical.all.include? content.class
|
20
22
|
@content = content.to_i
|
21
23
|
end
|
22
24
|
|
23
25
|
def compare object
|
24
|
-
self.get.id.to_i == object.id.to_i if
|
26
|
+
self.get.id.to_i == object.id.to_i if Vertical.all.include? object.class
|
25
27
|
self.get == object
|
26
28
|
end
|
27
29
|
|
28
30
|
def export
|
29
|
-
return @content.id.to_s if
|
31
|
+
return @content.id.to_s if Vertical.all.include? self.get.class
|
30
32
|
@content.to_s
|
31
33
|
end
|
32
34
|
|
33
|
-
private
|
34
|
-
|
35
|
-
def klasses
|
36
|
-
Vertical.all + [User]
|
37
|
-
end
|
38
|
-
|
39
35
|
end
|
40
36
|
|
41
37
|
end
|
data/lib/towsta/memory.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
set :cache, Dalli::Client.new
|
2
|
-
|
3
1
|
module Towsta
|
4
2
|
|
5
3
|
class Memory
|
@@ -8,10 +6,10 @@ module Towsta
|
|
8
6
|
md5 = Memory.md5(params)
|
9
7
|
if settings.cache.get(md5)
|
10
8
|
puts "\nUsing cache to Towst"
|
11
|
-
Towsta::Synchronizer.new :
|
9
|
+
Towsta::Synchronizer.new cache: settings.cache.get(md5), request: :horizontals
|
12
10
|
else
|
13
11
|
puts "\nCreating cache"
|
14
|
-
syn = Towsta::Synchronizer.new :
|
12
|
+
syn = Towsta::Synchronizer.new params: params, request: :horizontals
|
15
13
|
settings.cache.set(md5,syn.response)
|
16
14
|
end
|
17
15
|
end
|
data/lib/towsta/synchronizer.rb
CHANGED
@@ -1,59 +1,65 @@
|
|
1
1
|
module Towsta
|
2
2
|
class Synchronizer
|
3
3
|
|
4
|
-
attr_accessor :
|
4
|
+
attr_accessor :params, :cache, :response, :status
|
5
5
|
|
6
|
-
def initialize args
|
7
|
-
|
8
|
-
@secret = args[:secret]
|
9
|
-
@params = args[:params]
|
6
|
+
def initialize args={}
|
7
|
+
@params = solve_params args[:params]
|
10
8
|
@cache = args[:cache]
|
11
9
|
if synchronize
|
12
|
-
|
10
|
+
args[:request] ||= :horizontals
|
11
|
+
create_verticals if [:all, :structure].include? args[:request]
|
12
|
+
populate_verticals if [:all, :horizontals].include? args[:request]
|
13
13
|
puts " Ready to Towst!\n\n"
|
14
|
+
@status = true
|
14
15
|
else
|
15
16
|
puts " Unable to keep Towsting!\n\n"
|
17
|
+
@status = false
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
19
21
|
def self.save_request export
|
20
22
|
begin
|
21
|
-
uri = URI.parse("http://manager.towsta.com/synchronizers/#{
|
22
|
-
return JSON.parse Net::HTTP.post_form(uri, {:
|
23
|
+
uri = URI.parse("http://manager.towsta.com/synchronizers/#{Towsta.secret}/import.json")
|
24
|
+
return JSON.parse Net::HTTP.post_form(uri, {code: export.to_json}).body.to_s, symbolize_names: true
|
23
25
|
rescue
|
24
|
-
return {:
|
26
|
+
return {status: false, message: 'Internal Server Error'}
|
25
27
|
end
|
26
28
|
end
|
27
29
|
|
28
30
|
def self.authentication_request params
|
29
31
|
begin
|
30
32
|
uri = URI.parse("http://manager.towsta.com/authenticate")
|
31
|
-
return JSON.parse Net::HTTP.post_form(uri, params).body.to_s, :
|
33
|
+
return JSON.parse Net::HTTP.post_form(uri, params).body.to_s, symbolize_names: true
|
32
34
|
rescue
|
33
|
-
return {:
|
35
|
+
return {status: false}
|
34
36
|
end
|
35
37
|
end
|
36
38
|
|
37
39
|
private
|
38
40
|
|
39
41
|
def synchronize
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
42
|
+
has_secret && (cache_string || remote_string) && validate_secret && validate_response && parse_json
|
43
|
+
end
|
44
|
+
|
45
|
+
def solve_params(params)
|
46
|
+
return params unless Towsta.global
|
47
|
+
Towsta.global.merge (params || {})
|
46
48
|
end
|
47
49
|
|
48
50
|
def create_verticals
|
49
|
-
|
50
|
-
|
51
|
-
|
51
|
+
Vertical.create name: 'User', slices: {id: 'integer', nick: 'text', email: 'text'}
|
52
|
+
@hash[:structures].each {|structure| Vertical.create structure}
|
53
|
+
end
|
54
|
+
|
55
|
+
def populate_verticals
|
56
|
+
Vertical.populate 'User', @hash[:users]
|
57
|
+
@hash[:structures].each_with_index {|structure, i| Vertical.populate(structure[:name], @hash[:verticals][i][:horizontals], @hash[:verticals][i][:occurrences])}
|
52
58
|
end
|
53
59
|
|
54
60
|
def remote_string
|
55
61
|
begin
|
56
|
-
uri = "/synchronizers/#{
|
62
|
+
uri = "/synchronizers/#{Towsta.secret}/#{Time.now.to_i}/export.json"
|
57
63
|
uri += "?query=#{CGI::escape(@params.to_json)}" if @params
|
58
64
|
@response = Net::HTTP.start("manager.towsta.com"){|http| @json = http.get(uri).body}
|
59
65
|
puts "\nSynchronized with Towsta!"
|
@@ -82,14 +88,14 @@ module Towsta
|
|
82
88
|
end
|
83
89
|
|
84
90
|
def has_secret
|
85
|
-
return true if
|
91
|
+
return true if Towsta.secret
|
86
92
|
puts "\nyou cant synchronize without a secret..."
|
87
93
|
false
|
88
94
|
end
|
89
95
|
|
90
96
|
def parse_json
|
91
97
|
begin
|
92
|
-
@hash = JSON.parse @response, :
|
98
|
+
@hash = JSON.parse @response, symbolize_names: true
|
93
99
|
return true
|
94
100
|
rescue
|
95
101
|
puts ' Something went wrong tryng to parse JSON.'
|
@@ -97,15 +103,6 @@ module Towsta
|
|
97
103
|
end
|
98
104
|
end
|
99
105
|
|
100
|
-
def create_vertical structure, horizontals, occurrences=[]
|
101
|
-
Object.instance_eval{ remove_const structure[:name].to_sym } if Object.const_defined?(structure[:name].to_sym)
|
102
|
-
Vertical.create structure
|
103
|
-
Vertical.all << eval(structure[:name])
|
104
|
-
horizontals.each {|horizontal| eval(structure[:name].to_s).new(horizontal)}
|
105
|
-
occurrences.each {|occurrence| eval(structure[:name].to_s).add_occurrence(occurrence)}
|
106
|
-
puts " class #{structure[:name]} was created with #{horizontals.size} instances"
|
107
|
-
end
|
108
|
-
|
109
106
|
end
|
110
107
|
|
111
108
|
end
|
data/lib/towsta/version.rb
CHANGED
@@ -0,0 +1,52 @@
|
|
1
|
+
module Towsta
|
2
|
+
|
3
|
+
class VerticalCore
|
4
|
+
|
5
|
+
class << self
|
6
|
+
attr_accessor :attributes
|
7
|
+
end
|
8
|
+
|
9
|
+
self.attributes ||= []
|
10
|
+
|
11
|
+
def attributes
|
12
|
+
horizontal = {}
|
13
|
+
self.class.attributes.each do |attr|
|
14
|
+
slice = send :"object_of_#{attr.to_s}"
|
15
|
+
horizontal[attr] = slice ? slice.export : nil
|
16
|
+
end
|
17
|
+
horizontal
|
18
|
+
end
|
19
|
+
|
20
|
+
def meta_attributes
|
21
|
+
a = attributes.clone
|
22
|
+
a.delete :author
|
23
|
+
a.delete :created_at
|
24
|
+
a.delete :updated_at
|
25
|
+
a.delete :id
|
26
|
+
a
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.define_attribute attr, kind
|
30
|
+
self.class_eval("
|
31
|
+
|
32
|
+
def #{attr}= value
|
33
|
+
@#{attr} ||= Towsta::Kinds::#{kind[0].upcase + kind[1..-1]}Kind.new
|
34
|
+
@#{attr}.set value
|
35
|
+
end
|
36
|
+
|
37
|
+
def #{attr}
|
38
|
+
@#{attr}.get
|
39
|
+
end
|
40
|
+
|
41
|
+
def object_of_#{attr}
|
42
|
+
@#{attr}
|
43
|
+
end
|
44
|
+
|
45
|
+
")
|
46
|
+
self.attributes ||= []
|
47
|
+
self.attributes << attr.to_sym
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Towsta
|
2
|
+
|
3
|
+
class VerticalCore
|
4
|
+
|
5
|
+
def initialize args={}
|
6
|
+
self.attributes.merge(args).each {|k,v| self.send("#{k}=".to_sym, v)}
|
7
|
+
self.class.all << self
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.to_hash
|
11
|
+
hashes = []
|
12
|
+
self.all.each {|hash| hashes << hash.attributes}
|
13
|
+
hashes
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.add_occurrence occurrence
|
17
|
+
self.send(:define_singleton_method, "occurrences_of_#{occurrence[:name].downcase}") do
|
18
|
+
eval occurrence[:items].inspect
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Towsta
|
2
|
+
|
3
|
+
class VerticalCore
|
4
|
+
|
5
|
+
attr_accessor :message
|
6
|
+
|
7
|
+
def update args, author=$towsta_default_author
|
8
|
+
args.each {|k,v| self.send("#{k}=".to_sym, v)}
|
9
|
+
self.save author
|
10
|
+
end
|
11
|
+
|
12
|
+
def destroy
|
13
|
+
#to-do
|
14
|
+
end
|
15
|
+
|
16
|
+
def save creator=$towsta_default_author
|
17
|
+
creator = author.email if author
|
18
|
+
export = self.attributes
|
19
|
+
export.delete :author
|
20
|
+
export.delete :created_at
|
21
|
+
export.delete :updated_at
|
22
|
+
id_aux = export.delete(:id)
|
23
|
+
id_aux ? id_aux : '0'
|
24
|
+
export = {:creator => creator, :vertical => self.class.to_s, :attributes => export, :id => id_aux}
|
25
|
+
response = Towsta::Synchronizer.save_request export
|
26
|
+
@message = response[:message]
|
27
|
+
self.id = response[:id] if response[:status]
|
28
|
+
self.author = User.find_by_email creator
|
29
|
+
Towsta::Memory.flush if $towsta_cache
|
30
|
+
response[:status]
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.create args, creator=$towsta_default_author
|
34
|
+
new = self.new(args.merge(:id => nil))
|
35
|
+
new.save creator
|
36
|
+
new
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Towsta
|
2
|
+
|
3
|
+
class VerticalCore
|
4
|
+
|
5
|
+
include R18n::Helpers
|
6
|
+
|
7
|
+
def i18n attr
|
8
|
+
self.send :"#{attr.to_s}_#{R18n.get.locales.first.code}"
|
9
|
+
end
|
10
|
+
|
11
|
+
def method_missing meth, *args, &block
|
12
|
+
begin
|
13
|
+
return self.i18n meth.to_sym
|
14
|
+
rescue
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Towsta
|
2
|
+
|
3
|
+
class VerticalCore
|
4
|
+
|
5
|
+
def to_mail
|
6
|
+
string = ''
|
7
|
+
meta_attributes.each { |attribute, value| string << "<b>#{attribute.to_s}:</b> #{value} <br/>" }
|
8
|
+
string
|
9
|
+
end
|
10
|
+
|
11
|
+
def notify args
|
12
|
+
Pony.mail({:html_body => to_mail}.merge(args))
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Towsta
|
2
|
+
|
3
|
+
class VerticalCore
|
4
|
+
|
5
|
+
class << self
|
6
|
+
attr_accessor :all, :count
|
7
|
+
end
|
8
|
+
|
9
|
+
self.all ||= []
|
10
|
+
|
11
|
+
def self.first
|
12
|
+
self.all.first
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.last
|
16
|
+
self.all.last
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.find id
|
20
|
+
self.find_by_id id
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.random
|
24
|
+
position = (self.all.size) - 1
|
25
|
+
self.all[rand(position)]
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.find_by attr, value
|
29
|
+
self.all.each { |horizontal| return horizontal if horizontal.send(:"object_of_#{attr}").compare value }
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.find_all_by attr, value
|
33
|
+
self.all.select { |horizontal| horizontal.send(:"object_of_#{attr}").compare value }
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.method_missing m, *args, &block
|
37
|
+
return self.find_by Regexp.last_match(1), args.first if m =~ /find_by_(.+)/
|
38
|
+
return self.find_all_by Regexp.last_match(1), args.first if m =~ /find_all_by_(.+)/
|
39
|
+
super
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|