struggle 1.6.0 → 1.7.0

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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f2c49188e67e6a0fc4175d8b84e0146d0110e92f
4
- data.tar.gz: 9120205f88375a50882ac5378fd76ea21bc8965f
3
+ metadata.gz: 23e470f3375c4dc58c63564566e7b97a65647be4
4
+ data.tar.gz: 40f7f904b6c227aa19503d9971c28495685a91c3
5
5
  SHA512:
6
- metadata.gz: 09f33bea4800221b29fb18fb453e299af1efb0cf4cfbc088de1000cfe8ed761fcf4193eb2f5f245e8477dd94df6fcbd32f620036ccc80b7100fbf0f4f00af3f4
7
- data.tar.gz: d16353ea833ed39f5fb0663921c34510c7403545ee9a2e03e606393e1db9c6001db48fee7761a5350e4f391985d6069fa1fe9fc72029cb475b55c5e19444c1b9
6
+ metadata.gz: 855102cceafc8b208bf9bf860fa27718434c46b335861d9483320cb1d3ced42873f2c035dc06331d5bc3a2c23e7bbe43d6ff944dc06a70d78b7000f5021c9adb
7
+ data.tar.gz: 11aa7245292514b711339245a98ea8d4140119df70f60d9b6d0f81dbe10fec6c99abbe3f5c39dd9ddbc9b05e84b7e782503335615ad9d6b861af047f1ca8bbf2
@@ -0,0 +1,38 @@
1
+ module Struggle
2
+ module IntExtend
3
+ def uppercase
4
+ cstr = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"]
5
+ cn_nums1 = ["元", "拾", "佰", "仟", "萬", "拾", "佰", "仟", "億", "拾", "佰", "仟"]
6
+ cn_nums2 = ['分', '角']
7
+ s = ""
8
+ array = self.to_s.split(".")
9
+ p h = array[0].to_s.split(//)
10
+ ai = h.count
11
+ h.each_with_index do |a, j|
12
+ s+=cstr[a.to_i]+cn_nums1[ai-1]
13
+ ai=ai-1
14
+ end
15
+ p h1 = array[1].to_s.split(//)
16
+ aj = h1.count
17
+ h1.each_with_index do |o, p|
18
+ s+=cstr[o.to_i]+cn_nums2[aj-1]
19
+ aj=aj-1
20
+ end
21
+ rstr = ""
22
+ rstr=s.gsub("拾零", "拾")
23
+ rstr=rstr.gsub("零拾", "零");
24
+ rstr=rstr.gsub("零佰", "零");
25
+ rstr=rstr.gsub("零仟", "零");
26
+ rstr=rstr.gsub("零萬", "萬");
27
+ for i in 1..6 do
28
+ rstr=rstr.gsub("零零", "零");
29
+ rstr=rstr.gsub("零萬", "零");
30
+ rstr=rstr.gsub("零億", "億");
31
+ rstr=rstr.gsub("零零", "零");
32
+ end
33
+ rstr=rstr.gsub("零角", "零");
34
+ rstr=rstr.gsub("零分", "");
35
+ rstr=rstr.gsub("零元", "");
36
+ end
37
+ end
38
+ end
@@ -1,5 +1,27 @@
1
- module StringExtend
2
- def html_clear(html)
3
- html.gsub(/<script.*?<\/script>/, "").gsub(/<iframe.*?<\/iframe>/, "")
1
+ module Struggle
2
+ module StringExtend
3
+ def html_clear
4
+ self.gsub(/<script.*?<\/script>/, "").gsub(/<iframe.*?<\/iframe>/, "")
5
+ end
6
+
7
+ def ischinese
8
+ (self=~/[\u4e00-\u9fa5]/).nil? ? false : true
9
+ end
10
+
11
+ def iscn_zn_num
12
+ (self=~/^[\u4e00-\u9fa5_a-zA-Z0-9]+$/).nil? ? false : true
13
+ end
14
+
15
+ def truncate_u(length = 30, truncate_string = "...")
16
+ l=0
17
+ char_array=self.unpack("U*")
18
+ char_array.each_with_index do |c, i|
19
+ l = l+ (c<127 ? 0.5 : 1)
20
+ if l>=length
21
+ return char_array[0..i].pack("U*")+(i<char_array.length-1 ? truncate_string : "")
22
+ end
23
+ end
24
+ return self
25
+ end
4
26
  end
5
27
  end
data/lib/struggle/func.rb CHANGED
@@ -1,78 +1,8 @@
1
1
  module Struggle
2
2
  class Func
3
- # 判断是否含有中文
4
- def self.ischinese(temp)
5
- (temp=~/[\u4e00-\u9fa5]/).nil? ? false : true
6
- end
7
-
8
- # 判断是否只含有中英文,数字和下划线
9
- def self.iscn_zn_num(temp)
10
- (temp=~/^[\u4e00-\u9fa5_a-zA-Z0-9]+$/).nil? ? false : true
11
- end
12
-
13
- # 格式化时间
14
- def self.formattime(time)
15
- time.strftime("%Y-%m-%d %H:%M:%S")
16
- end
17
-
18
- # 限制文字长度
19
- def self.truncate_u(text, length = 30, truncate_string = "...")
20
- l=0
21
- char_array=text.unpack("U*")
22
- char_array.each_with_index do |c, i|
23
- l = l+ (c<127 ? 0.5 : 1)
24
- if l>=length
25
- return char_array[0..i].pack("U*")+(i<char_array.length-1 ? truncate_string : "")
26
- end
27
- end
28
- return text
29
- end
30
-
31
- # 金额大写小转换
32
- def self.uppercase(nums)
33
- cstr = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"]
34
- cn_nums1 = ["元", "拾", "佰", "仟", "萬", "拾", "佰", "仟", "億", "拾", "佰", "仟"]
35
- cn_nums2 = ['分', '角']
36
- s = ""
37
- # 整数部分
38
- array = nums.to_s.split(".")
39
- p h = array[0].to_s.split(//)
40
- ai = h.count
41
- h.each_with_index do |a, j|
42
- s+=cstr[a.to_i]+cn_nums1[ai-1]
43
- ai=ai-1
44
- end
45
- # 小数部分
46
- p h1 = array[1].to_s.split(//)
47
- aj = h1.count
48
- h1.each_with_index do |o, p|
49
- s+=cstr[o.to_i]+cn_nums2[aj-1]
50
- aj=aj-1
51
- end
52
- rstr = ""
53
- rstr=s.gsub("拾零", "拾")
54
- rstr=rstr.gsub("零拾", "零");
55
- rstr=rstr.gsub("零佰", "零");
56
- rstr=rstr.gsub("零仟", "零");
57
- rstr=rstr.gsub("零萬", "萬");
58
- for i in 1..6 do
59
- rstr=rstr.gsub("零零", "零");
60
- rstr=rstr.gsub("零萬", "零");
61
- rstr=rstr.gsub("零億", "億");
62
- rstr=rstr.gsub("零零", "零");
63
- end
64
- rstr=rstr.gsub("零角", "零");
65
- rstr=rstr.gsub("零分", "");
66
- rstr=rstr.gsub("零元", "");
67
- end
68
-
69
3
  require 'net/http'
70
4
  require 'net/https'
71
5
  require 'uri'
72
-
73
- # get请求
74
- # 参数url:网址,params:参数,header:请求头json类型如:{'Accept' => 'application/json', 'X-Requested-With' => 'XMLHttpRequest'}
75
- # 返回response对象,response.code 状态200/304/404;response.body 内容
76
6
  def self.get(url, params=nil, header=nil)
77
7
  uri = URI.parse(url)
78
8
  http = Net::HTTP.new(uri.host, uri.port)
@@ -86,10 +16,6 @@ module Struggle
86
16
  end
87
17
  http.request(request)
88
18
  end
89
-
90
- # post请求
91
- # 参数url:网址,params:参数,header:请求头json类型如:{'Accept' => 'application/json', 'X-Requested-With' => 'XMLHttpRequest'}
92
- # 返回response对象,response.code 状态200/304/404;response.body 内容
93
19
  def self.post(url, params=nil, header=nil)
94
20
  uri = URI.parse(url)
95
21
  http = Net::HTTP.new(uri.host, uri.port)
@@ -5,66 +5,14 @@ module Struggle
5
5
  require 'json'
6
6
  URL = "http://api.kuaidi100.com/api"
7
7
  URL_loophold = "http://www.kuaidi100.com/query"
8
- # 快递100免费物流码接口
9
- # 参数:
10
- # id String 是 身份授权key,请 快递查询接口 进行申请(大小写敏感)
11
- # com String 是 要查询的快递公司代码,不支持中文,对应的公司代码见
12
- # nu String 是 要查询的快递单号,请勿带特殊符号,不支持中文(大小写不敏感)
13
- # show String 是 返回类型:
14
- # 0:返回json字符串,
15
- # 1:返回xml对象,
16
- # 2:返回html对象,
17
- # 3:返回text文本。
18
- # 如果不填,默认返回json字符串。
19
- # muti String 是 返回信息数量:
20
- # 1:返回多行完整的信息,
21
- # 0:只返回一行信息。
22
- # 不填默认返回多行。
23
- # order String 是 排序:
24
- # desc:按时间由新到旧排列,
25
- # asc:按时间由旧到新排列。
26
- # 不填默认返回倒序(大小写不敏感)
27
- # 返回:json格式数据
28
- # com 物流公司编号
29
- # nu 物流单号
30
- # time 每条跟踪信息的时间
31
- # context 每条跟综信息的描述
32
- # state 快递单当前的状态 : 
33
- # 0:在途,即货物处于运输过程中;
34
- # 1:揽件,货物已由快递公司揽收并且产生了第一条跟踪信息;
35
- # 2:疑难,货物寄送过程出了问题;
36
- # 3:签收,收件人已签收;
37
- # 4:退签,即货物由于用户拒签、超区等原因退回,而且发件人已经签收;
38
- # 5:派件,即快递正在进行同城派件;
39
- # 6:退回,货物正处于退回发件人的途中;
40
- # 该状态还在不断完善中,若您有更多的参数需求,欢迎发邮件至 kuaidi@kingdee.com 提出。
41
- # status 查询结果状态:
42
- # 0:物流单暂无结果,
43
- # 1:查询成功,
44
- # 2:接口出现异常,
8
+
45
9
  def self.send_by_free(id, com, nu, show="json", muti=1, order="desc")
46
10
  respond = Func.get(URL, {'id' => id, 'com' => com, 'nu' => nu, 'show' => show, 'muti' => muti, 'order' => order})
47
11
  puts respond.body
48
12
  return respond.body.blank? ? nil : JSON.parse(respond.body)
49
13
  end
50
14
 
51
- # 快递100免费物流码接口
52
- # 参数:
53
- # type: 物流公司
54
- # postid: 物流码
55
- #返回结果实例:json类型
56
- #{"message":"ok","nu":"200093247451","ischeck":"1","com":"yuantong","status":"200","condition":"F00","state":"3",
57
- # "data":
58
- # [{"time":"2015-04-15 09:09:56","context":"客户 签收人 : 张 已签收","ftime":"2015-04-15 09:09:56"},
59
- # {"time":"2015-04-15 09:03:00","context":"山东省潍坊市潍城区十笏园分部公司派件人 : 邹辉 派件中 派件员电话","ftime":"2015-04-15 09:03:00"},
60
- # {"time":"2015-04-14 09:09:16","context":"山东省潍坊市潍城区十笏园分部公司 失败签收录入 于明鑫","ftime":"2015-04-14 09:09:16"},
61
- # {"time":"2015-04-14 09:03:59","context":"山东省潍坊市潍城区十笏园分部公司派件人 : 邹辉 派件中 派件员电话","ftime":"2015-04-14 09:03:59"},
62
- # {"time":"2015-04-14 07:15:57","context":"快件到达 山东省潍坊市潍城区十笏园分部公司","ftime":"2015-04-14 07:15:57"},
63
- # {"time":"2015-04-14 05:50:25","context":"山东省潍坊市公司 已发出,下一站 山东省潍坊市潍城区十笏园分部","ftime":"2015-04-14 05:50:25"},
64
- # {"time":"2015-04-14 04:07:09","context":"潍坊转运中心公司 已发出,下一站 山东省潍坊市","ftime":"2015-04-14 04:07:09"},
65
- # {"time":"2015-04-11 19:30:06","context":"浙江省金华市义乌市凌云公司 已打包,发往下一站 潍坊转运中心","ftime":"2015-04-11 19:30:06"},
66
- # {"time":"2015-04-11 17:58:41","context":"浙江省金华市义乌市凌云公司 已揽收","ftime":"2015-04-11 17:58:41"}]
67
- # }
15
+
68
16
  def self.send_by_loophold(type, postid)
69
17
  respond = Func.post(URL_loophold, {'type' => type, 'postid' => postid})
70
18
  return respond.body.blank? ? nil : JSON.parse(respond.body)
@@ -1,21 +1,10 @@
1
- #gemfile中加入 gem 'iconv'
2
1
  module Struggle
3
2
  class PayGateway
4
3
  require 'net/https'
5
4
  require 'uri'
6
- # 支付接口地址
7
5
  URL_UTF8 = "https://pay3.chinabank.com.cn/PayGate?encoding=UTF-8"
8
- # 图片和css文件地址
9
6
  URL = "https://pay3.chinabank.com.cn"
10
- # 功能:网银在线,网管支付;
11
- # 参数:
12
- # v_mid:商户编号
13
- # key:商户md5密钥
14
- # v_url:支付成功后跳转的页面
15
- # remark2:异步订单状态地址
16
- # v_oid:订单编号
17
- # v_amount:订单金额
18
- # v_moneytype:支付货币类型
7
+
19
8
  def self.pay(v_mid, key, v_url, remark2, v_oid, v_amount, v_moneytype = "CNY")
20
9
  v_md5info = Digest::MD5.hexdigest(v_amount.to_s + v_moneytype + v_oid + v_mid + v_url + key).upcase
21
10
  html = '<html><head></head><body>'
@@ -37,19 +26,12 @@ module Struggle
37
26
  html += '</body></html>'
38
27
  end
39
28
 
40
- # 功能:自动验证结果
41
- # 参数:
42
- # params参数
43
- # key商户的md5密钥
44
- # 返回:如果支付成功返回订单号,否则返回nil
45
29
  def self.receive(params, key)
46
30
  v_oid = params["v_oid"]
47
31
  v_pstatus = params["v_pstatus"]
48
- v_md5str = params["v_md5str"] #该参数的MD5字符串的顺序为:v_oid,v_pstatus,v_amount,v_moneytype,key
32
+ v_md5str = params["v_md5str"]
49
33
  v_amount = params["v_amount"]
50
34
  v_moneytype = params["v_moneytype"]
51
- # 20(表示支付成功)
52
- # 30(表示支付失败)
53
35
  if v_pstatus=="20" && v_md5str==Digest::MD5.hexdigest(v_oid+v_pstatus+v_amount+v_moneytype+key).upcase
54
36
  return {state: true, code: params["v_oid"], amount: v_amount}
55
37
  else
@@ -1,8 +1,5 @@
1
1
  module Struggle
2
2
  class Tfile
3
- #file upload
4
- #params: file->file stream,filepath->file save path,rule->can upload file format("jpg|xls"),minsize and maxsize->minsize<file's size<maxsize
5
- #return: {state: true, result: "new filename"} or {state: false, result: "error message"}
6
3
  def Tfile.upload(file, filepath="", rule="jpg|xls", minsize=1, maxsize=4000)
7
4
  result = Tfile.rule_validata(file, rule, minsize, maxsize)
8
5
  if result[:state]
@@ -25,10 +22,6 @@ module Struggle
25
22
  end
26
23
  end
27
24
 
28
- #file unpack(before unpack run `sudo apt-get install unzip unrar -y` || insert gemfile)
29
- #file->file path
30
- #path->unpacked path
31
- #return->true, false, nil. nil not cmd
32
25
  def Tfile.unpack(file, path)
33
26
  format = Tfile.file_format(file)
34
27
  cmd = ""
@@ -42,9 +35,6 @@ module Struggle
42
35
  system cmd
43
36
  end
44
37
 
45
- #validate file
46
- #params:file->file stream,rule->can upload file format,minsize<file's size<maxsize
47
- #return:{state: true} or return {state: false, message: "error message"}
48
38
  def Tfile.rule_validata(file, rule, minsize, maxsize)
49
39
  rule_for = Tfile.filename_validata(file, rule)
50
40
  unless rule_for
@@ -56,16 +46,10 @@ module Struggle
56
46
  return {state: true}
57
47
  end
58
48
 
59
- #validate file format
60
- #params: file-> file stream; rule-> validate rule ("jpg|xls")
61
- #return: validate result -> true | false
62
49
  def Tfile.filename_validata(file, rule)
63
50
  !eval("/\.(#{rule})+$/").match(file.original_filename).blank?
64
51
  end
65
52
 
66
- #get new file's name
67
- #params:filestream->file stream file name,filepath->file save path
68
- #return:new file's name
69
53
  def Tfile.getname(filestream, filepath)
70
54
  file_for = Tfile.file_format(filestream.original_filename)
71
55
  filename = Time.now.strftime("%Y%m%d%h%m%s")<<rand(99999).to_s<<file_for
@@ -77,16 +61,10 @@ module Struggle
77
61
  filename
78
62
  end
79
63
 
80
- #get file format
81
- #params: filename->file's name
82
- #return: file format '.jpg','.exe'
83
64
  def Tfile.file_format(filename)
84
65
  /\.[^\.]+$/.match(filename)[0]
85
66
  end
86
67
 
87
- #image upload
88
- #params: file->file stream; filepath->file save path; rule->can upload file format("jpg|xls"); minsize and maxsize->minsize<file's size<maxsize; w->new image width, h->new image height
89
- #return: {state: true, result: "new filename"} or {state: false, result: "error message"}
90
68
  def Tfile.imageupload(imgfile, filepath="", rule="jpg|jpeg", minsize=0, maxsize=2000, w=0, h=0)
91
69
  result = Tfile.rule_validata(imgfile, rule, minsize, maxsize)
92
70
  if result[:state]
@@ -110,15 +88,10 @@ module Struggle
110
88
  end
111
89
  end
112
90
 
113
- #delete dir
114
- #params: dir-> dir path
115
- #return true or false
116
91
  def Tfile.rmdir(dir)
117
92
  system("rm -rf #{dir}")
118
93
  end
119
94
 
120
- #image resize
121
- #params: imagepath-> image file path; w-> new image width; h-> new image height
122
95
  def Tfile.resize(imagepath, w, h)
123
96
  img = Magick::Image.read(imagepath)[0]
124
97
  if w==0 || h==0
@@ -1,17 +1,10 @@
1
1
  module Struggle
2
2
  class Tmagick
3
- #画图类
4
- #img->底图 "#{Rails.root}/public/images/1.jpg"
5
- #newimg->处理完保存的地址 save img handle path example->"#{Rails.root}/public/images/new.jpg"
6
- #example-> Tmagick.new("1.jpg","public/n.jpg").images(images),texts(texts).images(imgs).write
7
3
  def initialize(img, newimg=nil)
8
4
  @pushimg = Magick::Image.read(img).first
9
5
  @poppath = newimg.blank? ? img : newimg
10
6
  end
11
7
 
12
- #图片叠加和水印
13
- #images->多图片叠加,数组,在一个图片上画多个图片; image=>{img: "1.jpg", x: 0, y: 0},img要画的图片地址,xy画的左顶点位置
14
- #return->成功返回当前对象,失败返回nil
15
8
  def images(images)
16
9
  return nil if images.blank?
17
10
  images.each do |img|
@@ -21,10 +14,6 @@ module Struggle
21
14
  return self
22
15
  end
23
16
 
24
- #图片上写字
25
- #fontobjs 文字数组; fontobj=>{text: "aaaaaaaaa",color: "#000000",font: "simsun.ttc'",size: 20,weight: 100, x: 0, y: 0}
26
- # text文字内容,color颜色,font字体,size大小,weight粗细,xy画的左顶点位置
27
- #return-》成功返回当前对象,失败返回nil
28
17
  def texts(texts)
29
18
  return nil if texts.blank?
30
19
  texts.each do |text|
@@ -38,13 +27,11 @@ module Struggle
38
27
  return self
39
28
  end
40
29
 
41
- #重定义图片大小
42
30
  def resize(new_width, new_height)
43
31
  @pushimg = Magick::Image.read(@pushimg).first.resize_to_fit(new_width, new_height)
44
32
  @pushimg.blank? ? nil : self
45
33
  end
46
34
 
47
- #写出操作
48
35
  def write
49
36
  @pushimg.write(@poppath)
50
37
  end
@@ -1,19 +1,6 @@
1
- #first gem 'rmagick'
2
1
  module Struggle
3
2
  class Vcode
4
- #controller
5
- #def getcode
6
- # vcode = Vcode.getvcode
7
- # session[:code]=vcode[:code]
8
- # send_data vcode[:img], content_type: 'image/jpeg', disposition: 'inline'
9
- #end
10
- #view
11
- # <img src="/getcode">
12
- #Vcode.getvcode(90,40,24)
13
- #w宽,h高,fontsize字体大小
14
- #返回json类型
15
3
  def self.getvcode(w=90, h=40, fontsize=24)
16
- #创建画布
17
4
  img = Magick::Image.new(w, h) {
18
5
  self.background_color = 'white'
19
6
  self.format="JPG"
@@ -22,26 +9,20 @@ module Struggle
22
9
  text.pointsize = fontsize
23
10
  text.kerning = -1
24
11
  text.fill('blue')
25
- #随机文字
26
12
  code=""
27
13
  4.times { code << (97 + rand(26)).chr }
28
- #设置文字
29
14
  text.text(rand(w/2-5), h/2-5+ rand(h/2), code)
30
- #随机直线
31
15
  for i in 1..rand(4)
32
- text.line(rand(w), rand(h), rand(w), rand(h)) #直线
16
+ text.line(rand(w), rand(h), rand(w), rand(h))
33
17
  end
34
18
  text.fill('blue')
35
- #燥点
36
19
  for i in 1..280
37
20
  text.point(rand(w), rand(h))
38
21
  end
39
22
  text.draw(img)
40
- #模糊
41
23
  img = img.sketch(0, 10, 50)
42
24
  #扭曲
43
25
  img = img.wave(5.5, 50)
44
- #返回图片数据流
45
26
  {img: img.to_blob, code: code}
46
27
  end
47
28
  end
data/lib/struggle.rb CHANGED
@@ -15,3 +15,4 @@ require 'struggle/tmagick'
15
15
  require 'struggle/vcode'
16
16
  require 'struggle/concerns/string_extend'
17
17
  String.send :include, StringExtend
18
+ Integer.send :include, IntExtend
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: struggle
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - lean
@@ -47,6 +47,7 @@ extra_rdoc_files:
47
47
  files:
48
48
  - README.md
49
49
  - lib/struggle.rb
50
+ - lib/struggle/concerns/int_extend.rb
50
51
  - lib/struggle/concerns/string_extend.rb
51
52
  - lib/struggle/func.rb
52
53
  - lib/struggle/logistic.rb
@@ -56,7 +57,6 @@ files:
56
57
  - lib/struggle/tfile.rb
57
58
  - lib/struggle/tmagick.rb
58
59
  - lib/struggle/vcode.rb
59
- - struggle.gemspec
60
60
  homepage: http://rubygems.org/gems/struggle
61
61
  licenses:
62
62
  - struggle
data/struggle.gemspec DELETED
@@ -1,16 +0,0 @@
1
- Gem::Specification.new do |s|
2
- s.name = 'struggle'
3
- s.version = '1.6.0'
4
- s.date = '2015-08-21'
5
- s.summary = "struggle!"
6
- s.description = "vcode,tfile,pager,func,logistic,pay_gateway,tmagick,class_extend;"
7
- s.authors = ["lean"]
8
- s.email = '54850915@qq.com'
9
- s.files = `git ls-files`.split("\n")
10
- s.extra_rdoc_files = ['README.md']
11
- #s.require_paths = ['lib']
12
- s.add_development_dependency 'iconv', ['>= 0']
13
- s.add_development_dependency 'rmagick', ['>= 0']
14
- s.homepage = 'http://rubygems.org/gems/struggle'
15
- s.license = 'struggle'
16
- end