jsoncop 0.2.0 → 0.3.1

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: 6d68292e78bb6f41e6f716a177702537eb7af012
4
- data.tar.gz: 7d9f747880b9f1016543e68427a65efe25530066
3
+ metadata.gz: 4661699526bb0f0bc7066755875aa0cdf87f3005
4
+ data.tar.gz: 4185ad9d96938c2dd3ac93e91767f2faca424c53
5
5
  SHA512:
6
- metadata.gz: 455670249f7eb076763eb09268602d7658ab4446bd6e70a4c164aa8e4b29c00c9b65a8d4910883bd0cc4f7c39b14a0b76b6b32845cb59374a76e52cfc5167024
7
- data.tar.gz: 05b4142380220cdd1cc5e645225ab6482901508b2b1b0bf4258dbc996f0fd1b6fa1e7d184f0e776a3fe87ddb48aa7b75786bc0adcb13ea02fd407bd0c7bb42a6
6
+ metadata.gz: 18d32c6cb4a60cfac861e91a5a40dc2c6120b2884ddaf1eaa623bc223718a77724b93b9e4d6adbef8b984a152218c49bb5efa53b6892d333a738e52586d6402f
7
+ data.tar.gz: bfa0bd079a97d783ade970ec58f074b5edf16b74567227aa825c61593829e48ec4aa395b0fb0387ab1caf79e358e75eae226d990d9ef3fe7f6e374da2b27a01c
data/README.md CHANGED
@@ -19,7 +19,14 @@ let person = Person.parse(json: json)
19
19
 
20
20
  ## Usage
21
21
 
22
- Define a model with and **add `//@jsoncop` just before model definition line**:
22
+ 1. Install JSONCop with `sudo gem install jsoncop --verbose` below in system ruby version
23
+ 2. Run `cop install` in project root folder
24
+ 3. **Add `//@jsoncop` just before model definition line**
25
+
26
+ ```shell
27
+ $ sudo gem install jsoncop --verbose
28
+ ~/project $ cop install
29
+ ```
23
30
 
24
31
  ```swift
25
32
  //@jsoncop
@@ -28,21 +35,73 @@ struct Person {
28
35
  let name: String
29
36
  }
30
37
  ```
31
- Run `cop install` in project root folder.
32
-
33
- ```shell
34
- $ cop install
35
- ```
36
38
 
37
- This will generate several parsing methods in current file without affecting other part of your codes:
39
+ Then, each time build action is triggered, JSONCop would generate several parsing methods in swift files.
38
40
 
39
41
  ![](./images/jsoncop-demo.png)
40
42
 
41
43
  All the code between `// MARK: - JSONCop-Start` and `// MARK: - JSONCop-End` and will be replaced when re-run `cop install` in current project folder. Other codes will remain unchanged. Please don't write any codes in this area.
42
44
 
45
+ ```ruby
46
+ extension Person {
47
+ static func parse(json: Any) -> Person? {
48
+ guard let json = json as? [String: Any] else { return nil }
49
+ guard let id = json["id"] as? Int,
50
+ let name = json["name"] as? String,
51
+ let projects = (json["projects"] as? [[String: Any]]).flatMap(projectsJSONTransformer) else { return nil }
52
+ return Person(id: id, name: name, projects: projects)
53
+ }
54
+ static func parses(jsons: Any) -> [Person] {
55
+ guard let jsons = jsons as? [[String: Any]] else { return [] }
56
+ return jsons.flatMap(parse)
57
+ }
58
+ }
59
+ ```
60
+
61
+ Checkout [JSONCopExample](./JSONCopExample) for more information.
62
+
63
+ ## Customize
64
+
65
+ + JSON key to attribute customization
66
+
67
+ ```swift
68
+ struct Person {
69
+ let id: Int
70
+ let name: String
71
+
72
+ static func JSONKeyPathByPropertyKey() -> [String: String] {
73
+ return ["nickname": "name"]
74
+ }
75
+ }
76
+ ```
77
+
78
+ + Value transformer customization
79
+
80
+ ```swift
81
+ struct Person {
82
+ let id: Int
83
+ let name: String
84
+ let gender: Gender
85
+ let projects: [Project]
86
+
87
+ enum Gender: Int {
88
+ case male = 0
89
+ case female = 1
90
+ }
91
+
92
+ static func genderJSONTransformer(value: Int) -> Gender? {
93
+ return Gender(rawValue: value)
94
+ }
95
+
96
+ static func projectsJSONTransformer(value: [[String: Any]]) -> [Project] {
97
+ return value.flatMap(Project.parse)
98
+ }
99
+ }
100
+ ```
101
+
43
102
  ## Installation
44
103
 
45
- ```
104
+ ```shell
46
105
  sudo gem install jsoncop --verbose
47
106
  ```
48
107
 
@@ -0,0 +1,36 @@
1
+ module JSONCop
2
+ class Command
3
+ class Generate < Command
4
+
5
+ require "jsoncop/analyzer"
6
+ require "jsoncop/generator"
7
+
8
+ self.summary = ""
9
+ self.description = <<-DESC
10
+ DESC
11
+
12
+ def initialize(argv)
13
+ super
14
+ end
15
+
16
+ def run
17
+ Dir.glob("**/*.swift").each do |file|
18
+ analyzer = create_analyzer_for_file file
19
+ model = analyzer.analyze!
20
+ next unless model
21
+
22
+ generator = create_generator_for_file file, model
23
+ generator.generate!
24
+ end
25
+ end
26
+
27
+ def create_analyzer_for_file(file_path)
28
+ Analyzer.new file_path
29
+ end
30
+
31
+ def create_generator_for_file(file_path, model)
32
+ Generator.new file_path, model
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,9 +1,12 @@
1
+ require "xcodeproj"
2
+
1
3
  module JSONCop
2
4
  class Command
3
5
  class Install < Command
4
6
 
5
- require "jsoncop/analyzer"
6
- require "jsoncop/generator"
7
+ BUILD_PHASE_PREFIX = "[JC] ".freeze
8
+
9
+ JSONCOP_INSTALL_PHASE_NAME = "JSONCop Install Script".freeze
7
10
 
8
11
  self.summary = ""
9
12
  self.description = <<-DESC
@@ -14,22 +17,31 @@ module JSONCop
14
17
  end
15
18
 
16
19
  def run
17
- Dir.glob("**/*.swift").each do |file|
18
- analyzer = create_analyzer_for_file file
19
- model = analyzer.analyze!
20
- next unless model
21
-
22
- generator = create_generator_for_file file, model
23
- generator.generate!
24
- end
20
+ project = Xcodeproj::Project.open(Dir.glob("*.xcodeproj").first)
21
+ native_target = project.targets.first
22
+ phase = create_or_update_build_phase(native_target, JSONCOP_INSTALL_PHASE_NAME)
23
+ phase.shell_path = "/usr/bin/ruby"
24
+ phase.shell_script = install_shell_script
25
+ project.save
25
26
  end
26
27
 
27
- def create_analyzer_for_file(file_path)
28
- Analyzer.new file_path
28
+ def create_or_update_build_phase(target, phase_name, phase_class = Xcodeproj::Project::Object::PBXShellScriptBuildPhase)
29
+ prefixed_phase_name = BUILD_PHASE_PREFIX + phase_name
30
+ build_phases = target.build_phases.grep(phase_class)
31
+ build_phases.find { |phase| phase.name && phase.name.end_with?(phase_name) }.tap { |p| p.name = prefixed_phase_name if p } ||
32
+ target.project.new(phase_class).tap do |phase|
33
+ phase.name = prefixed_phase_name
34
+ phase.show_env_vars_in_log = '0'
35
+ target.build_phases.unshift phase
36
+ end
29
37
  end
30
38
 
31
- def create_generator_for_file(file_path, model)
32
- Generator.new file_path, model
39
+ def install_shell_script
40
+ <<-SCRIPT#!/usr/bin/env ruby
41
+ require 'jsoncop'
42
+ Encoding.default_external = Encoding::UTF_8
43
+ JSONCop::Command.run(["generate"])
44
+ SCRIPT
33
45
  end
34
46
  end
35
47
  end
@@ -4,6 +4,7 @@ require 'claide'
4
4
  module JSONCop
5
5
  class Command < CLAide::Command
6
6
  require "jsoncop/command/install"
7
+ require "jsoncop/command/generate"
7
8
  require "jsoncop/command/uninstall"
8
9
 
9
10
  self.abstract_command = true
@@ -1,3 +1,3 @@
1
1
  module JSONCop
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsoncop
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Draveness
@@ -14,96 +14,116 @@ dependencies:
14
14
  name: claide
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: 1.0.0
20
- - - "<"
20
+ - - <
21
21
  - !ruby/object:Gem::Version
22
22
  version: '2.0'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
- - - ">="
27
+ - - '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: 1.0.0
30
- - - "<"
30
+ - - <
31
31
  - !ruby/object:Gem::Version
32
32
  version: '2.0'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: colored
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - "~>"
37
+ - - ~>
38
38
  - !ruby/object:Gem::Version
39
39
  version: '1.2'
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
46
  version: '1.2'
47
+ - !ruby/object:Gem::Dependency
48
+ name: xcodeproj
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - '>='
52
+ - !ruby/object:Gem::Version
53
+ version: 1.2.0
54
+ - - <
55
+ - !ruby/object:Gem::Version
56
+ version: '2.0'
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - '>='
62
+ - !ruby/object:Gem::Version
63
+ version: 1.2.0
64
+ - - <
65
+ - !ruby/object:Gem::Version
66
+ version: '2.0'
47
67
  - !ruby/object:Gem::Dependency
48
68
  name: activesupport
49
69
  requirement: !ruby/object:Gem::Requirement
50
70
  requirements:
51
- - - ">="
71
+ - - '>='
52
72
  - !ruby/object:Gem::Version
53
- version: 4.2.6
54
- - - "<"
73
+ version: '3'
74
+ - - <
55
75
  - !ruby/object:Gem::Version
56
76
  version: '5.0'
57
77
  type: :runtime
58
78
  prerelease: false
59
79
  version_requirements: !ruby/object:Gem::Requirement
60
80
  requirements:
61
- - - ">="
81
+ - - '>='
62
82
  - !ruby/object:Gem::Version
63
- version: 4.2.6
64
- - - "<"
83
+ version: '3'
84
+ - - <
65
85
  - !ruby/object:Gem::Version
66
86
  version: '5.0'
67
87
  - !ruby/object:Gem::Dependency
68
88
  name: bundler
69
89
  requirement: !ruby/object:Gem::Requirement
70
90
  requirements:
71
- - - "~>"
91
+ - - ~>
72
92
  - !ruby/object:Gem::Version
73
93
  version: '1.12'
74
94
  type: :development
75
95
  prerelease: false
76
96
  version_requirements: !ruby/object:Gem::Requirement
77
97
  requirements:
78
- - - "~>"
98
+ - - ~>
79
99
  - !ruby/object:Gem::Version
80
100
  version: '1.12'
81
101
  - !ruby/object:Gem::Dependency
82
102
  name: rake
83
103
  requirement: !ruby/object:Gem::Requirement
84
104
  requirements:
85
- - - "~>"
105
+ - - ~>
86
106
  - !ruby/object:Gem::Version
87
107
  version: '10.0'
88
108
  type: :development
89
109
  prerelease: false
90
110
  version_requirements: !ruby/object:Gem::Requirement
91
111
  requirements:
92
- - - "~>"
112
+ - - ~>
93
113
  - !ruby/object:Gem::Version
94
114
  version: '10.0'
95
115
  - !ruby/object:Gem::Dependency
96
116
  name: rspec
97
117
  requirement: !ruby/object:Gem::Requirement
98
118
  requirements:
99
- - - "~>"
119
+ - - ~>
100
120
  - !ruby/object:Gem::Version
101
121
  version: '3.0'
102
122
  type: :development
103
123
  prerelease: false
104
124
  version_requirements: !ruby/object:Gem::Requirement
105
125
  requirements:
106
- - - "~>"
126
+ - - ~>
107
127
  - !ruby/object:Gem::Version
108
128
  version: '3.0'
109
129
  description: A light-weight JSON to model method generator.
@@ -114,20 +134,21 @@ executables:
114
134
  extensions: []
115
135
  extra_rdoc_files: []
116
136
  files:
117
- - LICENSE
118
- - README.md
119
- - bin/cop
120
- - lib/jsoncop.rb
121
137
  - lib/jsoncop/analyzer.rb
122
- - lib/jsoncop/command.rb
138
+ - lib/jsoncop/command/generate.rb
123
139
  - lib/jsoncop/command/install.rb
124
140
  - lib/jsoncop/command/uninstall.rb
141
+ - lib/jsoncop/command.rb
125
142
  - lib/jsoncop/generator.rb
126
143
  - lib/jsoncop/helper.rb
127
144
  - lib/jsoncop/model/attribute.rb
128
145
  - lib/jsoncop/model/model.rb
129
146
  - lib/jsoncop/model/transformer.rb
130
147
  - lib/jsoncop/version.rb
148
+ - lib/jsoncop.rb
149
+ - bin/cop
150
+ - README.md
151
+ - LICENSE
131
152
  homepage: https://github.com/Draveness/JSONCop
132
153
  licenses:
133
154
  - MIT
@@ -138,17 +159,17 @@ require_paths:
138
159
  - lib
139
160
  required_ruby_version: !ruby/object:Gem::Requirement
140
161
  requirements:
141
- - - ">="
162
+ - - '>='
142
163
  - !ruby/object:Gem::Version
143
164
  version: '0'
144
165
  required_rubygems_version: !ruby/object:Gem::Requirement
145
166
  requirements:
146
- - - ">="
167
+ - - '>='
147
168
  - !ruby/object:Gem::Version
148
169
  version: '0'
149
170
  requirements: []
150
171
  rubyforge_project:
151
- rubygems_version: 2.6.6
172
+ rubygems_version: 2.0.14.1
152
173
  signing_key:
153
174
  specification_version: 4
154
175
  summary: A JSON to model method generator.