struggle 1.0.0 → 1.0.1

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: dee0381b24c640f7fdb7ec45f1b5c3c3b94c76e3
4
- data.tar.gz: 6b1cc72b0cef5842b1280e10dc0cba5fb0ab22b3
3
+ metadata.gz: 9bbf88fe4cb0e679ed14abd2ccc9fcc9688231d1
4
+ data.tar.gz: 49e005b94ebffaed197071833cf52d85fe76572e
5
5
  SHA512:
6
- metadata.gz: fe92494773281a0ed338992f7af720e393c18bfded35ef057a247eb8457e79e1c63b3d2e57d3a0e76233c6be6d2bd0751a342016c5aeb6e14c3b5aff0a345fad
7
- data.tar.gz: bedee4c685ef80ad10b1f7035b7c025595309aa96f8bb4c164d0f950571228db04c822d9dce937b3015e44493d208813da804b66db4dabcf496b870765bb9e3c
6
+ metadata.gz: f147766b13ea1c80957937643bff582806a43b9b05b3544a54971e3a8c2f4756262a4726ec0143241aad87d444a04caf21554d64ba7bc3e4650b5417c6582b6e
7
+ data.tar.gz: b573ae89712ea8c06f6cf1e2a6f2636c13bd416397efde16b7dfe93c837028a346093395c29246fc2f8e631ccc7a64c929ea885863d9bddccb3e5690c7839f4e
@@ -0,0 +1,115 @@
1
+ module Struggle
2
+ class Fileupload
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
+ def Fileupload.upload(file, filepath="", rule="jpg|xls", minsize=1, maxsize=4000)
7
+ result = Fileupload.rule_validata(file, rule, minsize, maxsize)
8
+ if result[:state]
9
+ sname = Fileupload.getname(file, filepath)
10
+ begin
11
+ unless Dir::exist?(filepath)
12
+ unless system("mkdir -p #{filepath}")
13
+ return {state: false, result: "目录创建失败,请于管理员联系"}
14
+ end
15
+ end
16
+ File.open(filepath+sname, "wb") do |f|
17
+ f.write(file.read)
18
+ end
19
+ return {state: true, result: sname}
20
+ rescue
21
+ return {state: false, result: "写入文件失败:#{$!}"}
22
+ end
23
+ else
24
+ return {state: false, result: result[:message]}
25
+ end
26
+ end
27
+
28
+ #validate file
29
+ #params:file->file stream,rule->can upload file format,minsize<file's size<maxsize
30
+ #return:{state: true} or return {state: false, message: "error message"}
31
+ def Fileupload.rule_validata(file, rule, minsize, maxsize)
32
+ rule_for = Fileupload.filename_validata(file, rule)
33
+ unless rule_for
34
+ return {state: false, message: "错误:文件格式不对,只允许上传#{rule}格式!\\n"}
35
+ end
36
+ if file.size<minsize*1024 || file.size>maxsize*1024
37
+ return {state: false, message: "错误:文件大小错误,只允许#{minsize}kb~#{maxsize}kb!\\n"}
38
+ end
39
+ return {state: true}
40
+ end
41
+
42
+ #validate file format
43
+ #params: file-> file stream; rule-> validate rule ("jpg|xls")
44
+ #return: validate result -> true | false
45
+ def Fileupload.filename_validata(file, rule)
46
+ !eval("/\.(#{rule})+$/").match(file.original_filename).blank?
47
+ end
48
+
49
+ #get new file's name
50
+ #params:filestream->file stream file name,filepath->file save path
51
+ #return:new file's name
52
+ def Fileupload.getname(filestream, filepath)
53
+ file_for = Fileupload.file_format(filestream.original_filename)
54
+ filename = Time.now.strftime("%Y%m%d%h%m%s")<<rand(99999).to_s<<file_for
55
+ file = filepath+filename
56
+ while File.exist?(file) do
57
+ filename = Time.now.strftime("%Y%m%d%h%m%s")<<rand(99999).to_s<<file_for
58
+ file = filepath+filename
59
+ end
60
+ filename
61
+ end
62
+
63
+ #get file format
64
+ #params: filename->file's name
65
+ #return: file format '.jpg','.exe'
66
+ def Fileupload.file_format(filename)
67
+ /\.[^\.]+$/.match(filename)[0]
68
+ end
69
+
70
+ #image upload
71
+ #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
72
+ #return: {state: true, result: "new filename"} or {state: false, result: "error message"}
73
+ def Fileupload.imageupload(imgfile, filepath="", rule="jpg|jpeg", minsize=0, maxsize=2000, w=0, h=0)
74
+ result = Fileupload.rule_validata(imgfile, rule, minsize, maxsize)
75
+ if result[:state]
76
+ sname = Fileupload.getname(imgfile, filepath)
77
+ begin
78
+ unless Dir::exist?(filepath)
79
+ unless system("mkdir -p #{filepath}")
80
+ return {state: false, result: "目录创建失败,请于管理员联系"}
81
+ end
82
+ end
83
+ File.open(filepath+sname, "wb") do |f|
84
+ f.write(imgfile.read)
85
+ end
86
+ Fileupload.resize(filepath + sname, w, h)
87
+ return {state: true, result: sname}
88
+ rescue
89
+ return {state: false, result: "写入图片失败:#{$!}"}
90
+ end
91
+ else
92
+ return {state: false, result: result[:message]}
93
+ end
94
+ end
95
+
96
+ #delete dir
97
+ #params: dir-> dir path
98
+ #return true or false
99
+ def Fileupload.rmdir(dir)
100
+ system("rm -rf #{dir}")
101
+ end
102
+
103
+ #image resize
104
+ #params: imagepath-> image file path; w-> new image width; h-> new image height
105
+ def Fileupload.resize(imagepath, w, h)
106
+ img = Magick::Image.read(imagepath)[0]
107
+ if w==0 || h==0
108
+ w=img.columns
109
+ h=img.rows
110
+ end
111
+ newimg = img.resize_to_fill(w, h)
112
+ newimg.write(imagepath)
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,104 @@
1
+ module Struggle
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
+ require 'net/http'
70
+ require 'net/https'
71
+ require 'uri'
72
+
73
+ # get请求
74
+ # 参数url:网址,header:请求头json类型如:{'Accept' => 'application/json', 'X-Requested-With' => 'XMLHttpRequest'}
75
+ # 返回response对象,response.code 状态200/304/404;response.body 内容
76
+ def self.get(url, params=nil, header=nil)
77
+ uri = URI.parse(url)
78
+ http = Net::HTTP.new(uri.host, uri.port)
79
+ http.use_ssl = true if uri.scheme == 'https'
80
+ request = Net::HTTP::Get.new(uri.request_uri)
81
+ if !params.blank?
82
+ request.form_data = params
83
+ end
84
+ if !header.nil?
85
+ request.initialize_http_header(header)
86
+ end
87
+ http.request(request)
88
+ end
89
+
90
+ def self.post(url, params=nil, header=nil)
91
+ uri = URI.parse(url)
92
+ http = Net::HTTP.new(uri.host, uri.port)
93
+ http.use_ssl = true if uri.scheme == 'https'
94
+ request = Net::HTTP::Post.new(uri.request_uri)
95
+ if !params.blank?
96
+ request.set_form_data(params)
97
+ end
98
+ if !header.nil?
99
+ request.initialize_http_header(header)
100
+ end
101
+ http.request(request)
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,67 @@
1
+ module Struggle
2
+ class Pager
3
+ def initialize(dqyclass='page-navigator-current PNNW-S', aclass='page-navigator-number PNNW-S',
4
+ spageclass='page-navigator-prev', xpageclass='page-navigator-next', spagedis='page-navigator-prev-disable',
5
+ xpagedis='page-navigator-next-disable', dianclass='page-navigator-dots')
6
+ @dqyclass = dqyclass
7
+ @aclass = aclass
8
+ @spageclass = spageclass
9
+ @xpageclass = xpageclass
10
+ @spagedis = spagedis
11
+ @xpagedis = xpagedis
12
+ @dianclass = dianclass
13
+ end
14
+
15
+ def getpage(currentpage, pagecount, route)
16
+ shenglvhao = "<span class='#{@dianclass}'>...</span>"
17
+ syiye = currentpage>1 ? "<a class='#{@spageclass}' href='#{route}#{currentpage-1}'>&lt;上一页</a>" : "<span class='#{@spagedis}'>&lt;上一页</span>"
18
+ xyiye = currentpage<pagecount ? "<a class='#{@xpageclass}' href='#{route}#{currentpage+1}'>下一页&gt;</a>" : "<span class='#{@xpagedis}'>&lt;下一页</span>"
19
+ pages=""
20
+ if currentpage<7 && pagecount>10
21
+ for i in 1..9
22
+ if currentpage==i
23
+ pages += "<span class='#{@dqyclass}'>#{currentpage}</span>"
24
+ else
25
+ pages += "<a class='#{@aclass}' href='#{route}#{i}'>#{i}</a>"
26
+ end
27
+ end
28
+ pages += shenglvhao
29
+ pages += "<a class='#{@aclass}' href='#{route}#{pagecount}'>#{pagecount}</a>"
30
+ elsif currentpage>=7 && currentpage<=pagecount-7
31
+ pages = "<a class='#{@aclass}' href='1'>1</a>"
32
+ pages += shenglvhao
33
+ pages += "<a class='#{@aclass}S' href='#{route}#{currentpage-4}'>#{currentpage-4}</a>"
34
+ pages += "<a class='#{@aclass}' href='#{route}#{currentpage-3}'>#{currentpage-3}</a>"
35
+ pages += "<a class='#{@aclass}' href='#{route}#{currentpage-2}'>#{currentpage-2}</a>"
36
+ pages += "<a class='#{@aclass}' href='#{route}#{currentpage-1}'>#{currentpage-1}</a>"
37
+ pages += "<span class='#{@dqyclass}'>#{currentpage}</span>"
38
+ pages += "<a class='#{@aclass}' href='#{route}#{currentpage+1}'>#{currentpage+1}</a>"
39
+ pages += "<a class='#{@aclass}' href='#{route}#{currentpage+2}'>#{currentpage+2}</a>"
40
+ pages += "<a class='#{@aclass}' href='#{route}#{currentpage+3}'>#{currentpage+3}</a>"
41
+ pages += "<a class='#{@aclass}' href='#{route}#{currentpage+4}'>#{currentpage+4}</a>"
42
+ pages += shenglvhao
43
+ pages += "<a class='#{@aclass}' href='#{route}#{pagecount}'>#{pagecount}</a>"
44
+ elsif currentpage>=7 && currentpage>pagecount-7
45
+ pages = "<a class='#{@aclass}' href='1'>1</a>"
46
+ pages += shenglvhao
47
+ for i in 1..9
48
+ fpage = pagecount-9+i
49
+ if currentpage == fpage
50
+ pages += "<span class='#{@dqyclass}'>#{currentpage}</span>"
51
+ else
52
+ pages += "<a class='#{@aclass}' href='#{route}#{fpage}'>#{fpage}</a>"
53
+ end
54
+ end
55
+ elsif currentpage>0 && pagecount<=10
56
+ for i in 1..10
57
+ if currentpage==i
58
+ pages += "<span class='#{@dqyclass}'>#{currentpage}</span>"
59
+ else
60
+ pages += "<a class='#{@aclass}' href='#{route}#{i}'>#{i}</a>"
61
+ end
62
+ end
63
+ end
64
+ syiye + pages +xyiye
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,49 @@
1
+ #gemfile中加入 gem 'iconv'
2
+ module Struggle
3
+ class PayGateway
4
+ require 'net/https'
5
+ require 'uri'
6
+ # 支付接口地址
7
+ URL_UTF8 = "https://pay3.chinabank.com.cn/PayGate?encoding=UTF-8"
8
+ # 图片和css文件地址
9
+ 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:支付货币类型
19
+ def self.pay(v_mid, key, v_url, remark2, v_oid, v_amount, v_moneytype = "CNY")
20
+ v_md5info = Digest::MD5.hexdigest(v_amount.to_s + v_moneytype + v_oid + v_mid + v_url + key).upcase
21
+ response = Func.post(URL_UTF8, {'v_mid' => v_mid, 'v_oid' => v_oid, 'v_amount' => v_amount, 'v_moneytype' => v_moneytype, 'v_url' => v_url, 'v_md5info' => v_md5info, 'remark2' => remark2})
22
+ html = Iconv.iconv('utf-8', 'gbk', response.body).first
23
+ html.scan(/[href|src]=("[^"]*.[css|js|gif|jpg]")/).each do |h|
24
+ html = html.gsub(h[0], URL+eval(h[0]).gsub('..', ''))
25
+ end
26
+ html
27
+ end
28
+
29
+ # 功能:自动验证结果
30
+ # 参数:
31
+ # params参数
32
+ # key商户的md5密钥
33
+ # 返回:如果支付成功返回订单号,否则返回nil
34
+ def self.receive(params, key)
35
+ v_oid = params["v_oid"]
36
+ v_pstatus = params["v_pstatus"]
37
+ v_md5str = params["v_md5str"] #该参数的MD5字符串的顺序为:v_oid,v_pstatus,v_amount,v_moneytype,key
38
+ v_amount = params["v_amount"]
39
+ v_moneytype = params["v_moneytype"]
40
+ # 20(表示支付成功)
41
+ # 30(表示支付失败)
42
+ if v_pstatus=="20" && v_md5str==Digest::MD5.hexdigest(v_oid+v_pstatus+v_amount+v_moneytype+key)
43
+ return params["v_oid"]
44
+ else
45
+ return nil
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,12 @@
1
+ module Struggle
2
+ class Sms
3
+ URL = "http://api.cnsms.cn/"
4
+ require 'net/https'
5
+ require 'uri'
6
+
7
+ def Sms.send(uid, pwd, mobile, content)
8
+ response = Func.post(URL, {'ac' => "send", 'uid' => uid, 'pwd' => pwd, 'mobile' => mobile, 'content' => content})
9
+ return response.body=="100"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,52 @@
1
+ module Struggle
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
+ def initialize(img, newimg=nil)
8
+ @pushimg = Magick::Image.read(img).first
9
+ @poppath = newimg.blank? ? img : newimg
10
+ end
11
+
12
+ #图片叠加和水印
13
+ #images->多图片叠加,数组,在一个图片上画多个图片; image=>{img: "1.jpg", x: 0, y: 0},img要画的图片地址,xy画的左顶点位置
14
+ #return->成功返回当前对象,失败返回nil
15
+ def images(images)
16
+ return nil if images.blank?
17
+ images.each do |img|
18
+ image = Magick::Image.read(img[:img]).first.resize_to_fit(img[:w], img[:h])
19
+ @pushimg.composite!(image, img[:x], img[:y], Magick::OverCompositeOp)
20
+ end
21
+ return self
22
+ end
23
+
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
+ def texts(texts)
29
+ return nil if texts.blank?
30
+ texts.each do |text|
31
+ copyright = Magick::Draw.new
32
+ copyright.font = text[:font]
33
+ copyright.pointsize = text[:size]
34
+ copyright.font_weight = text[:weight]
35
+ copyright.fill = text[:color]
36
+ copyright.annotate(@pushimg, 0, 0, text[:x], text[:y]+12, text[:text])
37
+ end
38
+ return self
39
+ end
40
+
41
+ #重定义图片大小
42
+ def resize(new_width, new_height)
43
+ @pushimg = Magick::Image.read(@pushimg).first.resize_to_fit(new_width, new_height)
44
+ @pushimg.blank? ? nil : self
45
+ end
46
+
47
+ #写出操作
48
+ def write
49
+ @pushimg.write(@poppath)
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,48 @@
1
+ #first gem 'rmagick'
2
+ module Struggle
3
+ 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
+ def self.getvcode(w=90, h=40, fontsize=24)
16
+ #创建画布
17
+ img = Magick::Image.new(w, h) {
18
+ self.background_color = 'white'
19
+ self.format="JPG"
20
+ }
21
+ text= Magick::Draw.new
22
+ text.pointsize = fontsize
23
+ text.kerning = -1
24
+ text.fill('blue')
25
+ #随机文字
26
+ code=""
27
+ 4.times { code << (97 + rand(26)).chr }
28
+ #设置文字
29
+ text.text(rand(w/2-5), h/2-5+ rand(h/2), code)
30
+ #随机直线
31
+ for i in 1..rand(4)
32
+ text.line(rand(w), rand(h), rand(w), rand(h)) #直线
33
+ end
34
+ text.fill('blue')
35
+ #燥点
36
+ for i in 1..280
37
+ text.point(rand(w), rand(h))
38
+ end
39
+ text.draw(img)
40
+ #模糊
41
+ img = img.sketch(0, 10, 50)
42
+ #扭曲
43
+ img = img.wave(5.5, 50)
44
+ #返回图片数据流
45
+ {img: img.to_blob, code: code}
46
+ end
47
+ end
48
+ end
data/lib/struggle.rb ADDED
@@ -0,0 +1,14 @@
1
+ module Struggle
2
+ end
3
+ begin
4
+ require 'rails'
5
+ rescue LoadError
6
+ #do nothing
7
+ end
8
+ require 'struggle/fileupload'
9
+ require 'struggle/func'
10
+ require 'struggle/pager'
11
+ require 'struggle/pay_gateway'
12
+ require 'struggle/sms'
13
+ require 'struggle/tmagick'
14
+ require 'struggle/vcode'
data/struggle.gemspec ADDED
@@ -0,0 +1,16 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'struggle'
3
+ s.version = '1.0.1'
4
+ s.date = '2015-06-20'
5
+ s.summary = "struggle!"
6
+ s.description = "vcode,fileupload,pager,func,pay_gateway,tmagick;"
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
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.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - lean
@@ -14,28 +14,28 @@ dependencies:
14
14
  name: iconv
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rmagick
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  description: vcode,fileupload,pager,func,pay_gateway,tmagick;
@@ -46,6 +46,15 @@ extra_rdoc_files:
46
46
  - README.md
47
47
  files:
48
48
  - README.md
49
+ - lib/struggle.rb
50
+ - lib/struggle/fileupload.rb
51
+ - lib/struggle/func.rb
52
+ - lib/struggle/pager.rb
53
+ - lib/struggle/pay_gateway.rb
54
+ - lib/struggle/sms.rb
55
+ - lib/struggle/tmagick.rb
56
+ - lib/struggle/vcode.rb
57
+ - struggle.gemspec
49
58
  homepage: http://rubygems.org/gems/struggle
50
59
  licenses:
51
60
  - struggle
@@ -56,17 +65,17 @@ require_paths:
56
65
  - lib
57
66
  required_ruby_version: !ruby/object:Gem::Requirement
58
67
  requirements:
59
- - - ">="
68
+ - - '>='
60
69
  - !ruby/object:Gem::Version
61
70
  version: '0'
62
71
  required_rubygems_version: !ruby/object:Gem::Requirement
63
72
  requirements:
64
- - - ">="
73
+ - - '>='
65
74
  - !ruby/object:Gem::Version
66
75
  version: '0'
67
76
  requirements: []
68
77
  rubyforge_project:
69
- rubygems_version: 2.4.3
78
+ rubygems_version: 2.4.8
70
79
  signing_key:
71
80
  specification_version: 4
72
81
  summary: struggle!