Skip to content

Instantly share code, notes, and snippets.

@joelibaceta
Last active May 9, 2016 17:29
Show Gist options
  • Save joelibaceta/bd0808c9a94637acb500ad17ebb1e0fa to your computer and use it in GitHub Desktop.
Save joelibaceta/bd0808c9a94637acb500ad17ebb1e0fa to your computer and use it in GitHub Desktop.
Code Refactorization Example
class MovieReviewsApp
attr_accessor :tweet
@tweet = Hash.new()
def self.call(*args)
args.map{|a| JSON.parse(a).map{|i| append(i['title'], i)}}
return build_tweet(@tweet)
end
def self.append(title, hash)
@tweet[title].merge!(hash) rescue @tweet[title] = hash
end
def self.build_tweet(input)
tweet, tweets = input, []
tweet.each do |k, v|
t, r, s = v['title'], v['review'], get_stars(v['score'])
y = " (#{v['year'].to_s})" if v['year']
tweet = "#{t}#{y}: #{r} #{s}"
tweet = "#{t[0..24]}#{y}: #{r} #{s}" if tweet.length > 140
tweet = "#{t[0..24]}#{y}: #{r[0..((139 + (r.length - tweet.length)))]} #{s}" if tweet.length >= 140
tweets << tweet
end
return tweets
end
def self.get_stars(n)
starts_partial = (n % 20).between?(1,10) ? "½" : "★"
return (n % 20) == 0 ? '★' * (n / 20).to_i : ('★' * (n / 20).to_i) + starts_partial
end
end
class MovieReviewsApp
# Put your code here !
attr_accessor :tweet
@tweet = {}
def self.call(*args)
@arguments = args;
@arguments.each do |argument|
map_titles(argument)
map_information(argument)
end
final_tweets = concatenate(reduce(@tweet))
return final_tweets
end
def self.map_titles(information)
@information = JSON.parse(information)
# Map Titles
@information.each do |info_hash|
unless @tweet.has_key?(info_hash['title'])
@tweet[info_hash['title']] = []
end
end
end
def self.map_information(information)
@information = JSON.parse(information)
@tweet.keys.each do |key| #Iterate over all the keys of the Tweet, this is an array
@information.each do |info| #Iterate over all the
if info['title'] == key
info.each do | k, v|
unless @tweet[key].include?(v)
@tweet[key] << {k => v}
end
end
end
end
end
end
def self.reduce(tweet)
tweet.each do |k, v|
tweet[k] = [v.reduce({}, :merge)]
end
end
def self.concatenate(information)
tweets = build_tweet(information)
return tweets
end
def self.check_year(year)
unless year.nil?
return year = " (#{year.to_s})"
end
end
def self.build_tweet(input)
tweet = input
tweets = []
tweet.each do |k , y|
y.each do |v|
title = v['title']
year = check_year(v['year'])
review = v['review']
score = get_stars(v['score'])
tweet = "#{title}#{year}: #{review} #{score}"
while check(tweet) do
title = check_title(title, tweet)
tweet = "#{title}#{year}: #{review} #{score}"
review = check_review(review, tweet)
end
tweets << tweet
end
end
return tweets
end
def self.check(tweet)
if tweet.length > 140
return true
end
end
def self.check_title(title, tweet)
if title.length > 24
title = title[0..24]
end
return title
end
def self.check_review(review, tweet)
if check(tweet)
return review[0..(review.length - (tweet.length - 139))]
end
end
def self.get_stars(value)
stars = ''
int_value = value / 20
float_value = value.to_f / 20
result = float_value - int_value
(1..int_value).each do
stars << '★'
end
if result <= 0.5 && result != 0
stars << "½"
else
if float_value < 5
stars << '★'
end
end
return stars
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment