ics 0.1 → 0.2

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.
data/.rvmrc CHANGED
@@ -1 +1 @@
1
- rvm use 1.9.2-p0@ics
1
+ rvm --create 1.9.3-p327@ics
data/Gemfile.lock CHANGED
@@ -6,19 +6,19 @@ PATH
6
6
  GEM
7
7
  remote: http://rubygems.org/
8
8
  specs:
9
- ZenTest (4.4.2)
9
+ ZenTest (4.8.3)
10
10
  autotest (4.4.6)
11
11
  ZenTest (>= 4.4.1)
12
- awesome_print (0.3.1)
13
- diff-lcs (1.1.2)
14
- rspec (2.3.0)
15
- rspec-core (~> 2.3.0)
16
- rspec-expectations (~> 2.3.0)
17
- rspec-mocks (~> 2.3.0)
18
- rspec-core (2.3.1)
19
- rspec-expectations (2.3.0)
20
- diff-lcs (~> 1.1.2)
21
- rspec-mocks (2.3.0)
12
+ awesome_print (1.1.0)
13
+ diff-lcs (1.1.3)
14
+ rspec (2.12.0)
15
+ rspec-core (~> 2.12.0)
16
+ rspec-expectations (~> 2.12.0)
17
+ rspec-mocks (~> 2.12.0)
18
+ rspec-core (2.12.2)
19
+ rspec-expectations (2.12.1)
20
+ diff-lcs (~> 1.1.3)
21
+ rspec-mocks (2.12.1)
22
22
 
23
23
  PLATFORMS
24
24
  ruby
@@ -27,4 +27,4 @@ DEPENDENCIES
27
27
  autotest
28
28
  awesome_print
29
29
  ics!
30
- rspec (= 2.3.0)
30
+ rspec
data/HISTORY.md ADDED
@@ -0,0 +1,8 @@
1
+ == 0.2 (2013-01-01)
2
+
3
+ * Refactor to use less metaprogramming.
4
+ * Remove type casting.
5
+
6
+ == 0.1 (2012-01-02)
7
+
8
+ First version.
data/README.rdoc CHANGED
@@ -12,51 +12,6 @@ ICS is a library that reads ICS files and parses them into ICS::Event objects.
12
12
  events.map(&:summary)
13
13
  #=> ['Walk dog', 'Solve world hunger, tell noone', ...]
14
14
 
15
- === Longer version
16
-
17
- The ICS::Event class can read in and parse an exported .ics file. For example, from iCal, export a calendar (select calendar, File, Export..., Export...):
18
- ICS::Event.file(File.open('calendar.ics'))
19
- will return an array of events with whatever attributes are in the .ics file for each event. The ICS::Event object will have a method name for each attribute in lower case form.
20
- # calendar.ics
21
- ...
22
- SUMMARY:Grocery shopping
23
- ...
24
-
25
- # ruby environment
26
- event.summary
27
- #=> 'Grocery shopping'
28
-
29
- Here are a list of known attributes:
30
- * TRANSP
31
- * DTEND
32
- * UID
33
- * DTSTAMP
34
- * LOCATION
35
- * DESCRIPTION
36
- * URL
37
- * STATUS
38
- * SEQUENCE
39
- * SUMMARY
40
- * DTSTART
41
- * CREATED
42
- # For the alarm...
43
- * # BEGIN:VALARM (ignored)
44
- * X-WR-ALARMUID
45
- * TRIGGER
46
- * ATTACH
47
- * ACTION
48
- * # END:VALARM (ignored)
49
-
50
- === Data type casting
51
-
52
- By default, each attribute method returns a string literal. For convenience, attribute methods can be easily defined in the ICS::Event class for customized behavior. Currently <tt>ICS::Event#dtstart</tt> is the only one that is defined:
53
- event.dtstart.class
54
- #=> Time
55
-
56
- === More "Railsy"
57
-
58
- <tt>ICS::Event#started_at</tt> is an alias for <tt>ICS::Event#dtstart</tt>. <tt>ICS::Event#started_on</tt> returns a Date object converted from <tt>ICS::Event#dtstart</tt>. More later...
59
-
60
15
  === Metadata
61
16
 
62
17
  Some attributes have some metadata attached to them. For example, sometimes the DTSTART attribute has the time zone:
@@ -69,6 +24,6 @@ As of this version, metadata is ignored.
69
24
 
70
25
  gem install ics
71
26
 
72
- == Ruby
27
+ == TODO
73
28
 
74
- Written in Ruby 1.9.2p0.
29
+ * Multiple alarms?
data/ics.gemspec CHANGED
@@ -20,5 +20,5 @@ Gem::Specification.new do |s|
20
20
 
21
21
  s.add_development_dependency 'autotest'
22
22
  s.add_development_dependency 'awesome_print'
23
- s.add_development_dependency 'rspec', '2.3.0'
23
+ s.add_development_dependency 'rspec', '2.12'
24
24
  end
data/lib/ics/event.rb CHANGED
@@ -4,31 +4,30 @@ module ICS
4
4
 
5
5
  class Event
6
6
 
7
- # Given a hash of attributes, define a method for each key that returns the value.
8
- # Attributes stored in instance variable.
7
+ attr_accessor :action
8
+ attr_accessor :alarmuid
9
+ attr_accessor :attach
10
+ attr_accessor :created
11
+ attr_accessor :description
12
+ attr_accessor :dtend
13
+ attr_accessor :dtstamp
14
+ attr_accessor :dtstart
15
+ attr_accessor :location
16
+ attr_accessor :sequence
17
+ attr_accessor :status
18
+ attr_accessor :summary
19
+ attr_accessor :transp
20
+ attr_accessor :trigger
21
+ attr_accessor :uid
22
+ attr_accessor :url
23
+ attr_accessor :x_wr_alarmuid
24
+
9
25
  def initialize(attributes = {})
10
- @attributes = attributes
11
26
  attributes.each do |key, val|
12
- unless respond_to?(key)
13
- self.class.send :define_method, key do
14
- @attributes[key]
15
- end
16
- end
27
+ send("#{key}=", val)
17
28
  end
18
29
  end
19
30
 
20
- # Return time object.
21
- # Assumes time in UTC.
22
- def dtstart
23
- return nil unless @attributes[:dtstart]
24
- DateTime.parse(@attributes[:dtstart]).to_time.utc
25
- end
26
- alias_method :started_at, :dtstart
27
-
28
- def started_on
29
- dtstart.to_date if dtstart
30
- end
31
-
32
31
  class << self
33
32
 
34
33
  # Given an exported ical file, parse it and create events.
@@ -38,19 +37,26 @@ module ICS
38
37
  line_ending = $/
39
38
  content.split("BEGIN:VEVENT#{line_ending}")[1..-1].map do |data_string|
40
39
  data_string = data_string.split("END:VEVENT#{line_ending}").first
41
- new parse(data_string)
40
+ parse(data_string)
42
41
  end
43
42
  end
44
43
 
44
+ # Parse data and return new Event.
45
45
  def parse(str)
46
- str.split($/).inject({}) do |hash, line|
46
+ attributes = str.split($/).inject({}) do |hash, line|
47
47
  key, value = line.split(':', 2)
48
- next hash if key =~ /^BEGIN/ # Ignore any other book ends.
48
+ next hash if key =~ /^BEGIN$|^END$/ # Ignore any other book ends.
49
49
  value = value.chomp if value
50
- key = key.split(';', 2).first # Ignore extra data other than just the name of the attribute.
50
+ key =
51
+ key.
52
+ split(';', 2).
53
+ first. # Ignore extra data other than just the name of the attribute.
54
+ gsub('-', '_') # underscore.
51
55
  hash[key.downcase.to_sym] = value
52
56
  hash
53
57
  end
58
+
59
+ new(attributes)
54
60
  end
55
61
 
56
62
  end
data/lib/ics/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module ICS
2
- VERSION = "0.1"
2
+ VERSION = "0.2"
3
3
  end
data/spec/event_spec.rb CHANGED
@@ -2,46 +2,22 @@ require 'spec_helper'
2
2
 
3
3
  describe ICS::Event do
4
4
 
5
- it 'parses event data string and generates a hash' do
6
- ICS::Event.parse("NAME:value with spaces\nKEY:val").should == {:name => 'value with spaces', :key => 'val'}
7
- end
8
-
9
- it 'should read a file, parse it, and return an array of events' do
10
- file = file_with_content(<<-END)
11
- BEGIN:VEVENT
12
- INDEX:0
13
- END:VEVENT
14
- BEGIN:VEVENT
15
- INDEX:1
16
- END:VEVENT
17
- END
18
- events = ICS::Event.file(file)
19
- events.size.should == 2
20
- events.each_with_index do |event, i|
21
- event.index.should == i.to_s
22
- end
23
- end
24
-
25
- it 'should be initialized with a hash of attributes and have keys defined as methods returning values' do
26
- event = ICS::Event.new(:attribute => '1')
27
- event.should respond_to(:attribute)
28
- event.attribute.should == '1'
29
- end
5
+ it 'parses event data string and returns new Event' do
6
+ event = ICS::Event.parse("SUMMARY:value with spaces\nSTATUS:val")
30
7
 
31
- it '#dtstart should return time object' do
32
- time = Time.now.utc
33
- event = ICS::Event.new(:dtstart => time.strftime('%Y%m%dT%H%M%SZ'))
34
- event.dtstart.to_i.should == time.to_i
8
+ event.summary.should == 'value with spaces'
9
+ event.status.should == 'val'
35
10
  end
36
11
 
37
- it 'should handle real file' do
38
- events = ICS::Event.file(File.open('spec/example_events.ics'))
12
+ it 'should read a file, parse it, and return an array of events' do
13
+ events = ICS::Event.file(File.open('spec/support/fixtures/example_events.ics'))
39
14
  events.size.should == 2
40
15
  end
41
16
 
42
17
  it 'should parse attributes ignoring extra data like time zone for DTSTART' do
43
- data = 'DTSTART;TZID=asdfasdf:1'
44
- ICS::Event.parse(data).should == {:dtstart => '1'}
18
+ data = 'DTSTART;TZID=asdfasdf:20100331T200000'
19
+ event = ICS::Event.parse(data)
20
+ event.dtstart.should == '20100331T200000'
45
21
  end
46
22
 
47
23
  end
metadata CHANGED
@@ -1,77 +1,77 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: ics
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 1
8
- version: "0.1"
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.2'
5
+ prerelease:
9
6
  platform: ruby
10
- authors:
7
+ authors:
11
8
  - Jared Ning
12
9
  autorequire:
13
10
  bindir: bin
14
11
  cert_chain: []
15
-
16
- date: 2011-01-02 00:00:00 -05:00
17
- default_executable:
18
- dependencies:
19
- - !ruby/object:Gem::Dependency
12
+ date: 2013-01-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
20
15
  name: autotest
21
- prerelease: false
22
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
23
17
  none: false
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 0
29
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
30
22
  type: :development
31
- version_requirements: *id001
32
- - !ruby/object:Gem::Dependency
33
- name: awesome_print
34
23
  prerelease: false
35
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: awesome_print
32
+ requirement: !ruby/object:Gem::Requirement
36
33
  none: false
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- segments:
41
- - 0
42
- version: "0"
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
43
38
  type: :development
44
- version_requirements: *id002
45
- - !ruby/object:Gem::Dependency
46
- name: rspec
47
39
  prerelease: false
48
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
49
  none: false
50
- requirements:
51
- - - "="
52
- - !ruby/object:Gem::Version
53
- segments:
54
- - 2
55
- - 3
56
- - 0
57
- version: 2.3.0
50
+ requirements:
51
+ - - '='
52
+ - !ruby/object:Gem::Version
53
+ version: '2.12'
58
54
  type: :development
59
- version_requirements: *id003
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: '2.12'
60
62
  description: Parse exported .ics files into Event objects.
61
- email:
63
+ email:
62
64
  - jared@redningja.com
63
65
  executables: []
64
-
65
66
  extensions: []
66
-
67
67
  extra_rdoc_files: []
68
-
69
- files:
68
+ files:
70
69
  - .gitignore
71
70
  - .rspec
72
71
  - .rvmrc
73
72
  - Gemfile
74
73
  - Gemfile.lock
74
+ - HISTORY.md
75
75
  - README.rdoc
76
76
  - Rakefile
77
77
  - ics.gemspec
@@ -79,43 +79,35 @@ files:
79
79
  - lib/ics/event.rb
80
80
  - lib/ics/version.rb
81
81
  - spec/event_spec.rb
82
- - spec/example_events.ics
83
82
  - spec/spec_helper.rb
83
+ - spec/support/fixtures/example_events.ics
84
84
  - spec/support/macros.rb
85
- has_rdoc: true
86
85
  homepage:
87
86
  licenses: []
88
-
89
87
  post_install_message:
90
88
  rdoc_options: []
91
-
92
- require_paths:
89
+ require_paths:
93
90
  - lib
94
- required_ruby_version: !ruby/object:Gem::Requirement
91
+ required_ruby_version: !ruby/object:Gem::Requirement
95
92
  none: false
96
- requirements:
97
- - - ">="
98
- - !ruby/object:Gem::Version
99
- segments:
100
- - 0
101
- version: "0"
102
- required_rubygems_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
98
  none: false
104
- requirements:
105
- - - ">="
106
- - !ruby/object:Gem::Version
107
- segments:
108
- - 0
109
- version: "0"
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
110
103
  requirements: []
111
-
112
104
  rubyforge_project: ics
113
- rubygems_version: 1.3.7
105
+ rubygems_version: 1.8.24
114
106
  signing_key:
115
107
  specification_version: 3
116
108
  summary: Read .ics files
117
- test_files:
109
+ test_files:
118
110
  - spec/event_spec.rb
119
- - spec/example_events.ics
120
111
  - spec/spec_helper.rb
112
+ - spec/support/fixtures/example_events.ics
121
113
  - spec/support/macros.rb