ical_importer 0.2.0 → 0.3.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 +8 -8
- data/CHANGELOG.markdown +5 -0
- data/README.md +7 -0
- data/ical_importer.gemspec +2 -1
- data/lib/ical_importer.rb +2 -1
- data/lib/ical_importer/parser.rb +5 -5
- data/lib/ical_importer/recurrence_event_builder.rb +5 -5
- data/lib/ical_importer/remote_event.rb +12 -8
- data/lib/ical_importer/single_event_builder.rb +16 -15
- data/lib/ical_importer/version.rb +1 -1
- data/spec/ical_importer/parser_spec.rb +5 -5
- data/spec/ical_importer/recurrence_event_builder_spec.rb +6 -6
- data/spec/ical_importer/remote_event_spec.rb +7 -7
- data/spec/ical_importer/single_event_builder_spec.rb +2 -2
- data/spec/support/mn_twins.ics +5 -5
- metadata +18 -4
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YzgyNDVmMDk4MjIxZDE5ZjgxYWZlZjBmN2EwMmVmMGEwOTkwNmZmNQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NWE0MzY0YTNlZjk2YjA2MDA5YmJmOTZiZGM3MTY2ZTJhOTM4Y2M1YQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
Yzk4YWUyMjdjMjZkOWM5MGRkMjZiMzZjODI5YTU3NjMyNjVmYzliNTQ4MzQ4
|
10
|
+
NDZiNjc4ZjdlOTNlMzE5OGYyMTUyOWI0OTEwYzk0YzViNWIzNmQwNGRhMTIz
|
11
|
+
ZjMwNWEwNWZkODdmMDJmOWY4Mjg1NzE1ZWJlYjhlZjMxZDdhMTc=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MzczNzEwMWQ2ODNhNTczZmE0YTVkZTMxMjRmMWJkYzM4YjUwMGE2NDk5NDYz
|
14
|
+
MTdiNmNjY2M0ZTliNjUwZDMwNWYzNGVmMTU5YWFiZTkyMDAwNmIwODEwZmFi
|
15
|
+
YTI3ZDUxMTZhYTY2Mzc1OGE2YzlkNGZhYTk1ZjY0YTg0MmM1MDA=
|
data/CHANGELOG.markdown
CHANGED
data/README.md
CHANGED
@@ -68,6 +68,13 @@ parser.single_events
|
|
68
68
|
|
69
69
|
* Recurrence events are not the same as recurring events
|
70
70
|
|
71
|
+
# Known Issues
|
72
|
+
|
73
|
+
* ICal feeds with `,`'s
|
74
|
+
- This gem uses icalendar version `2.3.0`. There is an issue(https://github.com/icalendar/icalendar/issues/121) when importing events with fields that do not escape `,`'s.
|
75
|
+
- The issue is fixed with https://github.com/icalendar/icalendar/commit/9a00cae834f78c265fdccecaf37bf3e77f91416f
|
76
|
+
- Add `gem 'icalendar', :git => 'https://github.com/icalendar/icalendar', :ref => '108b5278a6d4cdc150e49cdcb641e40440c8c278'` to your project's gemfile to fix this issue.
|
77
|
+
|
71
78
|
# TODO
|
72
79
|
|
73
80
|
* Current implementation based on an extraction from another app
|
data/ical_importer.gemspec
CHANGED
@@ -17,7 +17,8 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.version = IcalImporter::VERSION
|
18
18
|
|
19
19
|
gem.add_dependency 'activesupport', ['> 3.0.0', '< 4.0.0']
|
20
|
-
gem.add_dependency '
|
20
|
+
gem.add_dependency 'tzinfo', '~> 0.3.29'
|
21
|
+
gem.add_dependency 'icalendar', '~> 2.3.0'
|
21
22
|
gem.add_dependency 'i18n', '~> 0.6'
|
22
23
|
|
23
24
|
gem.add_development_dependency 'rake'
|
data/lib/ical_importer.rb
CHANGED
data/lib/ical_importer/parser.rb
CHANGED
@@ -17,7 +17,7 @@ module IcalImporter
|
|
17
17
|
if should_parse?
|
18
18
|
@bare_feed.pos = 0
|
19
19
|
begin
|
20
|
-
@feed =
|
20
|
+
@feed = Icalendar.parse @bare_feed
|
21
21
|
rescue Exception => e
|
22
22
|
# I know, I'm dirty, fix this to log to a config'd log
|
23
23
|
end
|
@@ -58,14 +58,14 @@ module IcalImporter
|
|
58
58
|
private
|
59
59
|
|
60
60
|
def get_timezone
|
61
|
-
if feed.present? && feed.first.
|
62
|
-
feed.first.
|
61
|
+
if feed.present? && feed.first.custom_properties["x_wr_timezone"].present?
|
62
|
+
feed.first.custom_properties["x_wr_timezone"].first.value
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
66
|
def get_name
|
67
|
-
if feed.present? && feed.first.
|
68
|
-
feed.first.
|
67
|
+
if feed.present? && feed.first.custom_properties["x_wr_calname"].present?
|
68
|
+
feed.first.custom_properties["x_wr_calname"].first.value
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
@@ -7,7 +7,7 @@ module IcalImporter
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def <<(event)
|
10
|
-
raise ArgumentError, "Must be
|
10
|
+
raise ArgumentError, "Must be an Icalendar Event" unless event.is_a? Icalendar::Event
|
11
11
|
@events_to_build << event
|
12
12
|
end
|
13
13
|
|
@@ -24,10 +24,10 @@ module IcalImporter
|
|
24
24
|
def build_new_local_event(remote_event)
|
25
25
|
remote_event = RemoteEvent.new remote_event
|
26
26
|
LocalEvent.new({
|
27
|
-
:uid => remote_event.uid,
|
28
|
-
:title => remote_event.summary,
|
29
|
-
:description => remote_event.description,
|
30
|
-
:location => remote_event.location
|
27
|
+
:uid => remote_event.uid.to_s,
|
28
|
+
:title => remote_event.summary.to_s,
|
29
|
+
:description => remote_event.description.to_s,
|
30
|
+
:location => remote_event.location.to_s,
|
31
31
|
:start_date_time => remote_event.start_date_time,
|
32
32
|
:end_date_time => remote_event.end_date_time,
|
33
33
|
:date_exclusions => [DateExclusion.new(remote_event.recurrence_id)],
|
@@ -2,12 +2,12 @@ module IcalImporter
|
|
2
2
|
class RemoteEvent
|
3
3
|
attr_accessor :event, :utc
|
4
4
|
alias :utc? :utc
|
5
|
-
delegate :uid, :summary, :location, :
|
5
|
+
delegate :uid, :summary, :location, :description, :rrule, :exdate, :to => :event
|
6
6
|
|
7
7
|
def initialize(event)
|
8
8
|
@event = event
|
9
9
|
begin
|
10
|
-
@utc = @event.dtstart.
|
10
|
+
@utc = @event.dtstart.tz_utc
|
11
11
|
rescue
|
12
12
|
@utc = true
|
13
13
|
end
|
@@ -21,6 +21,10 @@ module IcalImporter
|
|
21
21
|
get_date_time_for :dtend
|
22
22
|
end
|
23
23
|
|
24
|
+
def recurrence_id
|
25
|
+
event.recurrence_id ? event.recurrence_id.to_datetime : nil
|
26
|
+
end
|
27
|
+
|
24
28
|
def all_day_event?
|
25
29
|
begin
|
26
30
|
(Time.parse(end_date_time.to_s) - Time.parse(start_date_time.to_s)) >= 1.day
|
@@ -31,11 +35,11 @@ module IcalImporter
|
|
31
35
|
|
32
36
|
def event_attributes
|
33
37
|
{
|
34
|
-
:uid => uid,
|
35
|
-
:title => summary,
|
38
|
+
:uid => uid.to_s,
|
39
|
+
:title => summary.to_s,
|
36
40
|
:utc => utc?,
|
37
|
-
:description => description,
|
38
|
-
:location => location
|
41
|
+
:description => description.to_s,
|
42
|
+
:location => location.to_s,
|
39
43
|
:start_date_time => start_date_time,
|
40
44
|
:end_date_time => end_date_time,
|
41
45
|
:all_day_event => all_day_event?
|
@@ -48,8 +52,8 @@ module IcalImporter
|
|
48
52
|
event_method = event_method.to_sym
|
49
53
|
raise ArgumentError, "Should be dtend or dtstart" unless [:dtstart, :dtend].include? event_method
|
50
54
|
event_time = event.send event_method
|
51
|
-
if event_time.
|
52
|
-
(event_time.
|
55
|
+
if event_time.respond_to?(:tz_utc)
|
56
|
+
(event_time.tz_utc) ? event_time.utc : event_time.to_datetime
|
53
57
|
else
|
54
58
|
begin
|
55
59
|
event_time.to_datetime
|
@@ -12,8 +12,8 @@ module IcalImporter
|
|
12
12
|
def build
|
13
13
|
# handle recuring events
|
14
14
|
@local_event.tap do |le|
|
15
|
-
if @event.
|
16
|
-
@rrule = @event.
|
15
|
+
if @event.rrule.present?
|
16
|
+
@rrule = @event.rrule.first # only support recurrence on one schedule
|
17
17
|
# set out new event's basic rucurring properties
|
18
18
|
le.attributes = recurrence_attributes
|
19
19
|
|
@@ -49,27 +49,28 @@ module IcalImporter
|
|
49
49
|
|
50
50
|
def recurrence_attributes
|
51
51
|
{
|
52
|
-
:recur_interval => recur_map[@rrule.
|
53
|
-
:recur_interval_value => @rrule.interval,
|
52
|
+
:recur_interval => recur_map[@rrule.frequency],
|
53
|
+
:recur_interval_value => @rrule.interval || 1,
|
54
54
|
:recur_end_date => @rrule.until.try(:to_datetime)
|
55
55
|
}
|
56
56
|
end
|
57
57
|
|
58
58
|
def set_date_exclusion
|
59
59
|
# set any date exclusions
|
60
|
-
@local_event.date_exclusions = @event.exdate.flatten.map{|d| DateExclusion.new(d)}
|
60
|
+
@local_event.date_exclusions = @event.exdate.flatten.map{|d| DateExclusion.new(d.to_datetime)}
|
61
61
|
end
|
62
62
|
|
63
63
|
def frequency_set
|
64
|
-
# if
|
64
|
+
# if bounded is an integer that's googles "recur X times"
|
65
65
|
# if that's the case we try to figure out the date it should be by
|
66
|
-
# multiplying
|
67
|
-
|
66
|
+
# multiplying this "X" times by the frequency that the event recurrs
|
67
|
+
interval = @rrule.interval || 1
|
68
|
+
case @rrule.frequency
|
68
69
|
when "DAILY"
|
69
|
-
@local_event.recur_end_date = @local_event.start_date_time + (@rrule.
|
70
|
+
@local_event.recur_end_date = @local_event.start_date_time + (@rrule.count * interval - 1).days if @rrule.count.is_a? Fixnum # convert X times to a date
|
70
71
|
when "WEEKLY"
|
71
|
-
if @rrule.
|
72
|
-
remote_days = @rrule.
|
72
|
+
if @rrule.value_ical.include?("BYDAY=")
|
73
|
+
remote_days = @rrule.value_ical.split("BYDAY=").last.split(";WKST=").first.split(',')
|
73
74
|
day_map.each do |abbr, day|
|
74
75
|
@local_event.send "recur_week_#{day}=", remote_days.include?(abbr)
|
75
76
|
end
|
@@ -80,12 +81,12 @@ module IcalImporter
|
|
80
81
|
end
|
81
82
|
end
|
82
83
|
# recurrence X times is probably broken - we can select multiple times in a week
|
83
|
-
@local_event.recur_end_date = @local_event.start_date_time + ((@rrule.
|
84
|
+
@local_event.recur_end_date = @local_event.start_date_time + ((@rrule.count * interval - 1) / remote_days.length).weeks if @rrule.count.is_a? Fixnum
|
84
85
|
when "MONTHLY"
|
85
|
-
@local_event.recur_month_repeat_by = (@rrule.
|
86
|
-
@local_event.recur_end_date = @local_event.start_date_time + (@rrule.
|
86
|
+
@local_event.recur_month_repeat_by = (@rrule.value_ical =~ /BYDAY/) ? "day_of_week" : "day_of_month"
|
87
|
+
@local_event.recur_end_date = @local_event.start_date_time + (@rrule.count * interval - 1).months if @rrule.count.is_a? Fixnum # convert X times to a date
|
87
88
|
when "YEARLY"
|
88
|
-
@local_event.recur_end_date = @local_event.start_date_time + (@rrule.
|
89
|
+
@local_event.recur_end_date = @local_event.start_date_time + (@rrule.count * interval - 1).years if @rrule.count.is_a? Fixnum # convert X times to a date
|
89
90
|
end
|
90
91
|
end
|
91
92
|
|
@@ -13,7 +13,7 @@ module IcalImporter
|
|
13
13
|
describe '#initialize' do
|
14
14
|
it "parses with rical" do
|
15
15
|
Parser.any_instance.stub(:open_ical).and_return bare_stuff
|
16
|
-
|
16
|
+
Icalendar.should_receive(:parse).with bare_stuff
|
17
17
|
Parser.new(url)
|
18
18
|
end
|
19
19
|
|
@@ -102,7 +102,7 @@ module IcalImporter
|
|
102
102
|
it "finds the feed's timezone out of the x properties" do
|
103
103
|
@value = stub
|
104
104
|
@value.should_receive(:value)
|
105
|
-
subject.stub :feed => [stub(
|
105
|
+
subject.stub :feed => [stub(custom_properties: { "x_wr_timezone" => [@value] })]
|
106
106
|
subject.send(:get_timezone)
|
107
107
|
end
|
108
108
|
|
@@ -111,7 +111,7 @@ module IcalImporter
|
|
111
111
|
end
|
112
112
|
|
113
113
|
it "returns nil if no timezone x property exists" do
|
114
|
-
subject.stub :feed => [stub(
|
114
|
+
subject.stub :feed => [stub(custom_properties: { "x_wr_derpherp" => [@value] })]
|
115
115
|
subject.send(:get_timezone).should be_nil
|
116
116
|
end
|
117
117
|
end
|
@@ -120,7 +120,7 @@ module IcalImporter
|
|
120
120
|
it "finds the feed's name out of the x properties" do
|
121
121
|
@value = stub
|
122
122
|
@value.should_receive(:value)
|
123
|
-
subject.stub :feed => [stub(
|
123
|
+
subject.stub :feed => [stub(custom_properties: { "x_wr_calname" => [@value] })]
|
124
124
|
subject.send(:get_name)
|
125
125
|
end
|
126
126
|
|
@@ -129,7 +129,7 @@ module IcalImporter
|
|
129
129
|
end
|
130
130
|
|
131
131
|
it "returns nil if no name x property exists" do
|
132
|
-
subject.stub :feed => [stub(
|
132
|
+
subject.stub :feed => [stub(custom_properties: { "x_wr_derpherp" => [@value] })]
|
133
133
|
subject.send(:get_name).should be_nil
|
134
134
|
end
|
135
135
|
end
|
@@ -17,7 +17,7 @@ module IcalImporter
|
|
17
17
|
|
18
18
|
it "fails with incorrect event type" do
|
19
19
|
new_event = stub(:is_a? => false)
|
20
|
-
expect { subject.<<(new_event) }.to raise_error(ArgumentError, "Must be
|
20
|
+
expect { subject.<<(new_event) }.to raise_error(ArgumentError, "Must be an Icalendar Event")
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -34,13 +34,13 @@ module IcalImporter
|
|
34
34
|
end
|
35
35
|
|
36
36
|
describe "#build_new_local_event" do
|
37
|
-
let(:remote_event) { stub :summary => "birthdayy",
|
38
|
-
:uid => 1,
|
39
|
-
:description => "do stuff",
|
40
|
-
:location => "here",
|
37
|
+
let(:remote_event) { stub :summary => stub(:to_s => "birthdayy"),
|
38
|
+
:uid => stub(:to_s => 1),
|
39
|
+
:description => stub(:to_s => "do stuff"),
|
40
|
+
:location => stub(:to_s => "here"),
|
41
41
|
:start_date_time => "today",
|
42
42
|
:end_date_time => "tomorrow",
|
43
|
-
:recurrence_id =>
|
43
|
+
:recurrence_id => "20120715".to_datetime
|
44
44
|
}
|
45
45
|
it "creates a new event" do
|
46
46
|
RemoteEvent.stub(:new => remote_event)
|
@@ -2,10 +2,9 @@ require 'spec_helper'
|
|
2
2
|
module IcalImporter
|
3
3
|
describe RemoteEvent do
|
4
4
|
subject { RemoteEvent.new(event) }
|
5
|
-
let(:event) { stub :dtstart => stub(:
|
5
|
+
let(:event) { stub :dtstart => stub(:tz_utc => true) }
|
6
6
|
it { should respond_to :description }
|
7
|
-
it { should respond_to :
|
8
|
-
it { should respond_to :rrule_property }
|
7
|
+
it { should respond_to :rrule }
|
9
8
|
it { should respond_to :exdate }
|
10
9
|
describe "#initialize" do
|
11
10
|
describe "dtstart tzid nil" do
|
@@ -16,7 +15,7 @@ module IcalImporter
|
|
16
15
|
end
|
17
16
|
|
18
17
|
describe "dtstart tzid == :floating" do
|
19
|
-
let(:event) { stub :dtstart => stub(:
|
18
|
+
let(:event) { stub :dtstart => stub(:tz_utc => false) }
|
20
19
|
it "sets utc and event" do
|
21
20
|
subject.event.should == event
|
22
21
|
subject.utc?.should == false
|
@@ -42,7 +41,8 @@ module IcalImporter
|
|
42
41
|
describe "without a floating tzid" do
|
43
42
|
let(:event) { stub :dtstart => stub(
|
44
43
|
:is_a? => true,
|
45
|
-
:
|
44
|
+
:utc? => true,
|
45
|
+
:tz_utc => true,
|
46
46
|
:time => "20120715".to_datetime,
|
47
47
|
:utc => "20120715".to_datetime.utc) }
|
48
48
|
it "uses the utc time of the datetime" do
|
@@ -52,13 +52,13 @@ module IcalImporter
|
|
52
52
|
end
|
53
53
|
|
54
54
|
describe "#event_attributes" do
|
55
|
-
let(:event) {
|
55
|
+
let(:event) { Icalendar.parse(sample_ics).first.events.first }
|
56
56
|
it "fills in some attributes" do
|
57
57
|
subject.event_attributes.should == {
|
58
58
|
:uid => "1629F7A5-5A69-43CB-899E-4CE9BD5F069F",
|
59
59
|
:title => "Recurring Event",
|
60
60
|
:utc => true,
|
61
|
-
:description =>
|
61
|
+
:description => "",
|
62
62
|
:location => "",
|
63
63
|
:start_date_time => "Wed, 14 Sep 2016 00:00:00 +0000".to_datetime,
|
64
64
|
:end_date_time => "Thu, 15 Sep 2016 00:00:00 +0000".to_datetime,
|
@@ -2,13 +2,13 @@ require 'spec_helper'
|
|
2
2
|
module IcalImporter
|
3
3
|
describe SingleEventBuilder do
|
4
4
|
subject { SingleEventBuilder.new(event) }
|
5
|
-
let(:event) {
|
5
|
+
let(:event) { Icalendar.parse(sample_ics('mn_twins')).first.events.first }
|
6
6
|
describe "#build" do
|
7
7
|
it "builds an event" do
|
8
8
|
new_event = subject.build
|
9
9
|
new_event.should be_a LocalEvent
|
10
10
|
new_event.title.should == "Spring Training: Tampa Bay 3 - Minnesota 7"
|
11
|
-
new_event.utc?.should ==
|
11
|
+
new_event.utc?.should == false
|
12
12
|
new_event.description.should == "Spring Training: Tampa Bay 3 - Minnesota 7\n\nClick below for game previews, wraps and boxscores plus video, tickets, stats, gameday and more!\nhttp://mlb.mlb.com/mlb/gameday/index.jsp?gid=2012_03_03_tbamlb_minmlb_1\n\nWatch or Listen with MLB.TV: http://mlb.mlb.com/schedule/index.jsp?c_id=min&m=03&y=2012\n\nLocal Radio: 1500 ESPN"
|
13
13
|
new_event.location.should == "Lee County Sports Complex, Hammond County Stadium, Lee County"
|
14
14
|
new_event.all_day_event.should == false
|
data/spec/support/mn_twins.ics
CHANGED
@@ -29,9 +29,9 @@ DTEND;TZID=America/New_York:20120303T160500
|
|
29
29
|
DTSTAMP:20120806T221604Z
|
30
30
|
UID:332106@mlb.com
|
31
31
|
CREATED:20111130T212813Z
|
32
|
-
DESCRIPTION:Spring Training: Tampa Bay 3 - Minnesota 7\n\nClick below for game previews
|
32
|
+
DESCRIPTION:Spring Training: Tampa Bay 3 - Minnesota 7\n\nClick below for game previews\, wraps and boxscores plus video\, tickets\, stats\, gameday and more!\nhttp://mlb.mlb.com/mlb/gameday/index.jsp?gid=2012_03_03_tbamlb_minmlb_1\n\nWatch or Listen with MLB.TV: http://mlb.mlb.com/schedule/index.jsp?c_id=min&m=03&y=2012\n\nLocal Radio: 1500 ESPN
|
33
33
|
LAST-MODIFIED:20120307T194443Z
|
34
|
-
LOCATION:Lee County Sports Complex
|
34
|
+
LOCATION:Lee County Sports Complex\, Hammond County Stadium\, Lee County
|
35
35
|
SUMMARY:Spring Training: Tampa Bay 3 - Minnesota 7
|
36
36
|
TRANSP:TRANSPARENT
|
37
37
|
SEQUENCE:2
|
@@ -43,9 +43,9 @@ DTEND;TZID=America/New_York:20120305T220500
|
|
43
43
|
DTSTAMP:20120806T221604Z
|
44
44
|
UID:332124@mlb.com
|
45
45
|
CREATED:20111130T212816Z
|
46
|
-
DESCRIPTION:Spring Training: Boston 10 - Minnesota 2\n\nClick below for game previews
|
46
|
+
DESCRIPTION:Spring Training: Boston 10 - Minnesota 2\n\nClick below for game previews\, wraps and boxscores plus video\, tickets\, stats\, gameday and more!\nhttp://mlb.mlb.com/mlb/gameday/index.jsp?gid=2012_03_05_bosmlb_minmlb_1\n\nWatch or Listen with MLB.TV: http://mlb.mlb.com/schedule/index.jsp?c_id=min&m=03&y=2012\n\nLocal TV: MLBN (delay)\, FS-N+\, MLB.TV\nLocal Radio: 1500 ESPN
|
47
47
|
LAST-MODIFIED:20120307T200743Z
|
48
|
-
LOCATION:Lee County Sports Complex
|
48
|
+
LOCATION:Lee County Sports Complex\, Hammond County Stadium\, Lee County
|
49
49
|
SUMMARY:Spring Training: Boston 10 - Minnesota 2
|
50
50
|
TRANSP:TRANSPARENT
|
51
51
|
SEQUENCE:2
|
@@ -1409,4 +1409,4 @@ TRANSP:TRANSPARENT
|
|
1409
1409
|
SEQUENCE:0
|
1410
1410
|
URL:http://mlb.mlb.com/mlb/gameday/index.jsp?gid=2012_09_30_detmlb_minmlb_1
|
1411
1411
|
END:VEVENT
|
1412
|
-
END:VCALENDAR
|
1412
|
+
END:VCALENDAR
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ical_importer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jon Phenow
|
@@ -31,19 +31,33 @@ dependencies:
|
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 4.0.0
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
|
-
name:
|
34
|
+
name: tzinfo
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
37
|
- - ~>
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version:
|
39
|
+
version: 0.3.29
|
40
40
|
type: :runtime
|
41
41
|
prerelease: false
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
44
|
- - ~>
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
46
|
+
version: 0.3.29
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: icalendar
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 2.3.0
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ~>
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 2.3.0
|
47
61
|
- !ruby/object:Gem::Dependency
|
48
62
|
name: i18n
|
49
63
|
requirement: !ruby/object:Gem::Requirement
|